当前位置: 首页 > 知识库问答 >
问题:

支持负数的 ANTLR 计算器

段干靖
2023-03-14

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

我这样定义lexer规则:

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

共有2个答案

袁轶
2023-03-14

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

additiveExpr 
    :   multExpr (('+' |'-' ) multExpr )*;  
multExpr 
    :   negationExpr (('*' |'/' ) negationExpr )*; 
negationExpr 
    :   ('-')? primary; 
primary  
    :   atom           
    |  '(' orExpr ')'; 
茅桐
2023-03-14

您不应该将< code>INT定义为支持负数。把这留给减法运算符吧。

现在,以下输入:

2-3

将像这样标记:2-3,即:INTINT。而且您没有定义能够处理它的解析器规则。

如果从 INT 定义中删除“-”?,您将获得预期的结果:
2 - 3,即 INT 减去 INT,这是可解析的。

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

INT : [0-9]+ ;

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

请看我的答案,这里有一个简单的数学例子。

 类似资料:
  • 本文向大家介绍ANTLR语言支持,包括了ANTLR语言支持的使用技巧和注意事项,需要的朋友参考一下 示例 ANTLR能够为多种编程语言生成解析器: C#目标 Python目标 JavaScript目标 Java目标 默认情况下,ANTLR将使用Java编程语言从命令行生成解析器: 要更改目标语言,可以从OS终端/命令行运行以下命令: 不必每次都在命令行/终端上使用“ -Dlanguage”参数来为

  • 我已经用DesktopSSO模块配置了OpenAM,我们的SAML 2.0应用程序在域计算机上一切正常。当他们请求该应用程序时,它会重定向到OpenAM,他们会立即通过身份验证。我试图了解OpenAM中需要什么配置来支持非域名PC。OpenAM中有没有一个选项说‘如果设备不支持这个模块,就用另一个模块’?

  • 我知道Android支持NDK。我找不到一个以某种方式说明Android Things是否支持RenderScript Compute的引用。我的假设是否定的(理由是并非所有平台都会有合适的GPU),但我希望人们已经尝试过,或者知道RenderScript Compute是否可以在Android平台上运行。

  • 我正在为我的小型数据科学项目计算线性回归。 当将list(Dictionary.values())传递到我得到的类中时 回溯(最近的调用为last):文件“C://users/paweé/documents/projects vscode/worldbankdatakeras/tests.py”,第41行,在graph.plot_graph_renewable_electricity_status

  • 分支 开始时间 积极支持截止时间 安全维护截止时间 v4.3.x 2019-2-7 2019-9-30 2019-12-31 v4.4.x 2019-4-15 2020-4-30 2020-7-31 v4.5.x 2019-12-20 2020-12-31 2021-3-31 积极支持 受到官方开发组的积极支持,已报告的错误和安全问题将会立即被修复,并按照常规流程发布正式的版本。 安全维护 仅支持

  • 问题内容: 我的模数做错了吗?因为在Java 中应该评估但我得到。 问题答案: 负数模数的两种定义都在使用-有些语言使用一种定义,而另一种使用。 如果要为负输入获得负数,则可以使用以下方法: 同样,如果你使用的是在否定输入中返回负数的语言,并且你希望使用正数: