我正在尝试学习ANTLR 4,并且我按照 The Definitive ANTLR 4 Reference 中给出的示例进行操作。可悲的是,我坚持第一个例子。
系统:
Windows 10(1703)
Java 8,更新151
ANTLR 4,v4.7
我的%CLASSPATH%
被设置为系统变量(.;"D:\Program Files\Java\libs\antlr-4.7-complete.jar";
)
我的antlr4.bat
中提供了grun.bat
和%PATH%
,我可以从命令行运行antlr4
。
antlr4.bat
:java -cp %CLASSPATH% org.antlr.v4.Tool %*
grun.bat
:java -cp %CLASSPATH% org.antlr.v4.gui.TestRig %*
我明确使用-cp %CLASSPATH%
因为我在未使用-cp
选项时看到其他一些人遇到问题。
我的问题是:
当我在示例语法grun
(Hello
)上运行grun Hello r -tokens
时,我收到此错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: HelloLexer (wrong name: main/resource/hello/HelloLexer)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.antlr.v4.gui.TestRig.process(TestRig.java:129)
at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
对我做错的任何想法?
非常感谢提前!
修改
我以为我找到了答案。通过cd
- 进入编译文件所在的文件夹(而不是从根项目文件夹中调用grun
),我设法了解了相关示例。
但是当我尝试设置自己的项目时,我遇到了同样的问题,并带有与上面相同的错误消息。
这一次,在我使用grun
选项运行antlr4
之后似乎-package
抱怨了。
有谁知道这是为什么?
答案 0 :(得分:0)
尝试使用其所属的包对语法名称进行完全限定,例如 com.demo.pl.Grammar。似乎可以与ANTLR 4.7.2一起使用
答案 1 :(得分:0)
我使用的是 ANTLR 4.9.1,我遇到了完全相同的问题。我的项目布局有一个独特且独立的位置:
@header
块指定的位置)这使得 grun
总是失败(因为一切都必须在同一个文件夹中)。解决方法是制作另一个脚本来修复这两个 grun
错误:
@header{...}
(修复第二个错误).java
文件antlr4
(或手动 org.antlr.v4.Tool
)生成解析器 .java
文件.java
文件grun
(或手动 org.antlr.v4.gui.TestRig
)以下 PowerShell
脚本显示了我是如何做到的(请记住,您的路径可能不同),在我的情况下,语言和项目称为 Nameless
,我使用了 {{1 }} 测试脚本的扩展(因此相应地调整您的 .g4test
/Bash
/Batch
脚本)
PowerShell
答案 2 :(得分:-1)
哇...当然,解决方案是一个简单的解决方案......我的问题是我已经 cd
到了我的测试项目的根文件夹,而我只需要cd
来(并从中调用grun
)编译文件所在的目录。
<德尔>编辑:
好像我仍然遇到grun
的问题。见编辑问题。
EDIT2:
据我所知,grun
与antlr4
的{{1}}选项不能很好地合作。
所以我的解决方案是我必须将我的项目设置为Gradle项目,因为显然效果更好。