ANTRL4:无法让Python ANTLR生成解析树的图形

5

我有一个简单的HelloWorld.g4语法(请看底部)。我能够成功地使用以下命令生成.py文件:

set CLASSPATH=.;antlr-complete.jar;%CLASSPATH%

java org.antlr.v4.Tool -Dlanguage=Python2 HelloWorld.g4

现在我想使用带有-gui标志的TestRig来生成解析树GUI。我已经安装了ANTRL Python运行时(antlr4-python2-runtime-4.5.tar.gz)。我可以打开Python解释器并输入:
import antlr4

解释器识别 antlr4 模块。

当我像这样运行 TestRig

set CLASSPATH=.;antlr-complete.jar;%CLASSPATH%

java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt

我收到了这个错误信息:
Can't load HelloWorld as lexer or parser

在我的调查中,我发现了几篇帖子列出了相同的错误信息。但是,在这些情况下,他们忘记在classpath中包含句点(.)。但是,正如您所看到的,我已经在我的classpath中包含了它。

我已经没有办法让TestRig工作了。注意:当目标语言为Java时,我没有问题让TestRig与相同的HelloWorld语法一起工作。

如果您能提供任何帮助,将不胜感激。

HelloWorld.g4

grammar HelloWorld;   

options { language=Python; }            

message   : GREETING NAME;

GREETING : 'Hello' ;    
NAME     : [a-zA-Z]+ ;                      
WS       : [ \t\r\n]+ -> skip ; 
1个回答

7
今天我也遇到了这个问题:问题在于testrig期望生成的Java源代码。但是,由于你使用的是Python,除非你显式地运行antlr4两次:一次针对目标语言Python2(或3),一次针对-Dlanguage=java,否则你就没有它。
请参见此答案,建议先运行language=java目标。然后,在问题本身的评论中编译Java文件。
为了完整起见,在忘记之前:确保你的$CLASSPATH环境变量设置正确,包括一个点'.'antlr*.jar文件的路径。例如在Unix上:
export CLASSPATH=".:/<Mydirectory>/antlr-4.2.2-complete.jar:$CLASSPATH"

这里是我猜想一旦$CLASSPATH正确设置后需要执行的步骤:
为Java编译:
> antlr4 -Dlanguage=Java HelloWorld.g4
# or:  java org.antlr.v4.Tool -Dlanguage=Java HelloWorld.g4

请注意,我在我的语法文件中有 options { language=Python3 },但是 -D 覆盖并没有按预期工作。因此,我删除了选项块并在命令行上指定了语言目标。
然后将 *.java 文件编译成 *.class 文件:
> javac -g *.java

然后运行测试工具:

> grun HelloWorld message
# or: java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt

感谢cfi的留言。从Java类生成解析树图像并不是必需的。我知道至少有一个人在使用testrig对Python文件进行测试来生成解析树图像:https://github.com/godber/pds3_grammar/(向下滚动到页面底部,你会看到一个漂亮的“解析树检查器”图像)。我与创建该图像的作者保持联系,并向他展示了我在上面的帖子中描述的内容,他认为没有问题。这确实是个迷。我希望Terrance Parr能够就此问题发表言论。 - Roger Costello
这是有趣的信息,但你试过我的建议吗?即使可能有更简单的方法,但这是对我(以及其他人)有效的方法。所以值得一试。或者你有什么原因不能接受这个建议 - 即使只是一个解决方法?还有其他限制吗?在我看来,运行 antlr4 工具两次并没有真正的影响。写一个小脚本,你将永远不会再注意到它了。 - cfi
请注意,这个人确实构建Java目标。请参阅makefile,他将它们编译成*.class文件,因此他完全按照我描述的方式进行操作,因此他没有任何问题;-) - cfi
非常感谢您,cfi。我明白您的意思了。是的,他在Java .class文件上运行testrig,而不是Python .class文件。当我阅读他的makefile时没有注意到这一点。再次感谢! - Roger Costello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接