有限域计算器语法

Grammar of calculator in a finite field

我有一个可以工作的计算器,除了一件事:一元运算符“-”。

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

  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-); strcat(rpn, "-");                                 }
    |   NUM     { appendNumber(yylval); $$ = correct(yylval); }

其中 NUM 是一个标记,但显然编译器说存在冲突 reduce/reduce 因为在某些情况下 E 也可以是 NUM,虽然它有效我想摆脱编译器警告..和我运行没主意了。

正常情况下,这应该实现为两个规则(伪代码,我不知道野牛语法):

这是表达式的 'terminal' 元素的可能规则。自然地,带括号的表达式会导致递归到最上面的规则:

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 个标记序列计算

It has to be evaluated and dealt with in 2 difference cases:

不,不是。案例不明确。

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

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