您好我一直在尝试创建一个简单的后缀计算器。
以下是摘录:
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG /* negation--unary minus */
%right '^' /* exponentiation */
%% /* Grammar rules and actions follow. */
input:
/* empty */
| input line
;
line:
'\n'
| exp '\n' { printf ("%.10g\n", $1); }
;
exp:
NUM { $$ = $1; }
| '-' exp %prec NEG { $$ = -$2; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
| exp exp '^' { $$ = pow ($1, $2); } /* Exponentiation */
| exp 'n' { $$ = -$1; } /* Unary minus */
;
%%
1 2 + 3 - => 0 \n
1 -2 - => 3 \n
2 3e+2 + 3 - => 299 \n
1 2 3 + - => -4 \n
仅限1 + 2 - => :语法错误!为什么会这样呢?我该怎么办 ?我甚至试过创建一个一元+运算符,但它没有意义。
答案 0 :(得分:1)
您应该升级词法分析器,直接将带符号的数字识别为数字。然后,您不需要'-' exp
或%left NEG
优先行的特殊规则。