實現(xiàn)一個簡單的表達式計算器,要求能進行加、減、乘、除、冪運算,注意優(yōu)先級。寫出詳細的步驟和源程序。
第一步:
安裝bison(sudo apt-get install bison)
第二步:
編輯cal.l程序并保存,內(nèi)容如下:
%{
#include<stdlib.h>
#include<stdio.h>
#include "calc.tab.h" //這是下一步中使用bison生成的頭文件
%}
%%
[a-z] {yylval=*yytext-'a';return VARIABLE;}
[0-9]+ {yylval=atoi(yytext);return INTEGER;}
[-+()=/*^\n] {return *yytext;}
[\t] ;
%%
int yywrap(void)
{
return 1;
}
第三步:
編輯cal.y程序并保存,內(nèi)容如下:
%token INTEGER VARIABLE
%left '+' '-' //越往下,優(yōu)先級越高
%left '*' '/'
%left '^'
%{
#include<stdio.h>
#include<math.h>
void yyerror(char*);
int yylex(void);
int sym[26];
%}
%%
program:program statement '\n'
| ;
statement:
expr {printf("%d\n",$1);}
|VARIABLE'='expr {sym[$1]=$3;}
; //$1為第一個匹配串,即VARIABLE;$3為expr
expr:
INTEGER
|VARIABLE'='expr {sym[$1]=$3;};
expr:
INTEGER
|VARIABLE {$$=sym[$1];} //$$為規(guī)約后的串,即expr
|expr'+'expr {$$=$1+$3;}
|expr'-'expr {$$=$1-$3;}
|expr'*'expr {$$=$1*$3;}
|expr'/'expr {$$=$1/$3;}
|expr'^'expr {$$=pow($1,$3);}
|'('expr')' {$$=$2;}
%%
void main()
{
yyparse();
}
void yyerror(char *msg)
{
printf("error is %s",msg);
}
第四步:
使用bison編譯calc.y程序生成calc.tab.h以及calc.tab.c,命令如下
bison -d calc.y
第五步:
使用flex編譯calc.l程序,生成cal.lex.c程序,命令如下:
Flex -o cal.lex.c calc.l
第六步:
使用gcc編譯鏈接calc.tab.c和calc.lex.c,并鏈入math庫(冪函數(shù)pow()的使用需要math庫),生成calc可執(zhí)行文件。

第七步:
運行calc程序,觀察結果:
