我有这个简单的语法:
expr: factor;
factor: atom (('*' ^ | '/'^) atom)*;
atom: INT
| ':' expr;
INT: ('0'..'9')+
当我运行它时,会显示:
决策可以使用多个替代方案1,2来匹配 '*' 等输入。
决策可以使用多个替代方案1,2来匹配 '/' 等输入。
我无法发现歧义。红色箭头指向哪里呢?任何帮助将不胜感激。
![enter image description here](https://istack.dev59.com/UynwI.webp)
假设你想解析输入:
:3*4*:5*6
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
这不会产生任何警告(或错误)。
options{greedy=true;}
,都会创建AST,只有在明确指定时,ANTLR才不会发出警告。 - Bart Kiers
:(1/2) * :3
这样的输入吗?你能给出要解析的输入示例吗? - DarkDust