首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR:区分一元运算符和二元运算符(例如负号)的问题

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

Stack Overflow用户
提问于 2010-10-26 07:28:32
回答 1查看 4K关注 0票数 9

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

代码语言:javascript
复制
exp
 : NUM
 | '(' expression OPERATOR expression ')' -> expression+
 | '(' (MINUS | '!') expression ')' -> expression
 ;

运算符包含与使用减号定义的减号('-')相同的减号。现在,ANTLR似乎无法处理这两个规则。如果我删除其中任何一个,一切都会正常工作。

有什么好主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-26 15:17:51

使一元表达式成为具有最高优先级的表达式。我还对一元-使用了不同的标记,以便更好地区分减号。演示:

代码语言:javascript
复制
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;} ;

对源代码进行快速测试:

代码语言:javascript
复制
3 * -4 + 7 / 6 * -(3 + -7 * (4 + !2))

生成了以下AST:

使用创建的

  • 映像
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4019687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档