为什么ANTLR无法正确打印令牌集?

问题描述 投票:0回答:1

我正在使用我的教授提供的样本来测试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.greetingHelloExample.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
java parsing antlr antlr4 lexer
1个回答
0
投票

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

为了最终获得(greeting Hello World !)输出,您需要在-tree之后添加-tokens标志。

© www.soinside.com 2019 - 2024. All rights reserved.