实现一个简单的表达式计算器,要求能进行加、减、乘、除、幂运算,注意优先级。写出详细的步骤和源程序。
第一步:
安装bison(sudo apt-get install bison)
第二步:
编辑cal.l程序并保存,内容如下:
%{
#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程序并保存,内容如下:
%token INTEGER VARIABLE
%left '+' '-' //越往下,优先级越高
%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];} //$$为规约后的串,即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库(幂函数pow()的使用需要math库),生成calc可执行文件。
第七步:
运行calc程序,观察结果:
网友评论