为演示该问题,我将创建一个简单的语法以仅检测类似Python的变量。
我创建了一个虚拟环境,并在其中安装了antlr4-python3-runtime
,如“ 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?”中提供的示例时,没有任何输出:
我在做什么不对?
答案 0 :(得分:1)
这里有两个问题。
1。语法:
在我所在的行中,
program: IDENTIFIER+;
解析器将仅检测一个或多个变量,而不会检测任何换行符。运行grun
时看到的输出是词法分析器创建的输出,这就是令牌中存在换行符的原因。所以我不得不用这样的东西替换它,以便解析器检测换行符。
program: (IDENTIFIER | NEWLINE)+;
2。打印解析器的输出
在PyVar.py
文件中,我创建了以下一行:
tree = parser.program()
但是它没有打印输出,也不知道如何输出,但是OP's comment on this accepted answer建议使用tree.toStringTree()
。
现在,如果我们修复这些问题,我们可以看到它有效: