运行 分离语法器和词法分析器上的 `TestRig` 导致 `java.lang.ClassCastException` 或 `Can't load Test as lexer or parser`

Running `TestRig` on separated grammer and lexer results in `java.lang.ClassCastException` or `Can't load Test as lexer or parser`

我有一个单独的解析器和词法分析器语法,想要 运行 org.antlr.v4.gui.TestRig 到 debug/test 我的语法。

我的词法分析器语法开始于:

lexer grammar TestLexer;

IDS: [a-zA-Z];

WS: [ \t];
NL: [\r?\n];

...

我的解析器语法以:

开头
parser grammar TestParser;
options { tokenVocab=TestLexer; }

testRule: WS* IDS+ NL;

...

我的类路径环境变量指向完成 antlr.jar 和当前目录。

当我 运行 antlr TestParser.g4 && javac *.java 解析器代码生成并编译时。

当我 运行 grun TestParser testRule -gui 我得到错误:

Exception in thread "main" java.lang.ClassCastException: class TestParser
        at java.lang.Class.asSubclass(Class.java:3404)
        at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
        at org.antlr.v4.gui.TestRig.main(TestRig.java:119)

当我 运行 grun Test testRule -gui 我得到错误:

Can't load Test as lexer or parser

我在使用组合语法时没有任何问题。

为了 运行 TestRig 还缺少什么?

使用分离的词法分析器和解析器时,您必须为词法分析器和分析器生成代码。这不是通过单独为解析器生成代码自动完成的。

执行:

antlr TestLexer.g4
antlr TestParser.g4
javac *.java

为(词法分析器和解析器)生成代码后,您必须 运行:

grun Test -gui testInput.txt

其中 testInput.txt 包含一些要解析的测试输入。

注意: 当使用分离的词法分析器和解析器时,预计词法分析器结束于 Lexer,而分析器结束于 Parser。文件的共同部分是语法名称。 即 TestLexerTestParser -> Test 是语法的名称。