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 -Vbison (GNU Bison) 2.4.1Written 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 NOwarranty; 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.exe2+3ans=55*9ans=451-5*7ans=-344+(6-9)ans=1
確實,相當于實現了一個小型的四則運算的編譯器
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
請問如何用UG做流體分析,謝謝?高級仿真里Thermal Flow1.建立約束模型2.對流體區域進行建模Cast里有個小例子~學習了UG設計還有必要學習模流分析嗎?模流分析是模具設計的輔助工具,剛開始做設計的時候可以不用模流分析,一般大型企業有專業的模流分析工程師。如果做了3年以上的設計時,有時間的情況下可以學習一下模流分析。在三維畫圖軟件中,proe、UG和Solidworks,你認為哪個符合你...
compareto比較大小規則?從兩個字符串的第一個字符開始,逐個進行比較(根據字符的ASCII值),直到出現不同的字符或遇到“0”。如果所有字符相同,則認為兩個字符串相等,并返回0;如果有不同的字符,則以第一個不同字符的比較結果為準;如果前一個字符大于后一個字符,則返回1;否則返回-1。compareTo和comparetoIgnorecase有啥區別?CompareTo:comparecomp...
華縣隸屬安陽市。1.河南省直管縣華縣位于河南省北部,與濮陽、安陽、鶴壁、新鄉接壤。南距鄭州130公里,北距安陽70公里,東北距濮陽53公里,西南距新鄉70公里。2.滑縣位于河南省北部平原,隸屬安陽市。目前是省直管縣,與濮陽、演金、??h、長垣、封丘、內黃接壤。北距安陽70km,東北距濮陽53km,西南距新鄉70km,西北距鶴壁新城25km。河南的滑縣屬于哪個市?河南省直管縣滑縣?;h是河南省直屬縣,...