使用多个替代错误的antlr匹配输入

pro*_*ach 5 antlr antlr3

当antlr v3.1编译此规则时,我收到警告

 sentence
:
(CAPITAL_LETTERS_AND_NUMBERS | INT | ANY_WORD ) 
(
    INT
| CAPITAL_LETTERS_AND_NUMBERS
| ANY_WORD 
)*;
Run Code Online (Sandbox Code Playgroud)

警告是:

 5:2: Decision can match input such as "CAPITAL_LETTERS_AND_NUMBERS" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.
 Decision can match input such as "INT" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.
Run Code Online (Sandbox Code Playgroud)

我感到困惑的原因是语法是非常复杂的传递,直到我将另一个子规则放在使用句子的文件中的另一个地方.它接受上述规则直到发生这似乎很奇怪.我正在寻找关于如何最好地调试和理解如何发生这种情况的提示?

谢谢,理查德

Bar*_*ers 10

那很难.特别是对于较大的语法,更改(或添加)规则可能会导致难以追踪的歧义.

ANTLRWorks可以帮助发现这些含糊之处.鉴于以下语法:

grammar T;

parse
  :  other? WORD? EOF
  ;

other
  :  WORD
  ;

WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;
Run Code Online (Sandbox Code Playgroud)

解析器不知道如何parse正确处理规则.输入如foo(一个WORD标记)可以匹配other EOF 通过WORD EOF,这是警告:

决策可以使用多个替代方案匹配输入,例如"WORD"

手段.

使用ANTLRWorks生成解析器和词法分析器会导致问题的以下可视化:

在此输入图像描述

是的,我意识到这只是一个微不足道的例子,你的问题相当棘手,但AFAIK在这里没有圣杯.如果你能发布生成一个解析器和词法分析器没有问题的语法产生这些警告编辑的语法,我可能会看看它,看看我能看到的问题.