我正在用模算术实现一个简单的计算器(环Z_p
,所以我知道{0, 1, 2, ..., p - 1}
哪里p
是素数)。如果输入是-x
我想p-x
在输出上打印正确的值。我的语法:
exp: num { std::cout << $1 << " "; $$ = $1; }
| '-' exp %prec NEG { $$ = negate($2); os << "~ "; } // for expressions
num:
MINUS NUMBER %prec NEG { $$ = negate($2); }
| NUMBER { $$ = $1; }
以前我有NUMBER
现在num
在哪里exp
。然后打印的东西x
而不是p-x
. 我没有看到任何其他方法可以做到这一点 - 我怎么知道在下一步我是否会有终端?所以我想出了这个。然而,它给了我关于减少/减少冲突的警告(好吧,我明白为什么),但它给出了正确的结果。
我的问题是:我怎样才能做得更好?我可以摆脱警告但仍然拥有我想要的东西吗?
编辑:
假设p
= 7。然后,如果我写-(8+5)
,我希望输出(反向波兰符号)1 5 +
为8mod7=1
. 这可以通过中的第二条规则来处理exp
。但是,如果我写-5
,那么我想显示2
它是正确的值。这不能仅通过规则来完成,exp
因为我在那里打印了确切的数字:
exp:
NUMBER { std::cout << $1 << " "; $$ = $1; } /* value of rule is $1 */
| exp PLUS exp { $$ = add($1, $3); std::cout << "+ "; }
| MINUS exp %prec NEG { $$ = negate($2); }
;
这些规则不能按我想要的方式工作,所以我想出了上面介绍的解决方法。