首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有限域上计算器的语法

有限域上计算器的语法
EN

Stack Overflow用户
提问于 2015-11-22 21:52:52
回答 2查看 73关注 0票数 0

我有一个工作计算器,除了一件事:一元运算符'-‘。

在两个不同的情况下,必须对其进行评估和处理:

  1. 当有像so -(3+3)这样的表达式时
  2. 当没有:-3

对于案例1,我希望得到一个后缀输出3+-对于例2,我希望在这个字段中得到这个令牌的正确值,因此,例如在Z10中,它是10-3 = 7。

我现在的想法是:

代码语言:javascript
运行
复制
E:  ...
    |   '-' NUM %prec NEGATIVE      { $$ = correct(-yylval); appendNumber($$);          }
    |   '-' E %prec NEGATIVE        { $$ = correct(P-$2); strcat(rpn, "-");                                 }
    |   NUM     { appendNumber(yylval); $$ = correct(yylval); }

其中NUM是一个令牌,但显然编译器说这里有一个/reduce,因为在某些情况下E也可以是一个NUM,虽然它可以工作,但我想去掉编译器的警告。我的想法用完了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-23 10:32:45

在两个不同的情况下,必须对其进行评估和处理:

不,没有。案子不清楚。

- E- NUM都是错误的。正确的语法应该是这样的:

代码语言:javascript
运行
复制
primary
    : NUM
    | '-' primary
    | '+' primary /* for completeness */
    | '(' expression ')'
    ;
票数 2
EN

Stack Overflow用户

发布于 2015-11-22 22:13:36

通常,这应该作为两个规则来实现(伪代码,我不知道bison语法):

这是表达式的“终端”元素的可能规则。自然,带括号的表达式会导致递归到顶层规则:

代码语言:javascript
运行
复制
Element => Number
           | '(' Expression ')'

一元减去(也是一元加!)在产品堆栈(语法规则)中仅处于一个级别上:

代码语言:javascript
运行
复制
Term =>    '-' Element
           | '+' Element
           | Element

当然,这可以分解成所有可能的组合,如'-' Number'-' '(' Expression ')',同样地,也可以使用'+',而且根本没有任何一元运算符。

假设我们需要加法/减法和乘法/除法。那么语法的其余部分将如下所示:

代码语言:javascript
运行
复制
Expression => Expression '+' MultiplicationExpr
              | Expression '-' MultiplicationExpr
              | MultiplicationExpr

MultiplicationExpr => MultiplicationExpr '*' Term
                      | MultiplicationExpr '/' Term
                      | Term

为了完整起见:

终端机:

  • Number

非终点站:

  • Expression
  • Element
  • Term
  • MultiplicationExpr

Number,它是一个终端,应该匹配像这个[0-9]+一样的regexp。换句话说,它不解析减号-它总是一个正整数(或零)。负整数是通过匹配标记的'-' Number序列来计算的。

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

https://stackoverflow.com/questions/33860689

复制
相关文章

相似问题

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