将 ANTLR4 `parser.file_input()` 用于 Python 文件时出现 ParseCancellationException
ParseCancellationException when using ANTLR4 `parser.file_input()` for Python files
我正在使用 ANTLR4 编写 Java 代码来解析 Python 文件。我使用的词法分析器和解析器是 Python3Lexer.g4
和 Python3Parser.g4
来自 antlr/grammars-v4
Github。 java 解析代码大部分时间都工作正常,但有时我会收到以下错误。
line 431:1 no viable alternative at input '<EOF>'
Parser Exception: org.antlr.v4.runtime.misc.ParseCancellationException
org.antlr.v4.runtime.misc.ParseCancellationException
at org.antlr.v4.runtime.BailErrorStrategy.recover(BailErrorStrategy.java:51)
at Python3Parser.simple_stmt(Python3Parser.java:1667)
at Python3Parser.stmt(Python3Parser.java:1567)
at Python3Parser.file_input(Python3Parser.java:348)
at ConvertPython.serializeFile(ConvertPython.java:89)
这是ConvertPython.java的一部分:
Python3Lexer lexer = new Python3Lexer(CharStreams.fromFileName(f));
CommonTokenStream tokens = new CommonTokenStream(lexer);
vocab = lexer.getVocabulary();
Python3Parser parser = new Python3Parser(tokens);
ParserRuleContext t = parser.file_input(); // the exception line
这是一个失败的 Python:
...
SYBYL2SYMB = {
"Mo": "Mo",
"Sn": "Sn",
}
我测试的时候发现这个dict不能是Python文件的最后一行。如果后面有换行,也没有例外。
此外,我发现 Python 代码 print resultmatrix_
会有 line 231:7 no viable alternative at input 'resultmatrix_' Parser Exception: org.antlr.v4.runtime.misc.ParseCancellationException
。我认为这是因为这段代码是 Python2 但我使用的 ANTLR 语法是 Python3.
PS,我是 ANTLR 的新手。请告诉我应该 post 以便您理解。非常感谢!
语法要求“简单语句”末尾有一个 NEWLINE
。
这个有效:
String input = "SYBYL2SYMB = {\n" +
" \"Mo\": \"Mo\",\n" +
" \"Sn\": \"Sn\",\n" +
"}\n";
Python3Lexer lexer = new Python3Lexer(CharStreams.fromString(input));
Python3Parser parser = new Python3Parser(new CommonTokenStream(lexer));
parser.file_input();
我正在使用 ANTLR4 编写 Java 代码来解析 Python 文件。我使用的词法分析器和解析器是 Python3Lexer.g4
和 Python3Parser.g4
来自 antlr/grammars-v4
Github。 java 解析代码大部分时间都工作正常,但有时我会收到以下错误。
line 431:1 no viable alternative at input '<EOF>'
Parser Exception: org.antlr.v4.runtime.misc.ParseCancellationException
org.antlr.v4.runtime.misc.ParseCancellationException
at org.antlr.v4.runtime.BailErrorStrategy.recover(BailErrorStrategy.java:51)
at Python3Parser.simple_stmt(Python3Parser.java:1667)
at Python3Parser.stmt(Python3Parser.java:1567)
at Python3Parser.file_input(Python3Parser.java:348)
at ConvertPython.serializeFile(ConvertPython.java:89)
这是ConvertPython.java的一部分:
Python3Lexer lexer = new Python3Lexer(CharStreams.fromFileName(f));
CommonTokenStream tokens = new CommonTokenStream(lexer);
vocab = lexer.getVocabulary();
Python3Parser parser = new Python3Parser(tokens);
ParserRuleContext t = parser.file_input(); // the exception line
这是一个失败的 Python:
...
SYBYL2SYMB = {
"Mo": "Mo",
"Sn": "Sn",
}
我测试的时候发现这个dict不能是Python文件的最后一行。如果后面有换行,也没有例外。
此外,我发现 Python 代码 print resultmatrix_
会有 line 231:7 no viable alternative at input 'resultmatrix_' Parser Exception: org.antlr.v4.runtime.misc.ParseCancellationException
。我认为这是因为这段代码是 Python2 但我使用的 ANTLR 语法是 Python3.
PS,我是 ANTLR 的新手。请告诉我应该 post 以便您理解。非常感谢!
语法要求“简单语句”末尾有一个 NEWLINE
。
这个有效:
String input = "SYBYL2SYMB = {\n" +
" \"Mo\": \"Mo\",\n" +
" \"Sn\": \"Sn\",\n" +
"}\n";
Python3Lexer lexer = new Python3Lexer(CharStreams.fromString(input));
Python3Parser parser = new Python3Parser(new CommonTokenStream(lexer));
parser.file_input();