首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持负数的ANTLR计算器

支持负数的ANTLR计算器
EN

Stack Overflow用户
提问于 2015-12-19 15:12:23
回答 2查看 1.8K关注 0票数 1

我正在尝试创建一个同样支持负数的计算器,并最终创建一个lisp风格的树。

我这样定义词法分析器规则:

代码语言:javascript
复制
INT :'-'? [0-9]+ ;
LBRACKET :  '(';
RBRACKET :  ')';
MULTIPLICATION : '*' ;
DIVISION: '/' ;
PLUS: '+' ;
MINUS: '-' ;

我对每个操作都有一个规则,例如:

代码语言:javascript
复制
 e13=exp MINUS e14=exp{
SPTree tempTree= new SPTree("-");
tempTree.insertChild($e13.tree);
tempTree.insertChild($e14.tree);
$tree=tempTree;
} 

但是当我尝试输入表达式:2-3时,出现的lisp树是(2)

为什么它忽略了-3

EN

回答 2

Stack Overflow用户

发布于 2015-12-26 22:34:32

您不应将INT定义为支持负数。把它留给减法运算符。

现在,输入如下:

代码语言:javascript
复制
2-3

将像这样标记化:2 -3,即:INT INT。而且你也没有定义一个能够处理这个问题的解析器规则。

如果从INT定义中删除该'-'?,您将获得预期结果:

2 - 3,也就是INT MINUS INT,这是可解析的。

因此,只需定义以下内容:

代码语言:javascript
复制
INT : [0-9]+ ;

此外,您应该将所需的EOF添加到根解析器规则,以便解析器在意外的额外输入时生成错误。

请参阅my answer here获取一个简单的实用数学示例。

票数 2
EN

Stack Overflow用户

发布于 2019-01-24 20:10:28

您可以使用否定表达式,而不是否定数。例如:

代码语言:javascript
复制
additiveExpr 
    :   multExpr (('+' |'-' ) multExpr )*;  
multExpr 
    :   negationExpr (('*' |'/' ) negationExpr )*; 
negationExpr 
    :   ('-')? primary; 
primary  
    :   atom           
    |  '(' orExpr ')'; 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34368305

复制
相关文章

相似问题

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