yacc語法分析器#bison

實現(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程序,觀察結果:

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容