我有一个工作计算器,除了一件事:一元操作员' - '。
必须在2个不同的情况下对其进行评估和处理:
对于案例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,尽管它有效但我想摆脱编译器警告..我跑出了想法。
答案 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
标记序列来计算计算的负整数。