繁体   English   中英

有限域中的计算器语法

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

在NUM是令牌的情况下,但显然编译器说有冲突,reduce / reduce是因为在某些情况下E也可以是NUM,尽管它可以正常工作,但我想摆脱编译器警告。

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

不,不是。 情况并不明显。

- E- NUM均不正确。 正确的语法如下:

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

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

这是表达式的“终端”元素的可能规则。 自然地,用括号括起来的表达式会导致递归到最高规则:

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序列来计算的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM