Java Antlr4项目目录结构问题
我正在尝试使用Java的包目录结构设置一个Antlr4项目 顶层目录包含Java Antlr4项目目录结构问题,java,antlr4,javac,Java,Antlr4,Javac,我正在尝试使用Java的包目录结构设置一个Antlr4项目 顶层目录包含PondParser.g4、PondLexer.g4和build\u脚本 build_脚本预计将构建并运行antlr4测试平台 { echo 'clean project' find ./com/sevan/pond/ -type f -delete } && { echo 'launch ANTLR parser generator' java -jar /usr/l
PondParser.g4
、PondLexer.g4
和build\u脚本
build_脚本
预计将构建并运行antlr4测试平台
{
echo 'clean project'
find ./com/sevan/pond/ -type f -delete
} && {
echo 'launch ANTLR parser generator'
java -jar /usr/local/lib/antlr-4.8-complete.jar -package com.sevan.pond ./PondLexer.g4 -o com/sevan/pond
java -jar /usr/local/lib/antlr-4.8-complete.jar -package com.sevan.pond ./PondParser.g4 -o com/sevan/pond
} && {
echo 'compile .java files'
javac ./com/sevan/pond/*.java
} && {
echo 'run test rig with gui'
java org.antlr.v4.gui.TestRig ./com/sevan/pond/PondParser prog -gui
}
相关PondParser.g4
标题和选项:
parser grammar PondParser;
@header {
package com.sevan.pond;
}
options {
tokenVocab = PondLexer;
}
lexer grammar PondLexer ;
@header {
package com.sevan.pond;
}
相关PondLexer.g4
标题和选项:
parser grammar PondParser;
@header {
package com.sevan.pond;
}
options {
tokenVocab = PondLexer;
}
lexer grammar PondLexer ;
@header {
package com.sevan.pond;
}
编译时生成脚本失败(javac./com/sevan/pond/*.java
)
具体错误如下:
./com/sevan/pond/LexerRules.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/Pond.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondBaseListener.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondListener.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
4 errors
java -cp .:antlr-4.8-complete.jar org.antlr.v4.gui.TestRig com.sevan.pond.Pond prog -gui
这里缺了什么/怎么了?任何建议、链接和答案都将不胜感激
更新 上述四个错误是由生成的java文件中的双包声明引起的。这是由于使用
-package
和@header
指定包造成的。但是,在修复此问题后,测试设备仍然失败,无法将PondParser加载为lexer或parser这不应该是:
#*nix
javac-cp.:/usr/local/lib/antlr-4.8-complete.jar./com/sevan/pond/*.java
#窗户
javac-cp。;路径\指向\antlr-4.8-complete.jar。\com\sevan\pond\*.java
?
例如:您希望将当前工作目录添加到类路径(
)以及ANTLR库中
编辑
这是一个正在运行的演示(我自己刚刚测试过)
文件/文件夹结构:
-+
|
+--antlr-4.8-complete.jar
|
+--com/
|
+--塞万/
|
+--池塘/
|
+--PondParser.g4
|
+--PondLexer.g4
导航到antlr-4.8-complete.jar驻留的位置
生成lexer和parser类:
java-jar-antlr-4.8-complete.jar-package com.sevan.pond com/sevan/pond/*.g4
并编译所有生成的.java
文件:
javac-cp.:antlr-4.8-complete.jar com/sevan/pond/*.java
最后,按如下方式运行TestRig:
./com/sevan/pond/LexerRules.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/Pond.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondBaseListener.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondListener.java:4: error: class, interface, or enum expected
package com.sevan.pond;
^
4 errors
java -cp .:antlr-4.8-complete.jar org.antlr.v4.gui.TestRig com.sevan.pond.Pond prog -gui
您现在可以输入一些文本,并可以按CTRL+D终止。我键入了abc\n
,得到了以下结果:
以下是语法的样子,仅供参考:
PondLexer.g4
lexer语法PondLexer;
任何
: .
;
PondParser.g4
解析器语法PondParser;
选择权{
tokenVocab=庞德勒施乐器;
}
掠夺
:ANY*EOF
;
谢谢你的意见,巴特。追加当前工作目录不会影响生成。在修复了双包声明(参见更新的问题)之后,错误消失了。现在我发现无法将PondParser加载为lexer或parser
。有什么想法吗?我真的很欣赏这个工作示例。它是类路径和.g4
文件位置的组合。是的,TestRig
在类路径上找不到lexer和parser类时会产生一些奇怪的消息。另一个棘手的事实是,语法名称应该在不使用解析器的情况下提供。不管怎样,很高兴听到你的工作进展顺利。