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

Rog*_*llo 5 python java antlr antlr4

我有一个简单的HelloWorld.g4语法(见底部)。我能够.py使用这个成功生成文件:

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

java org.antlr.v4.Tool -Dlanguage=Python2 HelloWorld.g4
Run Code Online (Sandbox Code Playgroud)

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

import antlr4
Run Code Online (Sandbox Code Playgroud)

并且解释器识别antlr4模块。

当我TestRig像这样运行时:

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

java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

Can't load HelloWorld as lexer or parser
Run Code Online (Sandbox Code Playgroud)

从我的调查中,我发现有几篇文章列出了相同的错误消息。但是,在这些情况下,他们忘记在类路径中包含句点 (.)。但是正如您所看到的,我已将它包含在我的类路径中。

我对如何TestRig开始工作没有想法。注意:当目标语言是 Java 时TestRig,使用相同的HelloWorld语法没有问题。

您能提供的任何帮助将不胜感激。

你好世界.g4

grammar HelloWorld;   

options { language=Python; }            

message   : GREETING NAME;

GREETING : 'Hello' ;    
NAME     : [a-zA-Z]+ ;                      
WS       : [ \t\r\n]+ -> skip ; 
Run Code Online (Sandbox Code Playgroud)

cfi*_*cfi 6

今天也遇到了这个问题:问题是 testrig 需要生成的 java 源代码。但是由于您使用的是 Python,除非您明确运行antlr4两次,否则您不会拥有它:一次针对目标语言 Python2(或 3),一次针对-Dlanguage=java.

请参阅此答案该答案建议先运行language=java目标。然后对问题本身的评论来编译java文件。

为了完整起见,在它被遗忘之前:确保您的$CLASSPATHenv 变量已设置,以便它同时包含一个点'.'antlr*.jar文件路径。例如在 unix 上

export CLASSPATH=".:/<Mydirectory>/antlr-4.2.2-complete.jar:$CLASSPATH"
Run Code Online (Sandbox Code Playgroud)

这是我猜你在$CLASSPATH正确设置后必须做的一步一步:

编译为java:

> antlr4 -Dlanguage=Java HelloWorld.g4
# or:  java org.antlr.v4.Tool -Dlanguage=Java HelloWorld.g4
Run Code Online (Sandbox Code Playgroud)

请注意,我的options { language=Python3 }语法文件中有 ,并且-D覆盖没有按预期工作。所以我删除了选项块并现在在命令行上指定语言目标。

然后将*.java文件编译成*.class文件:

> javac -g *.java
Run Code Online (Sandbox Code Playgroud)

然后运行测试:

> grun HelloWorld message
# or: java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt
Run Code Online (Sandbox Code Playgroud)