Antlr4项目目录结构问题 PondLexer.g4 PondParser.g4

问题描述

我正在尝试使用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.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并得到了这个信息:

enter image description here

作为参考,语法如下:

PondLexer.g4

lexer grammar PondLexer;

ANY
 : .
 ;

PondParser.g4

parser grammar PondParser;

options {
  tokenVocab=PondLexer;
}

prog
 : ANY* EOF
 ;