使用Bison的Postfix计算器

时间:2012-12-16 22:30:39

标签: bison lex flex-lexer

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

以下是摘录:

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

1 个答案:

答案 0 :(得分:1)

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

相关问题