DOWHILE循環(huán)語句的翻譯程序設(shè)計(jì)簡單優(yōu)先法輸出四元式_第1頁
DOWHILE循環(huán)語句的翻譯程序設(shè)計(jì)簡單優(yōu)先法輸出四元式_第2頁
DOWHILE循環(huán)語句的翻譯程序設(shè)計(jì)簡單優(yōu)先法輸出四元式_第3頁
DOWHILE循環(huán)語句的翻譯程序設(shè)計(jì)簡單優(yōu)先法輸出四元式_第4頁
DOWHILE循環(huán)語句的翻譯程序設(shè)計(jì)簡單優(yōu)先法輸出四元式_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、(二)DO-WHILE循環(huán)語句的翻譯程序設(shè)計(jì)(簡單優(yōu)先法、輸出四元式)一、1.簡單優(yōu)先法的基本思想根據(jù)優(yōu)先關(guān)系的定義,將簡單優(yōu)先文法中各文法符號之間的這種關(guān)系用一個(gè)矩陣表示,稱作簡單優(yōu)先矩陣。PDA讀入一個(gè)單詞后,比較棧頂符號和該單詞的優(yōu)先級,若棧頂符號優(yōu)先級低于該單詞,繼續(xù)讀入;若棧頂符號優(yōu)先級高于或等于讀入符號,則找句柄進(jìn)行歸約,找不到句柄就繼續(xù)讀入。直到最后棧內(nèi)只剩下開始符號,輸入串讀到“”為止。此時(shí)識別正確。可分點(diǎn)描述如下:(1)、對句型中相鄰的文法符號規(guī)定優(yōu)先關(guān)系,以尋找句型中的句柄;(2)、規(guī)定句柄內(nèi)各相鄰符號之間具有相同的優(yōu)先級;(3)、規(guī)定句柄兩端符號優(yōu)先級要比位于句柄之外而又

2、和句柄相鄰的符號的優(yōu)先級高,以先歸約句柄;(4)、對于文法中所有符號,只要它們可能在某個(gè)句型中相鄰,就要為它們規(guī)定相應(yīng)的優(yōu)先關(guān)系,若某兩個(gè)符號永遠(yuǎn)不可能相鄰,則它們之間就無關(guān)系.2.簡單優(yōu)先矩陣用于表示文法符號之間的簡單優(yōu)先關(guān)系的矩陣。3.簡單優(yōu)先法的優(yōu)缺點(diǎn)優(yōu)點(diǎn):技術(shù)簡單,當(dāng)做簡單優(yōu)先矩陣是要求較短。缺點(diǎn):適用范圍小,分析表尺寸太大。二、源代碼實(shí)現(xiàn):#include<iostream>#define MAX 35#include<list>#include<string>#include<fstream>using namespace std;#

3、defineTABLE_LEN8#defineSTR_LEN256int zhlen;char sTableTABLE_LEN+1 = "+-*/()i#"/順序索引int ShipTableTABLE_LENTABLE_LEN = /優(yōu)先表 1, 1,-1,-1,-1, 1,-1, 1, 1, 1,-1,-1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1,-1,-1,-1,-1,-1, 0,-1,-2, 1, 1, 1, 1,-2, 1,-2, 1, 1, 1, 1, 1,-2, 1,-2, 1,-

4、1,-1,-1,-1,-1,-2,-1, 0;char X,a;char VN11='K','L','P','S','E','G','T','R','F','Q','0'char VT15='i','=','<','>','+','-','*','/','(',

5、9;)','d','w','','#','0'char p186="dLwS0","SP0","SP0","0","iQE0","TG0","+TG0","-TG0","0","FR0","*FR0","/FR0","0","(E)0&quo

6、t;,"i0","=0","<0",">0"char stackMAX;char queueMAX;int sp,front;intM1014= -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-

7、1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12,14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,;int f=0; int count=0;int c=0;char arr_iMAX;char varMAX; /表格管理int tdMAX; in

8、t t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arrMAX4;/存放待輸出的四元式/char keyword27="do0","while0"bool IsCharInStr(char c,char s)for(int i=0;si!='0'i+)if(si=c)return true;return false;int GetIndex(char s,char c)for(int i=0;si!='0'i+)if(c=si)return i;return -1;/str

