資源描述:
《基于算符優(yōu)先分析方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、基于算符優(yōu)先分析方法的表達(dá)式語法分析器年級(jí):2007級(jí)班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)四班姓名:毛群暉學(xué)號(hào):20074042154指導(dǎo)老師:段明秀年月日摘要:算符優(yōu)先分析法是Floyd在1963年首先提出來的,是一種古典而又實(shí)用的方法,用這種方法在分析程序語言中的各類表達(dá)式時(shí)尤為有效。不少編譯程序中都使用這種方法分析表達(dá)式。算符優(yōu)先分析法就是仿照算術(shù)表達(dá)式的運(yùn)算過程而提出的一種自底向上的語法分析方法。其基本思想是:首先規(guī)定算符,這里是文法的終極符之間的優(yōu)先關(guān)系,然后根據(jù)這種優(yōu)先關(guān)系,通過比較相鄰算符的優(yōu)先次序來確定句型中的“句柄”,然后進(jìn)行歸約。算符優(yōu)先分析法的關(guān)鍵:算符優(yōu)先分析
2、法的關(guān)鍵就是尋找當(dāng)前句型中的最左素短語,并歸約它。關(guān)鍵字:小于、大于、等于、句柄、歸約、一、對(duì)表達(dá)式文法G[E’]構(gòu)造算符優(yōu)先關(guān)系表。計(jì)算算符優(yōu)先只針對(duì)于終結(jié)符,終結(jié)符之間的優(yōu)先關(guān)系有三種,在計(jì)算優(yōu)先關(guān)系之前我們先定義兩個(gè)集合,對(duì)于任意兩個(gè)終結(jié)符(a,b)FIRSTVT(B)={b
3、B=>b…或B=>Cb…},其中…表示V*中的符號(hào)串。LASTVT(B)={a
4、B=>…a或B=>…aC}三種優(yōu)先關(guān)系:(1)等于關(guān)系:可直接查看產(chǎn)生式的右部,對(duì)如下形式的產(chǎn)生式A->…ab…A->…aBb…則有a=b成立。(2)小于關(guān)系:求出每個(gè)非終結(jié)符B的FIRSTVT(B),觀察如下形
5、式的產(chǎn)生式A->…aB…對(duì)每一b∈FIRSTVT(B)有a≮b成立(3)大于關(guān)系:計(jì)算每個(gè)非終結(jié)符B的LASTVT(B),觀察如下形式的產(chǎn)生式A->…Bb…對(duì)每一a∈LASTVT(B)有a≯b成立表達(dá)式文法G[E’]:E’→#E#E→E+Q
6、QQ→Q-T
7、TT→T*F
8、FF→F/M|MM→M^P|PP→(E)|i根據(jù)上面的規(guī)則手工構(gòu)造上述文法的算符優(yōu)先表如下:+-*/^()i#+≯≮≮≮≮≮≯≮≯-≯≯≮≮≮≮≯≮≯*≯≯≯≮≮≮≯≮≯/≯≯≯≯≮≮≯≮≯^≯≯≯≯≯≮≯≮≯(≮≮≮≮≮≮=≮)≯≯≯≯≯≯≯i≯≯≯≯≯≯≯#≮≮≮≮≮=packagecom.op.co
9、re;/********************************************************************************簡單表達(dá)式文法G[E’]構(gòu)造算符優(yōu)先關(guān)系表。*E’→#E#*E→E+Q
10、Q*Q→Q-T
11、T*T→T*F
12、F*F→F/M|M*M→M^P|P*P→(E)|i*@author*/publicclassPriorityTable{privatestaticchartable[][]={//+*/i()#^{'>','<','<','<','<','>','>','<'},//+{'>','>','>','<',
13、'<','>','>','<'},//*{'>','>','>','<','<','>','>','<'},///{'>','>','>','$','$','>','>','>'},//i{'<','<','<','<','<','=','$','<'},//({'>','>','>','$','$','>','>','>'},//){'<','<','<','<','<','$','=','<'},//#{'>','>','>','<','<','>','>','<'},//^};//算符優(yōu)先表/************************************
14、****************************************判斷一個(gè)符號(hào)在算符優(yōu)先表中位置**@paramc*@return*/privatestaticintjudgePriority(charc){intpriority=0;switch(c){case'+':priority=0;break;case'*':priority=1;break;case'/':priority=2;break;case'i':priority=3;break;case'(':priority=4;break;case')':priority=5;break;cas
15、e'#':priority=6;break;case'^':priority=7;break;}returnpriority;}/***判斷兩個(gè)算術(shù)符的優(yōu)先級(jí)**@paramm*為符號(hào)棧的棧頂元素*@paramn*為當(dāng)前輸入算術(shù)符*@return*/publicstaticchargetPriority(charm,charn){returnPriorityTable.table[judgePriority(m)][judgePriority(n)];}}二、根據(jù)算符優(yōu)先表用棧結(jié)構(gòu)來實(shí)現(xiàn)算符優(yōu)先分析設(shè)置兩個(gè)棧:存放運(yùn)算符的OPTR棧和存放