我正在使用ANTLR (3.2)来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。遵循以下规则:
exp
: NUM
| '(' expression OPERATOR expression ')' -> expression+
| '(' (MINUS | '!') expression ')' -> expression
;运算符包含与使用减号定义的减号('-')相同的减号。现在,ANTLR似乎无法处理这两个规则。如果我删除其中任何一个,一切都会正常工作。
有什么好主意吗?
发布于 2010-10-26 15:17:51
使一元表达式成为具有最高优先级的表达式。我还对一元-使用了不同的标记,以便更好地区分减号。演示:
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:

使用创建的
https://stackoverflow.com/questions/4019687
复制相似问题