mirror of https://github.com/xqemu/xqemu.git
qapi.py: Decent syntax error reporting
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 1374939721-7876-5-git-send-email-armbru@redhat.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
c7a3f25200
commit
2caba36cc6
|
@ -12,6 +12,7 @@
|
||||||
# See the COPYING.LIB file in the top-level directory.
|
# See the COPYING.LIB file in the top-level directory.
|
||||||
|
|
||||||
from ordereddict import OrderedDict
|
from ordereddict import OrderedDict
|
||||||
|
import sys
|
||||||
|
|
||||||
builtin_types = [
|
builtin_types = [
|
||||||
'str', 'int', 'number', 'bool',
|
'str', 'int', 'number', 'bool',
|
||||||
|
@ -34,6 +35,23 @@ builtin_type_qtypes = {
|
||||||
'uint64': 'QTYPE_QINT',
|
'uint64': 'QTYPE_QINT',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class QAPISchemaError(Exception):
|
||||||
|
def __init__(self, schema, msg):
|
||||||
|
self.fp = schema.fp
|
||||||
|
self.msg = msg
|
||||||
|
self.line = self.col = 1
|
||||||
|
for ch in schema.src[0:schema.pos]:
|
||||||
|
if ch == '\n':
|
||||||
|
self.line += 1
|
||||||
|
self.col = 1
|
||||||
|
elif ch == '\t':
|
||||||
|
self.col = (self.col + 7) % 8 + 1
|
||||||
|
else:
|
||||||
|
self.col += 1
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "%s:%s:%s: %s" % (self.fp.name, self.line, self.col, self.msg)
|
||||||
|
|
||||||
class QAPISchema:
|
class QAPISchema:
|
||||||
|
|
||||||
def __init__(self, fp):
|
def __init__(self, fp):
|
||||||
|
@ -52,6 +70,7 @@ class QAPISchema:
|
||||||
while True:
|
while True:
|
||||||
bol = self.cursor == 0 or self.src[self.cursor-1] == '\n'
|
bol = self.cursor == 0 or self.src[self.cursor-1] == '\n'
|
||||||
self.tok = self.src[self.cursor]
|
self.tok = self.src[self.cursor]
|
||||||
|
self.pos = self.cursor
|
||||||
self.cursor += 1
|
self.cursor += 1
|
||||||
self.val = None
|
self.val = None
|
||||||
|
|
||||||
|
@ -66,7 +85,8 @@ class QAPISchema:
|
||||||
ch = self.src[self.cursor]
|
ch = self.src[self.cursor]
|
||||||
self.cursor += 1
|
self.cursor += 1
|
||||||
if ch == '\n':
|
if ch == '\n':
|
||||||
raise Exception("Mismatched quotes")
|
raise QAPISchemaError(self,
|
||||||
|
'Missing terminating "\'"')
|
||||||
if esc:
|
if esc:
|
||||||
string += ch
|
string += ch
|
||||||
esc = False
|
esc = False
|
||||||
|
@ -116,7 +136,12 @@ class QAPISchema:
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
def parse_schema(fp):
|
def parse_schema(fp):
|
||||||
schema = QAPISchema(fp)
|
try:
|
||||||
|
schema = QAPISchema(fp)
|
||||||
|
except QAPISchemaError as e:
|
||||||
|
print >>sys.stderr, e
|
||||||
|
exit(1)
|
||||||
|
|
||||||
exprs = []
|
exprs = []
|
||||||
|
|
||||||
for expr_eval in schema.exprs:
|
for expr_eval in schema.exprs:
|
||||||
|
|
|
@ -16,6 +16,8 @@ import sys
|
||||||
|
|
||||||
try:
|
try:
|
||||||
exprs = parse_schema(sys.stdin)
|
exprs = parse_schema(sys.stdin)
|
||||||
|
except SystemExit:
|
||||||
|
raise
|
||||||
except:
|
except:
|
||||||
print >>sys.stderr, "Crashed:", sys.exc_info()[0]
|
print >>sys.stderr, "Crashed:", sys.exc_info()[0]
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Crashed: <type 'exceptions.Exception'>
|
<stdin>:1:11: Missing terminating "'"
|
||||||
|
|
Loading…
Reference in New Issue