0

给定以下简单的回文语法,生成的解析器似乎接受 a 和 b 的任何组合,而不仅仅是回文。[好吧,当我错误地指定了开始符号时,情况确实如此;现在我已经修改以解决这个问题,但仍然没有得到想要的行为,所以我添加了我要运行的确切命令] [并再次修改,显示建议的更改和由此产生的问题。]

// test1.g4

grammar test1;

palindrome
    : 'z' entry EOF ;
entry
    : 'a' entry 'a'
    | 'b' entry 'b'
    | 'a' 
    | 'b'
    |
    ;

WS : [ \t\r\n]+ -> skip ;

给定这个确切的 test1.g,然后我执行以下 shell 脚本:

#!bash
# script for running ANTLR tests
ANTLR4="java -jar /usr/local/lib/antlr-4.1-complete.jar"
$ANTLR4 test1.g4
echo "grammar compiled"
x=/usr/local/lib/antlr-4.1-complete.jar
javac -classpath $x *.java 2>&1
echo "parser compiled"
#java -cp $x:. org.antlr.v4.runtime.misc.TestRig test1 start -tokens -trace -diagnost
java -cp $x:. org.antlr.v4.runtime.misc.TestRig test1 palindrome -tokens

然后在输入“aab”上运行它会给出:

aab
[@0,0:0='a',<2>,1:0]
[@1,1:1='a',<2>,1:1]
[@2,2:2='b',<1>,1:2]
[@3,4:3='<EOF>',<-1>,2:0]
No method for rule palindrome or it has arguments
4

1 回答 1

1

如果我传递aab给它,我会得到以下输出:

第 1:3 行在输入“b”处没有可行的替代方案

您确定要告诉它从现在开始entry而不是start现在开始吗?如果您从一开始entry,生成的代码实际上不包含不会为输入产生语法错误的代码流路径aab。您可以通过覆盖输出侦听器、在您看不到的地方管道 stdout 或在解析完成之前终止进程来隐藏消息,但否则发生语法错误。

于 2013-07-26T11:23:40.770 回答