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