ANTLR决定警告

时间:2013-07-13 16:09:43

标签: eclipse antlr

我写了以下语法。我想写表达式x + 2;为x / 2; ...

grammar HASKELL;

options {
  language = Java;
}

program
    : statment+
    ;

statment
    :declaration
    | expression
    ;

declaration
    : typeDecl
    ;

typeDecl
    :numType 
    |listType
    ;

type
    : 'num'
    | 'list'    
    ;


numType
    : type IDENT '=' INTEGER ';' 
    ;


listType
    :type IDENT '='  '[' INTEGER* ']'  ';'
    ;   

term                    
    : IDENT
    | '(' expression ')'
    |   INTEGER
    ;

negation
    : 'not'* term
    ;

unary
    :  ('+' | '-')* negation
    ;

mult
    : unary (('*' | '/' | 'mod') unary) *
    ;   

add  
    : mult (('+' | '-') mult)*
    ;

relation        
    : add (('=' |'/='|'<'|'<='|'>'|'>=') add)*
    ;

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

MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;};

产生以下警告:

(200): Decision can match input such as "'+'..'-' IDENT" using multiple 
       alternatives: 1,2 As a result, alternative(s) 2 were disabled for 
       that input   HASKELL.g   Assignment2/src/com/assignment2/antlr3x/first    
       line 59 DLTK Problem

我看不出添加引起的混乱。我试图删除('+'|' - ')*在一元下,它工作。但是不想排除像x +( - 2)这样的东西。任何想法如何通过不删除('+'|' - ')* 感谢

1 个答案:

答案 0 :(得分:2)

由于这些规则,你的语法含糊不清:

program
    : statment+
    ;

statment
    : declaration
    | expression
    ;

即:您允许多个expression没有分隔标记,例如;或换行符。因此,输入如下:

1+2

可以在多个解析中解析:

statment
  |
  +--> expression --> INTEGER (1)
  |
  +--> expression --> unary (+2)

或者像这样:

statment
  |
  +--> expression --> add (1+2)

您可以通过从+规则中删除program来验证这一点:

program
    : statment
    ;

导致警告消失。