指数表达式Flex / Bison

时间:2014-01-31 20:45:34

标签: compiler-construction bison flex-lexer exponential

我在Flex / Bison中制作一个基本的计算器,我想做指数(^),但我目前的实现不起作用,有人可以告诉我为什么没有,以及如何解决它?

%{
    #include <stdio.h>
    #include <math.h>
    void yyerror(char *);
    int yylex(void);
    int symbol;
%}

%token INTEGER VARIABLE
%left '+' '-' '*' '/' '^'

%%

program:
    program statement '\n'
    | /* NULL */
    ;
statement:
    expression          { printf("%d\n", $1); }
    | VARIABLE '=' expression   { symbol = $3; }
    ;
expression:
        INTEGER

    | VARIABLE          { $$ = symbol; }
    | '-' expression        { $$ = -$2; }
    | expression '+' expression { $$ = $1 + $3; }
    | expression '-' expression { $$ = $1 - $3; }
    | expression '*' expression { $$ = $1 * $3; }
    | expression '/' expression { $$ = $1 / $3; }
    | expression '^' expression { $$ = $1 ^ $3; }
    | '(' expression ')'        { $$ = $2; }
    ;

%%

void yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
}
int main(void) {
    yyparse();
}

谢谢

2 个答案:

答案 0 :(得分:0)

^不是C中的指数运算符;这是xor。您需要使用数学库函数pow或编写自己的整数取幂函数。

答案 1 :(得分:0)

我认为这会起作用

 $$=pow($1,$3);

有关详细信息,请参阅:http://www-h.eng.cam.ac.uk/help/tpl/languages/flexbison/