Redo the error reporting

This commit is contained in:
Douglas Clowes
2014-09-29 11:51:29 +10:00
parent 75eddb7eea
commit 94bd7f32eb

View File

@ -64,6 +64,12 @@ Verbose = False
DriverDump = False DriverDump = False
CodeDump = False CodeDump = False
def PrintParseError(message):
print message
def PrintPostError(message):
print message
# #
# Tokenizer: This recognizes the tokens which can be keywords, identifiers, # Tokenizer: This recognizes the tokens which can be keywords, identifiers,
# numbers or strings plus the punctuation. # numbers or strings plus the punctuation.
@ -212,7 +218,8 @@ def t_tcl_newline(t):
t.lexer.lineno += t.value.count("\n") t.lexer.lineno += t.value.count("\n")
def t_tcl_error(t): def t_tcl_error(t):
print("Illegal tcl character '%s'" % t.value[0]) message = "Illegal tcl character '%s'" % t.value[0]
PrintParseError(message)
t.lexer.skip(1) t.lexer.skip(1)
def t_TEXT_STRING1(t): def t_TEXT_STRING1(t):
@ -240,7 +247,8 @@ def t_FLOATER(t):
try: try:
t.value = float(t.value) t.value = float(t.value)
except ValueError: except ValueError:
print "Floating value invalid:", t.value message = "Floating value invalid: " + repr(t.value)
PrintParseError(message)
t.value = 0.0 t.value = 0.0
return t return t
@ -249,7 +257,8 @@ def t_INTEGER(t):
try: try:
t.value = int(t.value) t.value = int(t.value)
except ValueError: except ValueError:
print "Integer value too large:", t.value message = "Integer value too large: " + repr(t.value)
PrintParseError(message)
t.value = 0 t.value = 0
return t return t
@ -270,7 +279,9 @@ def t_newline(t):
t.lexer.lineno += t.value.count("\n") t.lexer.lineno += t.value.count("\n")
def t_error(t): def t_error(t):
print("Illegal character '%s'" % t.value[0]) message = "Illegal character '%s' at line %d" % \
(t.value[0], t.lexer.lineno)
PrintParseError(message)
t.lexer.skip(1) t.lexer.skip(1)
# #
@ -593,7 +604,10 @@ def p_empty(p):
pass pass
def p_error(t): def p_error(t):
print("Syntax error at '%s'" % t.value), t message = "Syntax error at line %d" % lexer.lineno
message += " " + repr(t)
message += " " + repr(t.value)
PrintParseError(message)
# #
# Utility functions # Utility functions
@ -717,7 +731,8 @@ def build_variable(MyDriver, p):
MyDriver['Funcs'][MyVar[func]]['type'] = func MyDriver['Funcs'][MyVar[func]]['type'] = func
else: else:
# TODO FIXME error message # TODO FIXME error message
print 'Error: Function type mismatch: var = ' + str(MyVar) + ', code = ' + str(MyDriver['Funcs'][MyVar[func]]) + ', func = ' + str(func) message = 'Error: Function type mismatch: var = ' + str(MyVar) + ', code = ' + str(MyDriver['Funcs'][MyVar[func]]) + ', func = ' + str(func)
PrintPostError(message)
MyDriver['Funcs'][MyVar[func]]['reference_count'] += 1 MyDriver['Funcs'][MyVar[func]]['reference_count'] += 1
if 'permlink' in MyVar: if 'permlink' in MyVar:
device_type, node_type = MyVar['permlink'].split('.') device_type, node_type = MyVar['permlink'].split('.')
@ -842,7 +857,9 @@ def build_driver(MyDriver, TheTree):
MyDriver[key] = item[key] MyDriver[key] = item[key]
for item in MyDriver['Permlink']: for item in MyDriver['Permlink']:
if len(MyDriver['Permlink'][item]) > 1: if len(MyDriver['Permlink'][item]) > 1:
print 'Error: duplicate permlink entries for "%s"' % item, MyDriver['Permlink'][item] message = 'Error: duplicate permlink entries for "%s"' % item
message += " " + repr(MyDriver['Permlink'][item])
PrintPostError(message)
if Verbose: if Verbose:
print "MyDriver:", MyDriver print "MyDriver:", MyDriver
# #
@ -1348,7 +1365,8 @@ def put_group(MyDriver, MyGroup):
idx = int(device_type[1:]) idx = int(device_type[1:])
device_type = '[string index ${permlink} %d]' % idx device_type = '[string index ${permlink} %d]' % idx
else: else:
print 'Error: permlink required in make_ags' message = 'Error: permlink required in make_ags'
PrintPostError(message)
if 'make_args' in MyDriver and 'id' in MyDriver['make_args'].split(): if 'make_args' in MyDriver and 'id' in MyDriver['make_args'].split():
permlink = device_type + '[format "%02d" ${id}]' + node_type permlink = device_type + '[format "%02d" ${id}]' + node_type
else: else: