yacc语法分析器#bison

实现一个简单的表达式计算器,要求能进行加、减、乘、除、幂运算,注意优先级。写出详细的步骤和源程序。

第一步:

安装bison(sudo apt-get install bison)

第二步:

编辑cal.l程序并保存,内容如下:

%{

#include

#include

#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
#include

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程序,观察结果:

你可能感兴趣的:(yacc语法分析器#bison)