1

以下の文法を書きました。式 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) のようなものは除外したくありません。('+' | '-')* を削除しないでそれを行う方法についてのアイデアありがとう

4

1 に答える 1