我写了以下语法。我想写表达式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)这样的东西。任何想法如何通过不删除('+'|' - ')* 感谢
答案 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
;
导致警告消失。