Antlr4 项目目录结构问题
Antlr4 Project Directory Structure Issue
我正在尝试使用 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
header和选项:
parser grammar PondParser;
@header {
package com.sevan.pond;
}
options {
tokenVocab = PondLexer;
}
相关PondLexer.g4
header和选项:
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
这里 missing/wrong 是什么?任何建议、链接和答案将不胜感激。
更新
以上四个错误是由于生成的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 库。
编辑
这是一个工作演示(我自己测试过)。
Files/folder结构:
-+
|
+-- 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
最后,运行测试台如下:
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
;
我正在尝试使用 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
header和选项:
parser grammar PondParser;
@header {
package com.sevan.pond;
}
options {
tokenVocab = PondLexer;
}
相关PondLexer.g4
header和选项:
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
这里 missing/wrong 是什么?任何建议、链接和答案将不胜感激。
更新
以上四个错误是由于生成的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 库。
编辑
这是一个工作演示(我自己测试过)。
Files/folder结构:
-+
|
+-- 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
最后,运行测试台如下:
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
;