Antlr4 项目目录结构问题

Antlr4 Project Directory Structure Issue

我正在尝试使用 Java 的包目录结构设置 Antlr4 项目。

顶级目录包含PondParser.g4PondLexer.g4build_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.g4header和选项:

parser grammar PondParser;

@header {   
    package com.sevan.pond;
}

options {
    tokenVocab = PondLexer;
}

相关PondLexer.g4header和选项:

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
 ;