Bison是一個語法分析器,bison和flex配合使用
可以將用戶提供的語法規則轉化成一個語法分析器
利用Bison,可以開發各種語言解釋器
Bison的輸入文件以.y作為后綴名
其語法文件的一般格式如下:
%{
Prologue
%}
Bison declarations
%%
Grammar rules
%%
Epilogue
使用兩個%%分隔符,將文件分為三個部分
Prologue定義動作中使用的類型和變量
Bison Declaration聲明了終結符號和非終結符號的名稱
還可以描述運算符的優先級以及各種符號的語義值的數據類型
Grammar rules定義了如何從各個部分構造每個非終結符
Epilogue可以包含要使用的任何代碼
回歸正題,windows下怎么安裝Bison呢?
Bison的下載地址為http://gnuwin32.sourceforge.net/packages/bison.htm
直接下載,點擊安裝即可
全都安裝好以后還要設置一下環境變量Path,即需要將Bison的安裝目錄添加到Path中
打開右鍵->我的電腦→屬性→高級系統設置->環境變量->系統變量->Path->編輯->新建->輸入Bison的安裝目錄具體到bin目錄下->確定
退出后,打開CMD,輸入bison - V,記住這里的v要大寫。若安裝成功就會顯示bison的相關信息
C:\>bison -V
bison (GNU Bison) 2.4.1
Written by Robert Corbett and Richard Stallman.
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
然后結合具體的例子——四則運算來看看bison的作用
首先,准備好flex的詞法文件cal.l:
另:flex的安裝請見https://www.cnblogs.com/ASE265/p/12337922.html
%{
# include "y.tab.h"
%}
%%
[0-9]+ {yylval = atoi(yytext);return T_NUM;}
[-/+*()^\n] {return yytext[0];}
[ \t\r\a]+ {/*ignore all space*/}
. {return 0;}
%%
int yywrap(void){
return 1;
}
然后是bison的語法分析文件cal.y文件
%{
#include <stdio.h>
int yylex();
void yyerror(const char* msg){}
%}
%token T_NUM
%left '+' '-'
%left '*' '/'
%%
S : S E '\n' {printf("ans=%d\n",$2);}
| /*enpty*/ {/*enpty*/}
;
E : E '+' E {$$ = $1+$3;}
| E '-' E {$$ = $1-$3;}
| E '*' E {$$ = $1*$3;}
| E '/' E {$$ = $1/$3;}
| T_NUM {$$ = $1;}
| '(' E ')' {$$ = $2;}
;
%%
int main(){
return yyparse();
}
然后,就是執行過程
首先bison -dyv cal.y
得到y.output,y.tab.c和y.tab.h這三個文件
然后執行詞法分析文件
flex cal.l
得到lex.yy.c文件
最后對c文件進行編譯
gcc lex.yy.c y.tab.c -o cal
得到可執行文件cal.exe
cal.exe就是我們的小型四則運算的編譯器
測試結果如下
D:\>cal.exe
2+3
ans=5
5*9
ans=45
1-5*7
ans=-34
4+(6-9)
ans=1
確實,相當於實現了一個小型的四則運算的編譯器