我有这个简单的语法:
expr: factor;
factor: atom (('*' ^ | '/'^) atom)*;
atom: INT
| ':' expr;
INT: ('0'..'9')+
Run Code Online (Sandbox Code Playgroud)
当我跑它时它说:
决策可以使用多个替代1,2匹配输入,例如'*'
决策可以使用多个备选方案1,2匹配输入,例如'/'
我无法发现模棱两可.红色箭头是如何指向的?任何帮助,将不胜感激.

假设您要解析输入:
:3*4*:5*6
Run Code Online (Sandbox Code Playgroud)
语法生成的解析器可以将此输入与以下解析树匹配:

和:

(我省略了冒号以保持树木更清晰)
请注意,您看到的只是一个警告.通过专门指示(('*' | '/') atom)*需要贪婪匹配的ANTLR ,如下所示:
factor
: atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
;
Run Code Online (Sandbox Code Playgroud)
解析器"知道"要采取的替代方案,并且不会发出警告.
我用ANTLR 3.3测试了语法如下:
grammar T;
options {
output=AST;
}
parse
: expr EOF!
;
expr
: factor
;
factor
: atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
;
atom
: INT
| ':'^ expr
;
INT : ('0'..'9')+;
Run Code Online (Sandbox Code Playgroud)
然后从命令行:
java -cp antlr-3.3.jar org.antlr.Tool T.g
它不会产生任何警告(或错误).