ANTLR: проблемы differntiating унарные и бинарные операторы (например, знак "минус")
Я использую ANTLR (3.2) для анализа довольно простой грамматики. К сожалению, я столкнулся с небольшой проблемой. Возьмите следующее правило:
exp
: NUM
| '(' expression OPERATOR expression ')' -> expression+
| '(' (MINUS | '!') expression ')' -> expression
;
содержит тот же знак минуса ( ' - ' ), что и при минус. Теперь ANTLR, похоже, не может справиться с этими двумя правилами. Если я удалю любой из них, все будет хорошо.
кто-нибудь идеи?
1 ответов
сделайте унарное выражение с наивысшим приоритетом. Я бы также использовал другой токен для унарного -
чтобы сделать различие между минусом лучше. Демо:
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))
произвел следующий АСТ:
- изображение, созданное с помощью http://graph.gafol.net/