计算器语法在一个有限领域的

时间:2015-11-22 21:52:53

标签: parsing compiler-construction grammar bison

我有一个工作计算器,除了一件事:一元操作员' - '。

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

  1. 当有更进一步的表达时 - (3 + 3)
  2. 没有时:-3
  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是一个令牌,但显然编译器说有一个confict减少/减少,因为E在某些情况下也可能是NUM,尽管它有效但我想摆脱编译器警告..我跑出了想法。

2 个答案:

答案 0 :(得分:2)

  

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

不,不。案件并不明显。

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

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

答案 1 :(得分:0)

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

这是表达式的'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标记序列来计算计算的负整数。