9

我正在使用 ANTLR (3.2) 来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。采取以下规则:

exp
 : NUM
 | '(' expression OPERATOR expression ')' -> expression+
 | '(' (MINUS | '!') expression ')' -> expression
 ;

OPERATOR 包含与用 MINUS 定义的相同的减号 ('-')。现在 ANTLR 似乎无法处理这两个规则。如果我删除任何一个,一切正常。

任何人的想法?

4

1 回答 1

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:

替代文字

于 2010-10-26T07:17:50.763 回答