From b63c493844261e533edfcb30ca76d2f3412ae0cb Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 2 Jun 2013 14:25:35 +0300 Subject: Better error reporting for parsing errors. --- interpreter.py | 12 ++++++++++-- mparser.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/interpreter.py b/interpreter.py index 86d464e93..ede7e1b0d 100755 --- a/interpreter.py +++ b/interpreter.py @@ -598,7 +598,11 @@ class Interpreter(): if len(code.strip()) == 0: raise InvalidCode('Builder file is empty.') assert(isinstance(code, str)) - self.ast = mparser.build_ast(code) + try: + self.ast = mparser.build_ast(code) + except coredata.MesonException as me: + me.file = environment.build_filename + raise me self.sanity_check_ast() self.variables = {} self.builtin = {} @@ -859,7 +863,11 @@ class Interpreter(): self.build_def_files.append(buildfilename) code = open(os.path.join(self.environment.get_source_dir(), buildfilename)).read() assert(isinstance(code, str)) - codeblock = mparser.build_ast(code) + try: + codeblock = mparser.build_ast(code) + except coredata.MesonException as me: + me.file = buildfilename + raise me print('Going to subdirectory "%s".' % self.subdir) self.evaluate_codeblock(codeblock) self.subdir = prev_subdir diff --git a/mparser.py b/mparser.py index 27bec58a4..d13a1f0db 100644 --- a/mparser.py +++ b/mparser.py @@ -17,6 +17,12 @@ import ply.lex as lex import ply.yacc as yacc import nodes +from coredata import MesonException + +class ParserException(MesonException): + def __init__(self, text, lineno): + MesonException.__init__(self, text) + self.lineno = lineno reserved = {'true' : 'TRUE', 'false' : 'FALSE', @@ -90,8 +96,7 @@ def t_EOL_CONTINUE(t): t.lexer.lineno += 1 def t_error(t): - print("Illegal character '%s'" % t.value[0]) - t.lexer.skip(1) + raise ParserException("Illegal character '%s'." % t.value[0], t.lineno) # Yacc part @@ -228,7 +233,7 @@ def p_error(t): txt = 'NONE' else: txt = t.value - print('Parser errored out at: ' + txt) + raise ParserException('Parser errored out at: %s.' % txt, t.lineno) def test_lexer(): s = """hello = (something) # this = (that) -- cgit v1.2.3