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

时间:2011-10-28 20:01:25

标签: java error-handling antlr antlr3

我不知道如何处理ANTLR语法的错误:

****************error message*********
Decision can match input such as "{'+', '-'} IDENT" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
 |---> add: mult (('+'|'-') mult)*;
***************************************

这主要是从斯科特的例子中复制过的,但是我不明白为什么他的作品很好但我的卡住以及如何摆脱它?

---------------以下Sample.g ----------------

grammar Sample;

options { 
  language = Java;
}


 program
      :  'program' IDENT '='
          (constant| variable)*
          'begin'
          (statement)*
          'end' IDENT '.'
      ; 

constant:
       'constant' IDENT ':' type ':=' expression ';' 
      ;

type: 'integer';

variable: 'var' IDENT (',' IDENT)* ':' type  ';';


statement: 'var' IDENT ':=' INTEGER ';' ;

//expression

term: IDENT |'(' expression ')'|INTEGER;
negation: 'not'* term;
unary: ('+'|'-')* negation;
mult: unary (('*'|'/'|'mod') unary)*;

[以下行的XXX错误]

add: mult (('+'|'-') mult)*;
relation: add (('='|'/='|'<'|'<=') add)*;
expression: (relation ('and'|'or') relation)*;


END : 'end';

CONSTANT : 'constant';

INTEGER: '0'| (('1'..'9') ('0'..'9')*);   

IDENT: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;

WS: ('\n'|' '|'\t'|'r'|'\f')+ {$channel=HIDDEN;};

2 个答案:

答案 0 :(得分:2)

您错放了一个括号:

expression: (relation ('and'|'or') relation)*;

使你的语法含糊不清:解析器无法决定何时看到- IDENT它是否应该是add - 或unary - 规则的一部分。

例如,您的规则expression现在符合以下条件:

relation ('and'|'or') relation relation ('and'|'or') relation

即,两个relation规则直接放在彼此之后。如果解析器现在偶然发现这样的输入:

- A - B

解析器“看到”两种解析此输入的可能性:

1(一元表达和一元表达)

enter image description here

2(一元&添加表达式)

enter image description here

应该是:

expression: relation (('and'|'or') relation)*;

相反,所以永远不会有2个连续的表达式(并且没有歧义!)。

答案 1 :(得分:2)

  1. 最好提一下您从中获取代码的源网页。我认为这是Antlr3xtut
  2.   

    这主要是从斯科特的例子中复制过的,但我不明白为什么   他的作品很好但是我的卡住以及如何摆脱它?

    这是因为您复制错误。

    而不是如下所述的正确代码:

    expression
        :   relation (('and' | 'or') relation)*
        ;
    

    您已复制:

    expression: (relation ('and'|'or') relation)*;
    

    你能发现错误吗?例如,在关系之前放置'('。因此,您收到错误 Decision can match input such as "{'+', '-'} IDENT" using multiple alternatives

    enter image description here

    <强> Solution

    将表达式规则替换为scotts样本中的内容。