4.1 ANTLR接受回文语法的非法输入

时间:2013-07-26 07:45:17

标签: grammar antlr4 palindrome

鉴于以下简单的回文语法, 结果解析器似乎接受任何组合 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

1 个答案:

答案 0 :(得分:1)

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

  

第1:3行在输入'b'

时没有可行的选择

您确定现在开始使用entry代替start吗?如果从entry开始,生成的代码实际上不包含不会为输入aab生成语法错误的代码流路径。您可以通过覆盖输出侦听器,将stdout传递到您无法看到的位置来隐藏消息,或者在解析完成之前终止该过程,但语法错误发生。否则就会发生错误。