【问题标题】:ANTLR calculator with negative numbers support支持负数的 ANTLR 计算器
【发布时间】:2015-12-19 07:12:23
【问题描述】:

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

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

INT :'-'? [0-9]+ ;
LBRACKET :  '(';
RBRACKET :  ')';
MULTIPLICATION : '*' ;
DIVISION: '/' ;
PLUS: '+' ;
MINUS: '-' ;

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

 e13=exp MINUS e14=exp{
SPTree tempTree= new SPTree("-");
tempTree.insertChild($e13.tree);
tempTree.insertChild($e14.tree);
$tree=tempTree;
} 

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

为什么会忽略-3

【问题讨论】:

    标签: antlr


    【解决方案1】:

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

    现在,输入以下内容:

    2-3
    

    将被标记为:2-3,即:INTINT。而且您没有定义能够处理该问题的解析器规则。

    如果你从INT定义中删除'-'?,你会得到预期的结果:
    2-3,即INTMINUSINT,这是可解析的。

    所以,只需定义以下内容:

    INT : [0-9]+ ;
    

    此外,您应该在根解析器规则中添加一个必需的EOF,这样解析器将在意外的额外输入时生成错误。

    请参阅我的回答 here 以获得一个简单的数学示例。

    【讨论】:

    • 通过这种方式 2 - 3 工作但 -3 + 2 不工作。为什么?结果它打印 5,忽略减号。
    • @SctALE 这应该可以正常工作,您的规则一定有问题(问题中没有解析器规则)。请参阅我的链接答案,该答案可以正常工作,但对您没有帮助,请在您的代码中发布一个新问题。您可能没有包含一元减号规则。
    • stackoverflow.com/questions/48267834/… 我应该再写点什么来帮助理解我的问题吗?
    【解决方案2】:

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

    additiveExpr 
        :   multExpr (('+' |'-' ) multExpr )*;  
    multExpr 
        :   negationExpr (('*' |'/' ) negationExpr )*; 
    negationExpr 
        :   ('-')? primary; 
    primary  
        :   atom           
        |  '(' orExpr ')'; 
    

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2013-12-31
      • 1970-01-01
      • 2021-12-03
      • 2019-03-11
      相关资源
      最近更新 更多