鉴于以下简单的回文语法, 结果解析器似乎接受任何组合 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
答案 0 :(得分:1)
如果我将aab
传递给它,我会得到以下输出:
第1:3行在输入'b'
时没有可行的选择
您确定现在开始使用entry
代替start
吗?如果从entry
开始,生成的代码实际上不包含不会为输入aab
生成语法错误的代码流路径。您可以通过覆盖输出侦听器,将stdout传递到您无法看到的位置来隐藏消息,或者在解析完成之前终止该过程,但语法错误将发生。否则就会发生错误。