我有这个简单的语法:
expr: factor;
factor: atom (('*' ^ | '/'^) atom)*;
atom: INT
| ':' expr;
INT: ('0'..'9')+
当我运行它时说:
决策可以使用多个备选方案1,2
匹配输入,例如'*'决策可以使用多个替代1,2
来匹配输入,例如'/'我无法发现模棱两可。红色箭头是如何指向的? 任何帮助将不胜感激。
答案 0 :(得分:7)
假设您要解析输入:
:3*4*:5*6
语法生成的解析器可以将此输入与以下解析树匹配:
和
(我省略了冒号以保持树木更清晰)
请注意,您看到的只是一个警告。通过专门指示(('*' | '/') atom)*
需要贪婪地匹配的ANTLR,如下所示:
factor
: atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
;
解析器“知道”要采取的替代方案,并且不会发出警告。
我用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')+;
然后从命令行:
java -cp antlr-3.3.jar org.antlr.Tool T.g
不会产生任何警告(或错误)。