[英]Grammar of calculator in a finite field
除了一件事之外,我还有一个工作的计算器:一元运算符“-”。
必须在两种不同的情况下对它进行评估和处理:
对于情况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.