ANTLR决策可以使用多个备选方案匹配输入

时间:2011-10-31 13:06:56

标签: java antlr antlr3

我有这个简单的语法:

expr: factor;

factor: atom (('*' ^ | '/'^) atom)*;

atom: INT
    | ':' expr;

INT: ('0'..'9')+

当我运行它时说:

决策可以使用多个备选方案1,2

匹配输入,例如'*'

决策可以使用多个替代1,2

来匹配输入,例如'/'

我无法发现模棱两可。红色箭头是如何指向的? 任何帮助将不胜感激。

enter image description here

1 个答案:

答案 0 :(得分:7)

假设您要解析输入:

:3*4*:5*6

语法生成的解析器可以将此输入与以下解析树匹配:

enter image description here

enter image description here

(我省略了冒号以保持树木更清晰)

请注意,您看到的只是一个警告。通过专门指示(('*' | '/') 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

不会产生任何警告(或错误)。