Binary ANTLR:区分一元运算符和二元运算符(例如减号)的问题

Binary ANTLR:区分一元运算符和二元运算符(例如减号)的问题,binary,antlr,operator-keyword,Binary,Antlr,Operator Keyword,我使用ANTLR(3.2)来解析一些相当简单的语法。不幸的是,我遇到了一个小问题。采取以下规则: exp : NUM | '(' expression OPERATOR expression ')' -> expression+ | '(' (MINUS | '!') expression ')' -> expression ; 运算符包含与用减号定义的减号相同的减号('-')。现在ANTLR似乎无法处理这两条规则。如果我去掉其中一个,一切都正常 有人有想法吗?使一元表达式

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

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:

  • 使用创建的图像

当读一个负号时,如果它对应一元负号,那么标记器怎么知道呢?@GastónBengolea,标记器不知道。解析器将
'-'
标记替换为
一元
标记。@这里是ANTLR4的示例:谢谢,这很有帮助。从2010年开始。令人惊讶的是,这些解析器技术并没有太大变化。