【问题标题】:Grammar of calculator in a finite field有限域中的计算器语法
【发布时间】:2015-11-22 21:52:52
【问题描述】:

除了一件事之外,我还有一个可以工作的计算器:一元运算符'-'。

必须在两种不同的情况下进行评估和处理:

  1. 当有一些表达式进一步像这样 -(3+3)
  2. 当没有时:-3

对于案例 1,我想得到一个后缀输出 3 3 + - 对于案例 2,我想在此字段中获取此标记的正确值,例如在 Z10 中为 10-3 = 7。

我目前的想法:

E:  ...
    |   '-' NUM %prec NEGATIVE      { $$ = correct(-yylval); appendNumber($$);          }
    |   '-' E %prec NEGATIVE        { $$ = correct(P-$2); strcat(rpn, "-");                                 }
    |   NUM     { appendNumber(yylval); $$ = correct(yylval); }

其中 NUM 是一个标记,但显然编译器说存在冲突减少/减少,因为 E 在某些情况下也可以是 NUM,尽管它有效,但我想摆脱编译器警告......我用完了想法。

【问题讨论】:

  • E can also be a NUM in some cases - 对,那你为什么还需要第一条规则呢?
  • 因为我必须做不同的事情,以防'-'之后只有标记 NUM,而当'-'之后有整个表达式时,我必须做不同的事情
  • 编辑代码以使差异更清晰
  • 对于案例 2,为什么不使用相同的 rpn 输出? (即:3 - )。您只需删除第一条规则即可获得此信息。
  • 因为 -(2+2) 无法识别。

标签: parsing compiler-construction grammar bison


【解决方案1】:

必须在两种不同的情况下进行评估和处理:

不,它没有。情况并不明显。

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

primary
    : NUM
    | '-' primary
    | '+' primary /* for completeness */
    | '(' expression ')'
    ;

【讨论】:

  • 正如您在问题中看到的那样,它们在我的用例中是不同的。
  • 不,我看不到你的问题。我所能看到的只是不一致,这让了解有限域的人感到惊讶。
  • 我只是想变得聪明一点,一次实现三件事,但我问教授,他说这样是不可能的,或者必须写得不好,所以..无论如何,谢谢寻找答案。
【解决方案2】:

一般情况下,这应该实现成两条规则(伪代码,我不懂bison语法):

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

Element => Number
           | '(' Expression ')'

一元减号(还有一元加号!)仅在产生式堆栈的上一级(语法规则):

Term =>    '-' Element
           | '+' Element
           | Element

当然,这可以分解为所有可能的组合,例如'-' Number'-' '(' Expression ')',同样可以使用'+',并且根本不需要任何一元运算符。

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

Expression => Expression '+' MultiplicationExpr
              | Expression '-' MultiplicationExpr
              | MultiplicationExpr

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

为了完整起见:

终端:

  • Number

非终端:

  • Expression
  • Element
  • Term
  • MultiplicationExpr

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

【讨论】:

  • 你能加点东西吗?我知道我可以区分“'-' TOKEN”和“TOKEN”,但我必须在上一级区分'“'-' TOKEN”'和'“'-' EXPRESSION”'。像.. 'if expression == token' 会很棒
  • 记号是记号,不是表达式。会扩大我的答案。
  • 嗯,这是嵌入在较低级别的生产中。这样的设计有什么问题?
  • 我开始认为您看到了一个不存在的问题。 Number 只是 从不 包含 - 符号本身。我概述的语法没有歧义。这就是表达式解析在实际编译器中工作的方式,并且它符合数学规则。
  • @adaPlease 这不是什么特例。这是一元减号。这方面的语法比比皆是。你不需要重新发明这个轮子。大约在 1959 年解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多