windows下bison的安裝與入門


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

確實,相當於實現了一個小型的四則運算的編譯器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM