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

时间:2019-12-25 00:29:39

标签: python python-3.x antlr antlr4

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

我创建了一个虚拟环境,并在其中安装了antlr4-python3-runtime,如“ Where can I get the runtime?”中所述:

Install antlr4-python3-runtime

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

grammar         PyVar;

program:        IDENTIFIER+;

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

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

WHITESPACE:     [ ]+ -> skip;

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

Testing the grammar with grun

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

antlr4 -Dlanguage=Python3 PyVar.g4

它们的生成没有错误:

antlr4 -Dlanguage=Python3 PyVar.g4

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

Python parser produces nothing

我在做什么不对?

1 个答案:

答案 0 :(得分:1)

这里有两个问题。

1。语法

在我所在的行中,

program:        IDENTIFIER+;

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

program:        (IDENTIFIER | NEWLINE)+;

2。打印解析器的输出

PyVar.py文件中,我创建了以下一行:

tree = parser.program()

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

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

Works!