9、ing GetSubString(char s,int from,int to)string st;for(int i=from;i<to;i+)st+=si;return st;/* 翻譯賦值表達(dá)式*/void translatefuzhi(char *sInput)/棧結(jié)構(gòu)的初始化char StackSTR_LEN=0;int index = 0;int top = 1;Stack0 = '#'list<char> rPolish;list<string> Num;int begin=0;while(sInputbegin!='=

10、9;)if(IsCharInStr(sInputbegin,sTable)cout<<"Equal expression is illegal!"<<endl;return ;begin+;Num.push_back(GetSubString(sInput,0,begin);int now = begin+1;int before = begin;rPolish.push_back('i');while(sInputnow!='0')if(IsCharInStr(sInputnow,sTable)char temp3=

11、0;if(now-before>1)temp0 = 'i'temp1 = sInputnow;Num.push_back(GetSubString(sInput,before+1,now);elsetemp0 = sInputnow;int i=0;while(tempi!=0)int left = GetIndex(sTable,Stackindex);int right = GetIndex(sTable,tempi);switch(ShipTableleftright)case -1:/移入Stacktop+ = tempi;index = top-1;i+;bre

12、ak;case 0:/脫括號if(Stackindex='(')Stacktop+ = ')'Stackindex = 'E'top = index+1;index-;else/規(guī)約if(top!=2)return;rPolish.push_back('=');list<char>:iterator iter;list<string>:iterator siter=Num.begin();string fuzhi256;int d=0,m;for(iter=rPolish.begin();iter!=rPo

13、lish.end();iter+)if(*iter='i')fuzhid+=*siter;siter+;elsefuzhid+=*iter;m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d<m;d+)cout<<"("<<fuzhid<<","<<op1<<","<<op2<<","<<"T"<<xiabiao<&l

14、t;")"<<endl;fuzhid = "T"fuzhid+=(xiabiao+'0');xiabiao+;/cout<<fuzhid;return;i+;break;case 1:/歸約if(Stackindex='i')rPolish.push_back('i');Stackindex = 'E'index-;elserPolish.push_back(Stackindex);Stackindex-1 = 'E'top = index;index

15、-=2;break; default:return;before=now;now+;int len(char str)int i=0;while(stri!='0')i+;return i;int index(char ch,char str)int i=0;while(stri!='0')if(ch!=stri)i+;else break;if(stri='0')return -1;return i;void err(int n)if(n=1)cout<<"字符不匹配"<<endl;else if(n

16、=2)cout<<"字符沒有出現(xiàn)在產(chǎn)生式中"<<endl;else if(n=3)cout<<"沒有找到合適的¨選產(chǎn)式"<<endl;else cout<<"該句子是文法語言的句子"<<endl;void print()cout<<"("if(count<10)cout<<'0'cout<<count<<")"int i;for(i=0;i<

17、;=sp;i+)cout<<stacki;for(;i<=20;i+)cout<<" "for(i=0;i<front;i+)cout<<" "for(;queuei!='#'i+)cout<<queuei;cout<<queuei;for(;i<=20;i+)cout<<" "void semantic()if(VTopr='=')arrd0='='arrd1=arr_iopd;arrd2=id;

18、arrd3='-'id+;else if(opr=-2)arrd0='='arrd1=id-1;arrd2=arr_iopd;arrd3='-'else arrd0=VTopr;arrd1=arr_iopd;arrd2=id;if(VTopr!='<'&&VTopr!='>')arrd3=id-1;else arrd3=id+1;id+;d+;void syntax()/語法分析int n;count+;print();X=stacksp;a=queuefront;if(X='#

19、'&&a='#')f=4;if(X<'A'|X>'Z')if(X=a)sp-;front+;if(a!='i')if(a!='d'&&a!='w'&&a!=''&&a!='#')opr=index(a,VT);semantic();else if(a=''|a='w'|a='#')opr=-2;semantic();cout<<

20、;'t'<<'''<<a<<"'匹配"<<endl;else opd=c;cout<<'t'<<'''<<arr_ic+<<"'匹配"<<endl;else f=1; else int tx=index(X,VN);int ta=index(a,VT);n=Mtxta;tdt+=Mtxta;if(ta=-1)f=2;cout<<a<&l

21、t;endl; else if(n=-1)f=3; else sp-;cout<<'t'<<X<<"->"if(len(pn)!=0)for(int i=len(pn)-1;i>=0;i-)stack+sp=pni;cout<<pnlen(pn)-1-i;cout<<endl;else cout<<"空串"<<endl;if(f=0)syntax();else tdt='-1'err(f);void lexical() /詞法分

22、析int i,j,d;char ch;j=d=0;for(i=0;vari!='#'i+)ch=vari;if(ch='d'&&vari+1='o')cout<<"do"<<'t'<<"keword"<<endl;queuej+='d'i+=1;else if(ch='w')ch=vari+1;if(ch='h')ch=vari+2;if(ch='i')ch=var

23、i+3;if(ch='l')ch=vari+4;if(ch='e')ch=vari+5;cout<<"while"<<'t'<<"keyword"<<endl;queuej+='w'i+=4;else if(index(ch,VT)<=0)if(ch!=''&&ch!=''&&ch!='('&&ch!=')')cout<&

24、lt;ch<<'t'<<"variable:i"<<d+<<""<<endl;arr_id-1=ch;queuej+='i'else cout<<ch<<'t'<<"bound"<<endl;else if(index(ch,VT)>0)cout<<ch<<'t'<<"operator"<<e

25、ndl;queuej+=ch;queuej='#'for(i=0;queuei!='#'i+)cout<<queuei;cout<<endl;int main()int i=0,j=0;int len,length;char temp;char S='K'sp=front=0;stack0='#'sp+;stack1='K'cout<<" *"<<endl;cout<<" * DO-WHILE循環(huán)語句 *"<&

26、lt;endl;cout<<" * (簡單優(yōu)先法輸出四元式) *"<<endl;cout<<" *"<<endl;ifstream table;table.open("dowhile.txt");if(!table)cout<<"error!"table.seekg(0,ios:end);length = table.tellg();table.seekg(0,ios:beg);while(length!=table.tellg()table.read(c

27、har*)&temp,1);vari=temp;i+;if(vari=' ')i-;if(vari='#')break;table.close();len=i;vari='0'cout<<"詞法分析"<<endl;lexical();char fuzhi20;int flag1,fuzhilen;int s=0;for(i=0;i<len;i+)if(vari='')flag1=i;fuzhilen=flag1-2;for(i=3;i<flag1;i+)fuzhis+=vari;fuzhis='#'char shuru;char zh100;int kaishi=0;zh0='d'for(kaishi=1;kaishi<s+1;kaishi+)zhkaishi=fuzhikaishi-1;zhkaishi+=&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論