我正在使用ANTLR(3.2)来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。采取以下规则:
exp
: NUM
| '(' expression OPERATOR expression ')' -> expression+
| '(' (MINUS | '!') expression ')' -> expression
;
OPERATOR包含与MINUS定义的相同减号(' - ')。现在ANTLR似乎无法处理这两条规则。如果我删除任何一个,一切正常。
任何想法?
答案 0 :(得分:10)
使一元表达式具有最高优先级。我还会为一元-
使用不同的标记来区分减号。演示:
grammar Exp;
options {
output=AST;
}
tokens {
UNARY;
}
parse
: exp EOF
;
exp
: additionExp
;
additionExp
: multiplyExp ('+'^ multiplyExp | '-'^ multiplyExp)*
;
multiplyExp
: unaryExp ('*'^ unaryExp | '/'^ unaryExp)*
;
unaryExp
: '-' atom -> ^(UNARY atom)
| '!' atom -> ^('!' atom)
| atom
;
atom
: '(' exp ')' -> exp
| Number -> Number
;
Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;
Spaces : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ;
使用来源快速测试:
3 * -4 + 7 / 6 * -(3 + -7 * (4 + !2))
产生了以下AST: