为了测试目的,我定义了以下愚蠢的语法:
grammar Test;
x: ab 'b' ab EOF;
y: ab+ EOF;
ab: 'a' 'b'?;
我按如下方式执行:
$ rm -f Test*.[^g]*; antlr Test.g && javac Test*.java \
&& echo -n "abab" | grun Test RULE -tree
对于这三条规则,我得到以下输出:
RULE = x --> (x (ab a) b (ab a b) <EOF>)
RULE = y --> (y (ab a b) (ab a b) <EOF>)
RULE = ab --> (ab a b)
这看起来像我的预期:规则ab
不会消耗整个输入,但会尝试尽可能多地匹配。
现在我转到语法文件并注释掉规则y
。我为其余两条规则重复grun
次执行:
RULE = x --> (x (ab a) b (ab a b) <EOF>)
RULE = ab --> (ab a)
x
匹配的输出没有变化。但ab
的输出确实如此,但此规则不依赖于y
。
有谁可以解释发生了什么?它是一些“未定义的行为”,一个我完全错过的错误?在ANTLR 4.5.1上测试。
编辑:已打开an issue,让我们看看官方回复是什么。