Skip to content

Commit b6d95a8

Browse files
committed
fix #68, fail directly on unknow char instead of skipping it
1 parent 335d88b commit b6d95a8

File tree

6 files changed

+319
-227
lines changed

6 files changed

+319
-227
lines changed

cmd/gen.sh

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/zsh
22

3-
java -jar ~/Downloads/antlr-4.13.2-complete.jar -visitor -Dlanguage=Python3 luaparser/parser/LuaParser.g4
3+
java -jar ~/Downloads/antlr-4.13.2-complete.jar -visitor -Dlanguage=Python3 luaparser/parser/LuaLexer.g4 luaparser/parser/LuaParser.g4

luaparser/ast.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,43 @@
33

44
from antlr4 import InputStream, CommonTokenStream, Token
55
from antlr4.error.ErrorListener import ErrorListener, ConsoleErrorListener
6+
from antlr4.error.Errors import ParseCancellationException
67

78
from luaparser import printers
89
from luaparser.astnodes import *
910
from luaparser.builder import BuilderVisitor
1011
from luaparser.parser.LuaLexer import LuaLexer
1112
from luaparser.parser.LuaParser import LuaParser
1213
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}")
1319

1420

1521
def parse(source: str) -> Chunk:
1622
"""Parse Lua source to a Chunk."""
1723
lexer = LuaLexer(InputStream(source))
1824
lexer.removeErrorListeners()
25+
26+
# Remove default error listeners and add bail listener for LEXER
27+
lexer.removeErrorListeners()
1928
lexer.addErrorListener(ConsoleErrorListener())
29+
lexer.addErrorListener(BailErrorListener())
2030

2131
token_stream = CommonTokenStream(lexer, channel=Token.DEFAULT_CHANNEL)
2232
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}")
2543

2644
if parser.getNumberOfSyntaxErrors() > 0:
2745
raise SyntaxException("syntax errors")

luaparser/parser/LuaLexer.g4

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,16 @@ NORMALSTRING: '"' ( EscapeSequence | ~('\\' | '"'))* '"';
7474

7575
CHARSTRING: '\'' ( EscapeSequence | ~('\'' | '\\'))* '\'';
7676

77-
LONGSTRING: '[' NESTED_STR ']';
77+
LONGSTRING: '[' '=' '=' '=' '=' '=' '=' '=' '=' '[' .*? ']' '=' '=' '=' '=' '=' '=' '=' '=' ']'
78+
| '[' '=' '=' '=' '=' '=' '=' '=' '[' .*? ']' '=' '=' '=' '=' '=' '=' '=' ']'
79+
| '[' '=' '=' '=' '=' '=' '=' '[' .*? ']' '=' '=' '=' '=' '=' '=' ']'
80+
| '[' '=' '=' '=' '=' '=' '[' .*? ']' '=' '=' '=' '=' '=' ']'
81+
| '[' '=' '=' '=' '=' '[' .*? ']' '=' '=' '=' '=' ']'
82+
| '[' '=' '=' '=' '[' .*? ']' '=' '=' '=' ']'
83+
| '[' '=' '=' '[' .*? ']' '=' '=' ']'
84+
| '[' '=' '[' .*? ']' '=' ']'
85+
| '[' '[' .*? ']' ']'
86+
;
7887

7988
fragment NESTED_STR: '=' NESTED_STR '=' | '[' .*? ']';
8089

luaparser/parser/LuaLexer.interp

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)