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

我正在尝试使用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/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类时会产生一些奇怪的消息。另一个棘手的事实是,语法名称应该在不使用
解析器的情况下提供。不管怎样,很高兴听到你的工作进展顺利。