有限域计算器语法
Grammar of calculator in a finite field
我有一个可以工作的计算器,除了一件事:一元运算符“-”。
必须在两种不同的情况下进行评估和处理:
- 当有这样的表达式时-(3+3)
- 没有时:-3
对于情况1,我想得到一个后缀输出 3 3 + -
对于案例 2,我只想在此字段中获得此标记的正确值,例如在 Z10 中它是 10-3 = 7.
我目前的想法:
E: ...
| '-' NUM %prec NEGATIVE { $$ = correct(-yylval); appendNumber($$); }
| '-' E %prec NEGATIVE { $$ = correct(P-); strcat(rpn, "-"); }
| NUM { appendNumber(yylval); $$ = correct(yylval); }
其中 NUM 是一个标记,但显然编译器说存在冲突 reduce/reduce 因为在某些情况下 E 也可以是 NUM,虽然它有效我想摆脱编译器警告..和我运行没主意了。
正常情况下,这应该实现为两个规则(伪代码,我不知道野牛语法):
这是表达式的 '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
个标记序列计算。
It has to be evaluated and dealt with in 2 difference cases:
不,不是。案例不明确。
- E
和- NUM
都不正确。正确的语法应该是这样的:
primary
: NUM
| '-' primary
| '+' primary /* for completeness */
| '(' expression ')'
;
我有一个可以工作的计算器,除了一件事:一元运算符“-”。
必须在两种不同的情况下进行评估和处理:
- 当有这样的表达式时-(3+3)
- 没有时:-3
对于情况1,我想得到一个后缀输出 3 3 + - 对于案例 2,我只想在此字段中获得此标记的正确值,例如在 Z10 中它是 10-3 = 7.
我目前的想法:
E: ...
| '-' NUM %prec NEGATIVE { $$ = correct(-yylval); appendNumber($$); }
| '-' E %prec NEGATIVE { $$ = correct(P-); strcat(rpn, "-"); }
| NUM { appendNumber(yylval); $$ = correct(yylval); }
其中 NUM 是一个标记,但显然编译器说存在冲突 reduce/reduce 因为在某些情况下 E 也可以是 NUM,虽然它有效我想摆脱编译器警告..和我运行没主意了。
正常情况下,这应该实现为两个规则(伪代码,我不知道野牛语法):
这是表达式的 '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
个标记序列计算。
It has to be evaluated and dealt with in 2 difference cases:
不,不是。案例不明确。
- E
和- NUM
都不正确。正确的语法应该是这样的:
primary
: NUM
| '-' primary
| '+' primary /* for completeness */
| '(' expression ')'
;