bypass ply's eating SyntaxErrors
authorJacob Lifshay <programmerjake@gmail.com>
Tue, 9 May 2023 07:10:27 +0000 (00:10 -0700)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 2 Jun 2023 18:51:18 +0000 (19:51 +0100)
src/openpower/decoder/pseudo/lexer.py
src/openpower/decoder/pseudo/parser.py

index 876ec87d670da9c56d246198dac780d03ac5a8b5..dfda1976746191a617dd65672308b260856d11e9 100644 (file)
@@ -13,12 +13,27 @@ from ply import lex
 from openpower.decoder.selectable_int import SelectableInt
 
 
+class SyntaxError2(Exception):
+    """ class used to raise a syntax error but get ply to stop eating errors
+    since it catches and discards SyntaxError after setting a flag.
+    """
+
+    def __repr__(self):
+        return repr(SyntaxError(*self.args))
+
+    def __str__(self):
+        return str(SyntaxError(*self.args))
+
+    def raise_syntax_error(self):
+        raise SyntaxError(*self.args) from self
+
+
 def raise_syntax_error(msg, filename, lineno, lexpos, input_text):
     line_start = input_text.rfind('\n', 0, lexpos) + 1
     line_end = input_text.find('\n', line_start)
     col = (lexpos - line_start) + 1
-    raise SyntaxError(str(msg), (filename, lineno, col,
-                                 input_text[line_start:line_end]))
+    raise SyntaxError2(str(msg), (filename, lineno, col,
+                                  input_text[line_start:line_end]))
 
 # I implemented INDENT / DEDENT generation as a post-processing filter
 
index de3eda732e7d16255a07b1758b143a005d828e0d..ef825fb0c828e87feb3fa191b08bb288eec52995 100644 (file)
@@ -14,7 +14,8 @@ import astor
 from copy import deepcopy
 
 from openpower.decoder.power_decoder import create_pdecode
-from openpower.decoder.pseudo.lexer import IndentLexer, raise_syntax_error
+from openpower.decoder.pseudo.lexer import (
+    IndentLexer, raise_syntax_error, SyntaxError2)
 from openpower.decoder.orderedset import OrderedSet
 
 # I use the Python AST
@@ -1002,7 +1003,10 @@ class GardenSnakeCompiler(object):
             raise ValueError("missing filename")
         self.parser.filename = filename
         self.parser.input_text = code
-        tree = self.parser.parse(code)
+        try:
+            tree = self.parser.parse(code)
+        except SyntaxError2 as e:
+            e.raise_syntax_error()
         print("snake")
         pprint(tree)
         return tree