|
@@ -78,7 +78,11 @@ def _parse(self):
|
|
self.docs.append(cur_doc)
|
|
self.docs.append(cur_doc)
|
|
continue
|
|
continue
|
|
|
|
|
|
- expr = self.get_expr(False)
|
|
|
|
|
|
+ expr = self.get_expr()
|
|
|
|
+ if not isinstance(expr, dict):
|
|
|
|
+ raise QAPISemError(
|
|
|
|
+ info, "top-level expression must be an object")
|
|
|
|
+
|
|
if 'include' in expr:
|
|
if 'include' in expr:
|
|
self.reject_expr_doc(cur_doc)
|
|
self.reject_expr_doc(cur_doc)
|
|
if len(expr) != 1:
|
|
if len(expr) != 1:
|
|
@@ -251,7 +255,7 @@ def get_members(self):
|
|
self.accept()
|
|
self.accept()
|
|
if key in expr:
|
|
if key in expr:
|
|
raise QAPIParseError(self, "duplicate key '%s'" % key)
|
|
raise QAPIParseError(self, "duplicate key '%s'" % key)
|
|
- expr[key] = self.get_expr(True)
|
|
|
|
|
|
+ expr[key] = self.get_expr()
|
|
if self.tok == '}':
|
|
if self.tok == '}':
|
|
self.accept()
|
|
self.accept()
|
|
return expr
|
|
return expr
|
|
@@ -270,7 +274,7 @@ def get_values(self):
|
|
raise QAPIParseError(
|
|
raise QAPIParseError(
|
|
self, "expected '{', '[', ']', string, or boolean")
|
|
self, "expected '{', '[', ']', string, or boolean")
|
|
while True:
|
|
while True:
|
|
- expr.append(self.get_expr(True))
|
|
|
|
|
|
+ expr.append(self.get_expr())
|
|
if self.tok == ']':
|
|
if self.tok == ']':
|
|
self.accept()
|
|
self.accept()
|
|
return expr
|
|
return expr
|
|
@@ -278,9 +282,7 @@ def get_values(self):
|
|
raise QAPIParseError(self, "expected ',' or ']'")
|
|
raise QAPIParseError(self, "expected ',' or ']'")
|
|
self.accept()
|
|
self.accept()
|
|
|
|
|
|
- def get_expr(self, nested):
|
|
|
|
- if self.tok != '{' and not nested:
|
|
|
|
- raise QAPIParseError(self, "expected '{'")
|
|
|
|
|
|
+ def get_expr(self):
|
|
if self.tok == '{':
|
|
if self.tok == '{':
|
|
self.accept()
|
|
self.accept()
|
|
expr = self.get_members()
|
|
expr = self.get_members()
|