首页 > 解决方案 > 为什么 ANTLR 不能正确打印标记集?

问题描述

我正在测试 ANTLR-4.7.1 是否正常工作,方法是使用我的教授提供的样本来匹配相同打印标记集的这些结果:

% java  -jar ./antlr-4.7.1-complete.jar HelloExample.g4
% javac  -cp antlr-4.7.1-complete.jar HelloExample*.java
% java -cp .:antlr-4.7.1-complete.jar org.antlr.v4.gui.TestRig HelloExample greeting helloworld.greeting -tokens
[@0,0:4='Hello',<1>,1:0]
[@1,6:10='World',<3>,1:6]
[@2,12:12='!',<2>,1:12]
[@3,14:13='<EOF>',<-1>,2:0]
(greeting Hello World !)

但是,在执行第三个命令后,我的输出是:

[@0,0:4='Hello',<'Hello'>,1:0]
[@1,6:10='World',<Name>,1:6]
[@2,12:12='!',<'!'>,1:12]
[@3,13:12='<EOF>',<EOF>,1:13]

在我的输出中,< > 中没有数字,我认为应该从 HelloExample.tokens 文件中定义,其中包含:

Hello=1
Bang=2
Name=3
WS=4
'Hello'=1
'!'=2

我没有收到错误信息,而且 antlr 似乎已经生成了我需要的所有文件,所以我不知道应该在哪里解决这个问题,请帮忙。而且我不确定它是否有用,但是我的工作目录以helloworld.greetingand开头,HelloExample.g4而最终目录现在包含

helloworld.greeting
HelloExample.g4
HelloExample.interp
HelloExample.tokens
HelloExampleBaseListener.class
HelloExampleBaseListener.java
HelloExampleLexer.class
HelloExampleLexer.inerp
HelloExampleLexer.java
HelloExampleLexer.tokens
HelloExampleListener.class
HelloExampleListener.java
HelloExampleParser$GreetingContext.class
HelloExampleParser.class
HelloExampleParser.java

标签: javaparsingantlrantlr4lexer

解决方案


正如 rici 在评论中已经指出的那样,在令牌输出中获取实际规则名称而不是它们的编号是一项功能,您不必担心。

为了在(greeting Hello World !)最后获得输出,您需要-tree-tokens.


推荐阅读