Ver código fonte

More informative error messages in parser: include context

Yentl Van Tendeloo 8 anos atrás
pai
commit
6ea21828bb
1 arquivos alterados com 14 adições e 2 exclusões
  1. 14 2
      interface/HUTN/hutn_compiler/compiler.py

+ 14 - 2
interface/HUTN/hutn_compiler/compiler.py

@@ -70,7 +70,13 @@ def do_parse(inputfile, grammarfile):
     if result is None:
         result = Parser(grammar, line_position = True).parse(read(inputfile))
         if result['status'] != Parser.Constants.Success:
-            msg = "%s:%s:%s: %s" % (inputfile, result["line"], result["column"], result["text"])
+            lines = open(inputfile, 'r').readlines()
+            begin_line = max(result["line"] - 3, 0)
+            end_line = min(result["line"] + 3, len(lines))
+            lines = lines[begin_line:end_line]
+            lines = ["%s:   %s" % (begin_line + i + 1, line) for i, line in enumerate(lines)]
+            lines = "".join(lines)
+            msg = "%s:%s:%s: %s\nContext:\n%s" % (inputfile, result["line"], result["column"], result["text"], lines)
             raise Exception(msg)
         make_cached(inputfile, result)
 
@@ -104,7 +110,13 @@ def do_compile(inputfile, grammarfile, visitors=[], include_paths = [], mode="")
         result = do_parse(inputfile, grammarfile)
         error = result["status"] != Parser.Constants.Success
         if error:
-            msg = "%s:%s:%s: %s" % (inputfile, result["line"], result["column"], result["text"])
+            lines = open(working_file, 'r').readlines()
+            begin_line = max(result["line"] - 3, 0)
+            end_line = max(result["line"] + 3, len(lines))
+            lines = lines[begin_line:end_line]
+            lines = ["%s:   %s" % (begin_line + i + 1, line) for i, line in enumerate(lines)]
+            lines = "".join(lines)
+            msg = "%s:%s:%s: %s\nContext:\n%s" % (inputfile, result["line"], result["column"], result["text"], lines)
             raise Exception(msg)
         else:
             for child in result["tree"].tail: