diff options
author | Markus Armbruster <armbru@redhat.com> | 2013-07-27 17:41:56 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2013-07-29 10:37:10 -0500 |
commit | 2caba36cc61ee3993334bc423f0852f8006fdfcf (patch) | |
tree | 0fd0967b7a7e93e52b468a2ff565993fde5fad22 | |
parent | c7a3f25200c8692e969f21c7f2555630ec0d0d30 (diff) |
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>
-rw-r--r-- | scripts/qapi.py | 29 | ||||
-rw-r--r-- | tests/qapi-schema/test-qapi.py | 2 | ||||
-rw-r--r-- | tests/qapi-schema/unclosed-string.err | 2 |
3 files changed, 30 insertions, 3 deletions
diff --git a/scripts/qapi.py b/scripts/qapi.py index 58e315bf3a..342d16c4e8 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -12,6 +12,7 @@ # See the COPYING.LIB file in the top-level directory. from ordereddict import OrderedDict +import sys builtin_types = [ 'str', 'int', 'number', 'bool', @@ -34,6 +35,23 @@ builtin_type_qtypes = { '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: def __init__(self, fp): @@ -52,6 +70,7 @@ class QAPISchema: while True: bol = self.cursor == 0 or self.src[self.cursor-1] == '\n' self.tok = self.src[self.cursor] + self.pos = self.cursor self.cursor += 1 self.val = None @@ -66,7 +85,8 @@ class QAPISchema: ch = self.src[self.cursor] self.cursor += 1 if ch == '\n': - raise Exception("Mismatched quotes") + raise QAPISchemaError(self, + 'Missing terminating "\'"') if esc: string += ch esc = False @@ -116,7 +136,12 @@ class QAPISchema: return expr def parse_schema(fp): - schema = QAPISchema(fp) + try: + schema = QAPISchema(fp) + except QAPISchemaError as e: + print >>sys.stderr, e + exit(1) + exprs = [] for expr_eval in schema.exprs: diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py index 3280eff2a5..b3d1e1dbce 100644 --- a/tests/qapi-schema/test-qapi.py +++ b/tests/qapi-schema/test-qapi.py @@ -16,6 +16,8 @@ import sys try: exprs = parse_schema(sys.stdin) +except SystemExit: + raise except: print >>sys.stderr, "Crashed:", sys.exc_info()[0] exit(1) diff --git a/tests/qapi-schema/unclosed-string.err b/tests/qapi-schema/unclosed-string.err index 5af46c27ad..948d88339d 100644 --- a/tests/qapi-schema/unclosed-string.err +++ b/tests/qapi-schema/unclosed-string.err @@ -1 +1 @@ -Crashed: <type 'exceptions.Exception'> +<stdin>:1:11: Missing terminating "'" |