我有一个工作计算器,除了一件事:一元运算符'-‘。
在两个不同的情况下,必须对其进行评估和处理:
对于案例1,我希望得到一个后缀输出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,因为在某些情况下E也可以是一个NUM,虽然它可以工作,但我想去掉编译器的警告。我的想法用完了。
发布于 2015-11-23 10:32:45
在两个不同的情况下,必须对其进行评估和处理:
不,没有。案子不清楚。
- E
和- NUM
都是错误的。正确的语法应该是这样的:
primary
: NUM
| '-' primary
| '+' primary /* for completeness */
| '(' expression ')'
;
发布于 2015-11-22 22:13:36
通常,这应该作为两个规则来实现(伪代码,我不知道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]+
一样的regexp。换句话说,它不解析减号-它总是一个正整数(或零)。负整数是通过匹配标记的'-' Number
序列来计算的。
https://stackoverflow.com/questions/33860689
复制相似问题