Compiler construction 指数表达式Flex/Bison

Compiler construction 指数表达式Flex/Bison,compiler-construction,bison,flex-lexer,exponential,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 '+' '-' '*' '/' '^' %%

我正在用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();
}
%{
#包括
#包括
无效错误(字符*);
int yylex(无效);
整数符号;
%}
%令牌整数变量
%左'+''-''*''/''^'
%%
节目:
程序语句'\n'
|/*空*/
;
声明:
表达式{printf(“%d\n”,$1);}
|变量“=”表达式{symbol=$3;}
;
表达方式:
整数
|变量{$$=symbol;}
|“-”表达式{$$=-$2;}
|表达式“+”表达式{$$=$1+$3;}
|表达式“-”表达式{$$=$1-$3;}
|表达式“*”表达式{$$=$1*$3;}
|表达式“/”表达式{$$=$1/$3;}
|表达式“^”表达式{$$=$1^$3;}
|“(“表达式”)”{$$=$2;}
;
%%
无效错误(字符*s){
fprintf(标准字符,“%s\n”,s);
}
内部主(空){
yyparse();
}

谢谢

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

我认为这会起作用

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

有关更多详细信息,请参阅:

好的,现在它给了我一个“对pow的未定义引用”,但我已经包括了我得到的。显然,您必须使用标志-lm进行编译。除了生成一个makefile之外,还有其他方法吗?@Nelson.b.austin:你可以记住每次编译时都要键入-lm,但是
make
实用程序就是为这类事情设计的,所以我推荐它。请注意,您实际上并不需要makefile;您只需设置环境变量LDLIBS:
export-LDLIBS=-lm
。然后,默认的
make
规则应该可以工作,尽管它可能并不完全是您想要构建东西的方式。(如果您还需要编译flex文件,那么您需要一个真正的makefile。)请注意标记;flex用于UI框架;Flex lexer用于词法分析器。求幂运算符是右关联的,而不是左关联的。