Python ANTLR4 示例 - 解析器似乎无法正确解析

Python ANTLR4 example - Parser doesn't seem to parse correctly

为了演示这个问题,我将创建一个简单的语法来检测类似 Python 的变量。

我创建一个虚拟环境并安装antlr4-python3-runtime in it, as mentioned in "Where can I get the runtime?":

然后,我创建一个包含以下内容的 PyVar.g4 文件:

grammar         PyVar;

program:        IDENTIFIER+;

IDENTIFIER:     [a-zA-Z_][a-zA-Z0-9_]*;

NEWLINE:        '\n' | '\r\n';

WHITESPACE:     [ ]+ -> skip;

现在,如果我用 grun 测试语法,我可以看到语法检测到的变量很好:

现在我正在尝试在 Python 中编写一个解析器来做到这一点。我使用以下命令生成 Lexer 和 Parser:

antlr4 -Dlanguage=Python3 PyVar.g4

而且它们的生成没有错误:

但是当我使用“How do I run the generated lexer and/or parser?”中提供的示例时,我没有得到输出:

我做错了什么?

这里有两个问题。

1.语法:

在我所在的行中,

program:        IDENTIFIER+;

解析器只会检测一个或多个变量,不会检测任何换行符。当 运行 grun 时您看到的输出是由词法分析器创建的输出,这就是令牌中存在换行符的原因。所以我不得不用这样的东西替换它,以便解析器检测换行符。

program:        (IDENTIFIER | NEWLINE)+;

2。打印解析器

的输出

PyVar.py 文件中,我用这一行创建了一个树:

tree = parser.program()

但它没有打印输出,我也不知道如何打印,但是 OP's comment on this accepted answer 建议使用 tree.toStringTree()

现在,如果我们修复这些,我们可以看到它有效: