我正在用模算术实现一个简单的计算器(环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); }
;
这些规则不能按我想要的方式工作,所以我想出了上面介绍的解决方法。