Binary ANTLR:区分一元运算符和二元运算符(例如减号)的问题
我使用ANTLR(3.2)来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。采取以下规则:Binary ANTLR:区分一元运算符和二元运算符(例如减号)的问题,binary,antlr,operator-keyword,Binary,Antlr,Operator Keyword,我使用ANTLR(3.2)来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。采取以下规则: exp : NUM | '(' expression OPERATOR expression ')' -> expression+ | '(' (MINUS | '!') expression ')' -> expression ; 运算符包含与用减号定义的减号相同的减号('-')。现在ANTLR似乎无法处理这两条规则。如果我去掉其中一个,一切都正常 有人有想法吗?使一元表达式
exp
: NUM
| '(' expression OPERATOR expression ')' -> expression+
| '(' (MINUS | '!') expression ')' -> expression
;
运算符包含与用减号定义的减号相同的减号('-')。现在ANTLR似乎无法处理这两条规则。如果我去掉其中一个,一切都正常
有人有想法吗?使一元表达式具有最高优先级。我还将对一元
-
使用不同的标记,以便更好地区分负号。演示:
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:
- 使用创建的图像
'-'
标记替换为一元
标记。@这里是ANTLR4的示例:谢谢,这很有帮助。从2010年开始。令人惊讶的是,这些解析器技术并没有太大变化。