在单独的语法和词法分析器上运行`TestRig`会导致`java.lang.ClassCastException`或`无法以词法分析器或解析器的身份加载测试

时间:2019-05-21 13:31:39

标签: java antlr

我有一个单独的解析器和词法分析器语法,想运行org.antlr.v4.gui.TestRig来调试/测试我的语法。

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

lexer grammar TestLexer;

IDS: [a-zA-Z];

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

...

我的解析器语法以:

parser grammar TestParser;
options { tokenVocab=TestLexer; }

testRule: WS* IDS+ NL;

...

我的类路径env变量指向完整的antlr.jar和当前目录。

  • antlrjava org.antlr.v4.Tool的别名
  • grunjava org.antlr.v4.gui.TestRig的别名。

当我运行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,缺少什么?

1 个答案:

答案 0 :(得分:0)

使用分离的词法分析器和解析器时,必须为词法分析器和解析器生成代码。仅通过为解析器生成代码不会自动完成此操作。

执行:

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

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

grun Test -gui testInput.txt

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

注意::使用分离的词法分析器和解析器时,期望词法分析器以Lexer结尾,解析器以Parser结尾。文件的共同部分是语法名称。 即TestLexerTestParser-> Test是语法的名称。