-1

您好我一直在尝试创建一个简单的后缀计算器。

以下是片段:

    %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 - =>:语法错误!!为什么会这样?我应该怎么办 ?我什至尝试创建一个一元 + 运算符,但它没有意义。

4

1 回答 1

1

您应该升级您的词法分析器以将带符号的数字直接识别为数字。那么你不需要特殊规则'-' exp,或者%left NEG优先行。

于 2012-12-17T03:39:54.593 回答