|
3 | 3 |
|
4 | 4 | from antlr4 import InputStream, CommonTokenStream, Token |
5 | 5 | from antlr4.error.ErrorListener import ErrorListener, ConsoleErrorListener |
| 6 | +from antlr4.error.Errors import ParseCancellationException |
6 | 7 |
|
7 | 8 | from luaparser import printers |
8 | 9 | from luaparser.astnodes import * |
9 | 10 | from luaparser.builder import BuilderVisitor |
10 | 11 | from luaparser.parser.LuaLexer import LuaLexer |
11 | 12 | from luaparser.parser.LuaParser import LuaParser |
12 | 13 | from luaparser.utils.visitor import * |
| 14 | +from antlr4.error.ErrorStrategy import BailErrorStrategy |
| 15 | + |
| 16 | +class BailErrorListener(ErrorListener): |
| 17 | + def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): |
| 18 | + raise ParseCancellationException(f"line {line}:{column}: {msg}") |
13 | 19 |
|
14 | 20 |
|
15 | 21 | def parse(source: str) -> Chunk: |
16 | 22 | """Parse Lua source to a Chunk.""" |
17 | 23 | lexer = LuaLexer(InputStream(source)) |
18 | 24 | lexer.removeErrorListeners() |
| 25 | + |
| 26 | + # Remove default error listeners and add bail listener for LEXER |
| 27 | + lexer.removeErrorListeners() |
19 | 28 | lexer.addErrorListener(ConsoleErrorListener()) |
| 29 | + lexer.addErrorListener(BailErrorListener()) |
20 | 30 |
|
21 | 31 | token_stream = CommonTokenStream(lexer, channel=Token.DEFAULT_CHANNEL) |
22 | 32 | parser = LuaParser(token_stream) |
23 | | - parser.addErrorListener(ConsoleErrorListener()) |
24 | | - tree = parser.start_() |
| 33 | + |
| 34 | + # Remove default error listeners and add bail listener for PARSER |
| 35 | + parser.removeErrorListeners() |
| 36 | + parser.addErrorListener(BailErrorListener()) |
| 37 | + parser._errHandler = BailErrorStrategy() |
| 38 | + |
| 39 | + try: |
| 40 | + tree = parser.start_() |
| 41 | + except ParseCancellationException as e: |
| 42 | + raise SyntaxException(f"syntax errors: {e}") |
25 | 43 |
|
26 | 44 | if parser.getNumberOfSyntaxErrors() > 0: |
27 | 45 | raise SyntaxException("syntax errors") |
|
0 commit comments