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. | ||||
| 
 | ||||
| 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: | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Crashed: <type 'exceptions.Exception'> | ||||
| <stdin>:1:11: Missing terminating "'" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Markus Armbruster
						Markus Armbruster