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

Joh*_*ack 8 java antlr antlr3

我有这个简单的语法:

expr: factor;

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

atom: INT
    | ':' expr;

INT: ('0'..'9')+
Run Code Online (Sandbox Code Playgroud)

当我跑它时它说:

决策可以使用多个替代1,2匹配输入,例如'*'

决策可以使用多个备选方案1,2匹配输入,例如'/'

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

在此输入图像描述

Bar*_*ers 7

假设您要解析输入:

: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

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