问题描述
我正在尝试使用Java的包目录结构来建立一个Antlr4项目。
顶级目录包含PondParser.g4
,PondLexer.g4
和build_script
。
build_script
有望构建并运行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;
}
相关的PondLexer.g4
标头和选项:
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,or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondBaseListener.java:4: error: class,or enum expected
package com.sevan.pond;
^
./com/sevan/pond/PondListener.java:4: error: class,or enum expected
package com.sevan.pond;
^
4 errors
这里缺少什么/错了吗?任何建议,链接和答案将不胜感激。
更新
上面的四个错误是由于在生成的Java文件中有一个双包声明。这是由于使用-package
和@header
指定包而引起的。但是,修复此问题后,测试装置仍然失败,并显示Can't load PondParser as lexer or parser
。
解决方法
那不是:
# *nix
javac -cp .:/usr/local/lib/antlr-4.8-complete.jar ./com/sevan/pond/*.java
# Windows
javac -cp .;path\to\antlr-4.8-complete.jar .\com\sevan\pond\*.java
?
即:您要将当前工作目录以及ANTLR库添加到类路径(.
)中。
编辑
这是一个正在运行的演示(我自己进行了测试)。
文件/文件夹结构:
-+
|
+-- antlr-4.8-complete.jar
|
+-- com/
|
+-- sevan/
|
+-- pond/
|
+-- PondParser.g4
|
+-- PondLexer.g4
导航到antlr-4.8-complete.jar
所在的地方。
生成词法分析器和解析器类:
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:
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 grammar PondLexer;
ANY
: .
;
PondParser.g4
parser grammar PondParser;
options {
tokenVocab=PondLexer;
}
prog
: ANY* EOF
;