版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
鄭州經(jīng)工業(yè)學(xué)院
課程設(shè)計(jì)說明書
題目:將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大實(shí)驗(yàn)
姓名:_______________
院(系):計(jì)算機(jī)與通信工程學(xué)院
專業(yè)班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)10-01
學(xué)號(hào):_____________
指導(dǎo)教師:馬吉明_______________
成績(jī):___________________
時(shí)間:2013年6月17日至2013年6月日
鄭州輕工業(yè)學(xué)院
課程設(shè)計(jì)任務(wù)書
題目將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大實(shí)驗(yàn)__________
專業(yè)、班級(jí)計(jì)算機(jī)科學(xué)與技術(shù)10-01學(xué)號(hào)
姓名_______________
主要內(nèi)容
自選一種常見高級(jí)語言為背景,對(duì)其進(jìn)行簡(jiǎn)化.例如只包括整型常數(shù)和
其四則運(yùn)算以及相應(yīng)的賦值語句,轉(zhuǎn)移語句,條件語句和最簡(jiǎn)單的輸入輸出
語句等.編制一個(gè)包括必要處理階段(詞法分析、語法分析、語義分析、代
碼生成)簡(jiǎn)化又完整的編譯程序。
基本要求
(1)寫出符合給定的語法分析方法的文法及屬性文法。
(2)完成題目要求的中間代碼四元式的描述。
(3)寫出給定的語法分析方法的思想,完成語法分析和語義分析程序設(shè)計(jì)。
編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過所設(shè)計(jì)的分析程序。
主要參考資料
《程序設(shè)計(jì)語言編譯原理》陳火旺編著國(guó)防工業(yè)出版社
《編譯原理》呂映芝張素琴蔣維杜編著清華大學(xué)出版社
完成期限:2013年6月21日
指導(dǎo)教師簽名:___________________
課程負(fù)責(zé)人簽名:___________________
年月日
目錄
1緒論....................................................2
1.1設(shè)計(jì)目的...........................................2
1.2設(shè)計(jì)要求..........................................2
1.2.1算法過程......................................2
1.2.2主流程圖......................................2
1.3設(shè)計(jì)內(nèi)容...........................................3
1.3.1題目..........................................3
1.3.2內(nèi)容..........................................3
2總體設(shè)計(jì)................................................3
2.1算法描述...........................................4
2.2函數(shù)說明和數(shù)據(jù)結(jié)構(gòu).................................4
3詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)..........................................5
3.1詞法分析...........................................5
3.2語法分析..........................................7
3.3代碼生成器........................................9
3.4結(jié)果...............................................9
4參考文獻(xiàn)...............................................11
5心得體會(huì)...............................................11
6附錄代碼...............................................11
1緒論
1.1設(shè)計(jì)目的
《編譯原理》是理論與實(shí)踐并重的課程,而其實(shí)驗(yàn)課要綜合運(yùn)用所學(xué)的多門
課程的內(nèi)容,用來完成一個(gè)小型編譯程序。從而鞏固和加強(qiáng)對(duì)詞法分析、語法分
析、語義分析、代碼生成和報(bào)錯(cuò)處理等理論的認(rèn)識(shí)和理解;培養(yǎng)學(xué)生對(duì)完整系統(tǒng)
的獨(dú)立分析和設(shè)計(jì)的能力,進(jìn)一步培養(yǎng)學(xué)生的獨(dú)立編程能力。
1.2設(shè)計(jì)要求
1.2.1算法過程
詞法分析程序少語法分析程序今語義分析程序9編譯器。不斷完
善,不斷改進(jìn)。漸變的過程。
1.2.2主流程圖
1.3設(shè)計(jì)內(nèi)容
1.3.1題目
將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大實(shí)驗(yàn)
1.3.2內(nèi)容
涉及詞法分析、自下而上語法分析程序的實(shí)現(xiàn):SLR(1)分析器的實(shí)
現(xiàn)以及生成中間代碼。
2總體設(shè)計(jì)
2.1算法描述
語法分析階段的基本任務(wù)是將詞法分析階段產(chǎn)生的二元組作為輸入,根
據(jù)語言的語法規(guī)則,識(shí)別出各種語法成分,并判斷該單詞符號(hào)序列是否是該
語言的一個(gè)句子。
在語法分析階段,采用自上而下的遞歸下降分析法,根據(jù)遞歸下降分析
函數(shù)編寫規(guī)則來編寫相應(yīng)的函數(shù),在各個(gè)函數(shù)的分析過程中調(diào)用詞法分析程
序中的掃描程序,發(fā)出“取下一個(gè)單詞符號(hào)”的命令,以取得下一個(gè)單詞符
號(hào)的語法分析。
詞法分析和語法分析的整體設(shè)計(jì)思想可由以下圖示表示:
單詞符號(hào)
詞
語
法
法
字符
分
字符串表示的源程序分
析
析
器
器
取一下個(gè)
單詞符號(hào)
語法分析是在詞法分析的基礎(chǔ)上加上判斷是否符合語法規(guī)則的語句。語法
分析的基本任務(wù)是使用詞法分析的結(jié)果,使用遞歸下降算法分析是否符合語法
規(guī)則,如果符合,則輸出“分析成功”,若果不符合,則輸出“分析失敗”。
2.2函數(shù)說明和數(shù)據(jù)結(jié)構(gòu)
在main函數(shù)調(diào)用e()函數(shù),如果調(diào)用之后返回時(shí),如果
((flags[temp]==O)&&is_right)為真,就輸出"分析成功”,否則輸出“分析
失敗”。其中isjight為設(shè)定的標(biāo)志,初值為1,如果在調(diào)用子函數(shù)的過程中
如果有錯(cuò)誤,則置is_right為Oo
e函數(shù):調(diào)用t函數(shù),調(diào)用f函數(shù),調(diào)用p函數(shù),返回后看是否是'+'或'
」,如果是,則調(diào)用el函數(shù),再調(diào)用e2函數(shù),如果不是,進(jìn)行出錯(cuò)處理,
置is_right為Oo
el函數(shù):判斷是不是“+”或者“-”如果是,調(diào)用f函數(shù),如果不是,
進(jìn)行出錯(cuò)處理,置isright為0。
t函數(shù):調(diào)用f函數(shù),調(diào)用P函數(shù),返回后看是否是‘*'或'如果是,
則調(diào)用tl函數(shù),再調(diào)用t2函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right
為Oo
tl函數(shù):判斷是不是"*"或者“/”如果是,調(diào)用f函數(shù),如果不是,
進(jìn)行出錯(cuò)處理,置is_right為Oo
f函數(shù):調(diào)用p函數(shù),fl函數(shù)。
門函數(shù):判斷是不是“,如果是,調(diào)用f函數(shù),如果不是,進(jìn)行出錯(cuò)處
理,置is_right為Oo
P函數(shù):檢查是否標(biāo)識(shí)符,如果是,調(diào)用fl函數(shù),如果不是,檢查是否
是數(shù)值,如果是,調(diào)用fl函數(shù),如果不是,檢查是否是‘(’,如果不是,進(jìn)
行出錯(cuò)處理,置is_right為Oo如果是,調(diào)用e函數(shù),返回后檢查是否是‘)',
如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。如果是,調(diào)用門函數(shù),返回。
3詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)
3.1詞法分析
首先定義結(jié)構(gòu)體
typedefstruct〃狀態(tài)棧
(
intdata[max];
inttop;
}seqstackl;
typedefstruct〃符號(hào)棧
(
stringdata[max];
inttop;
}seqstack2;
structreserveedword〃保留字表結(jié)構(gòu)
stringword;
charvalue;
}reserveedwordl[maxsize];
structidentifer〃標(biāo)識(shí)符表結(jié)構(gòu)
charidentiname[15];
charidentitype[15];
intaddress;
}identiferl[maxsize];
structconstant〃常量表結(jié)構(gòu)
stringconstantname;
stringvalue;
intconstantaddress;
}constantl[maxsize];
詞法分析主要函數(shù)結(jié)構(gòu):
voidInitscannerO〃該函數(shù)用于用C語言當(dāng)中常見的關(guān)鍵字初始
化保留表
voidIsalpha(chars)〃用于判斷讀入的字符是不是字母
voidIsnumber(chars)〃用于判斷讀入的字符是不是數(shù)字
voidIsother(chars)〃判斷除數(shù)字與字母之外的其他字符
voidLexscanO〃用于循環(huán)從程序中讀入字符并判斷應(yīng)調(diào)用那
個(gè)判斷函數(shù)字符
voidOutput(inti,intj,charss[15])//輸出二元式
本模塊程序的偽代碼如下:
打開文件
in("input.txtz,,ios::in);
if(!infile)
cerr<<“讀取的文件打開失?。 薄秂ndl;
exit(1);
初始化保留字表
Initscanner();
循環(huán)讀入從文件當(dāng)中
Scanner()
(
while(ch!='#')
(
在該函數(shù)中判斷應(yīng)該調(diào)用的判斷函數(shù)
Lexscan()
(
in(ch);
if(((ch>=,A")&&(ch<=,Z"))||((ch>=,a)&&(ch<=,z')))
Isalpha(ch){Output};
elseif((ch>='O')&&(ch<=’9'))
Isnumber(ch){Output);
else
Isother(ch){Output};
)
)
)
關(guān)閉文件
in();
詞法分析器中從源文件讀出一個(gè)單詞,判斷其類型是關(guān)鍵字、標(biāo)識(shí)符還
是普通符號(hào),根據(jù)其類型為結(jié)構(gòu)體各項(xiàng)賦值,并將其傳給語法分析函數(shù)。
3.2語法分析
由于說明語句與算術(shù)表達(dá)式和賦值語句所使用的是不同的文法,所以兩
者的ACTION表和GOTO表也不一樣,本次課設(shè)采用二維數(shù)組存放ACTION表和
GOTO表信息,其中移進(jìn)用大于0的數(shù)表示,歸約用小于0的數(shù)表示,成功用
100表示(acc),其他處用0表示,查表時(shí)遇到相應(yīng)的數(shù)進(jìn)行相應(yīng)的操作。
根據(jù)狀態(tài)轉(zhuǎn)換圖(DFA)構(gòu)造SLR(l)分析表:
其中說明文法和算術(shù)文法分別構(gòu)造,同時(shí)在每個(gè)表當(dāng)中既有action表又
有g(shù)oto表
intanalysis_tablel[10][8]={3,4,0,0,0,0,2,1,
0,0,0,0,0,100,0,0,
0,0,5,6,0,0,0,0,
0,0,0,0,7,0,0,0,
0,0,0,0,8,0,0,0,
0,0,0,0,0,—1,0,0,
0,0,0,0,9,0,0,0,
0,0,~2,~2,0,0,0,0,
0,0,~3,~3,0,0,0,0,
0,0,-4,-4,0,0,0,0};
intanalysis_table2[17][13]={0,2,0,0,0,0,0,0,0,0,1,0,0,
100,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,4,5,
0,0,0,0,10,11,0,0,0,0,0,0,0,
0,0,0,0,-3,-3,12,0,-3,0,0,0,0,
0,0,0,0,-5,~5,-5,0,-5,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,13,5,
0,0,0,0,_8,-8,-8,0,-8,0,0,0,0,
0,0,0,0,~7,~7,~7,0,-7,0,0,0,0,
-1,0,0,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,0,14,
0,9,0,8,0,0,0,7,0,15,0,0,0,
0,0,0,0,0,11,0,0,16,0,0,0,0,
0,0,0,0,_2,-2,12,0,-2,0,0,0,0,
0,0,0,0,-4,_4,-4,0,-4,0,0,0,0,
0,0,0,0,-6,-6,-6,0,-6,0,0,0,0};
3.3代碼生成器
令算法描述:
下面以簡(jiǎn)單算術(shù)表達(dá)式語句的翻譯為例詳細(xì)說明算法設(shè)計(jì)。
實(shí)現(xiàn)簡(jiǎn)單算術(shù)表達(dá)式的翻譯一般采取下列步驟:
>分析文法。
>設(shè)置一系列語義變量,定義語義過程,語義函數(shù)。
>設(shè)計(jì)算術(shù)表達(dá)式的遞歸下降子程序的程序分析算法。
令函數(shù)說明和數(shù)據(jù)結(jié)構(gòu):
Strn用來存放臨時(shí)變量的序號(hào)。
temp用來存放數(shù)組的下表,在主程序中語法分析結(jié)束后,置0.
定義函數(shù)newtempO用于門生一個(gè)新的臨時(shí)變量的名字,具體實(shí)現(xiàn)時(shí)每
產(chǎn)生一個(gè)T,就及時(shí)送到符號(hào)表中,也可以不進(jìn)符號(hào)表,直接將單詞值用
整數(shù)碼表示。
定義函數(shù)siyuan(),輸出一個(gè)四元式。
定義函數(shù)ye()進(jìn)行中間代碼生成
3.4結(jié)果
一?*????語法語義分析情況一??????
狀態(tài)棧符號(hào)棧語義棧動(dòng)作說明
0一action[0?int1=S3桃態(tài)3人棧
03ttintaction[3,id]=S7狀態(tài)7人棧
037ttintid—用id歸匏goto[0,DJ=2
02MDaction[2,.]=S6狀態(tài)6人棧
026肛action[6,id]=S9狀態(tài)9人棧
0269嘰id用D->D,id歸約gotoC0,DJ=2
02#Daction[2,;J=S5狀態(tài)5人棧
025ttD;—用S->D;歸約goto[0,S]=1
01ttS分析成功!
3tt—action[0,id]=S?注態(tài)々入我
32ttid_action[2,=]=S3狀態(tài)力
323#id=_action[3,num]=S8狀態(tài)8人棧
3238ttid=nun用F->num歸約goto13.F]=6
3236ttid=F一3用T->F歸為goto[3,T]=5
3235ttid=T_3用E->T歸約goto13,E]=4
3234ttid=E_3action14,;]=S10狀態(tài)i0入棧
323410ttid=E;_3_用*>id=E;歸約goto[0,AJ=1
31MA分析成功!
0州_action10.id]=S2注態(tài)2人棧
02ttid__action[2,=]=S3狀態(tài)3入棧
023ttid=action13.id]=S9狀態(tài)9人棧
0239#id=id用F->id歸約goto[3,F]=6
6236ttid=F___i*由T->F歸約goto13.TJ=5
0235ttid=T___ractionl:5.*]=S12狀態(tài)12入骨
023512ttid=T*___r_action[12,id]=S9狀態(tài)9人棧
0235129#id=T*id_r用F->id歸")gotoH2,FJ=15
02351215#id=T*F_i*_r用T->T疝歸約goto[3,T]=5
0235ttid=T_T1用E->T歸約got?H3.E]=4
0234ttid=E_T1action[4,?]=S11狀態(tài)11入骨
023411ttid=E+T1action[11,id]=S9狀態(tài)9人棧
0234119#id=E+id_Tl_用F->id歸約goto[11,F]=6
0234116ttid=E+F_Tl_r用T->P歸約gotoCU,T]=:L4
02341114ttid=E+T_Tl_y用E->E+T歸約goto[3,E]=4
0234ttid=E_T2action[4,;]=S10狀態(tài)10人棧
023410#id=E;T2用A->id=E;歸約goto[0,A]=l
01_ai*ea一一一分更四也一—一一――
生成的二元式為:
<int
<id,0>
〈一一〉
<numJ.0>
<id,0>
<id,l>
—
生成的標(biāo)識(shí)符表為:
nametypeualueaddress
0areaint
1rint
生成的常數(shù)表為:
valuetypenameaddress
03
產(chǎn)生的四元式為
<=,3,_,r>
<+,Tl,r,T2>
<=,T2,_,ai*ea>
4參考文獻(xiàn)
《程序設(shè)計(jì)語言編譯原理》陳火旺編著國(guó)防工業(yè)出版社
《編譯原理》呂映芝張素琴蔣維杜編著清華大學(xué)出版社
《編譯原理》AlfredV.Aheo等李建中譯機(jī)械工業(yè)出版社
5心得體會(huì)
剛拿到課設(shè)題目的時(shí)候,感覺很難,沒有頭緒。雖然之前實(shí)驗(yàn)時(shí)候,詞法
分析程序和語法分析程序的代碼都是自己一個(gè)一個(gè)敲的。但是后來發(fā)現(xiàn),更難
的東西在后邊。接下來熟悉了一下原先寫的代碼,然后開始繼續(xù)后邊的部分。
個(gè)人認(rèn)為這次課設(shè)的機(jī)會(huì)非常寶貴,加深了我對(duì)編譯器處理語言的過程的理解。
我想,作為學(xué)計(jì)算機(jī)的學(xué)生,不應(yīng)該只會(huì)用Java,或者C++,或者C#。一門高
級(jí)語言其實(shí)學(xué)起來是很不容易的,而在校期間,這些計(jì)算機(jī)基礎(chǔ)課程一定要學(xué)
好!才能為將來打好基礎(chǔ)。
6附錄代碼
#include<iostream>
#include<fstream>
usingnamespacestd;
#definemaxsize50
#definemax30
ifstreaminfile;
charch;
intm,n,kk=O,addr=O,t=l;
stringgetl;
stringin[maxsize];
stringins[maxsize];
strings[4];
intcount=0;
stringvl\_o]={int,float,;,,,id,ft,D,SJ;
string
v2[13]={"#","id","nunT,"F","A","E","T"}
I
.「〃〃〃〃T〃〃T1〃〃L〃〃
stri?ngE=,El=,T=,Tl=,F=;
intanalysis_tablel[10][8]={3,4,0,0,0,0,2,1,
0,0,0,0,0,100,0,0,
0,0,5,6,0,0,0,0,
0,0,0,0,7,0,0,0,
0,0,0,0,8,0,0,0,
0,0,0,0,0,~1,0,0,
0,0,0,0,9,0,0,0,
0,0,_2,—2,0,0,0,0,
0,0,-3,-3,0,0,0,0,
0,0,-4,-4,0,0,0,0};
intanalysis_table2[17][13]={0,2,0,0,0,0,0,0,0,0,1,0,0,
100,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,4,5,
0,0,0,0,10,11,0,0,0,0,0,0,0,
0,0,0,0,~3,~3,12,0,-3,0,0,0,0,
0,0,0,0,-5,-5,-5,0,-5,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,13,5,
0,0,0,0,~8,-8,-8,0,-8,0,0,0,0,
0,0,0,0,-7,-7,-7,0,-7,0,0,0,0,
-1,I0,0,0,0,0,0,0,0,0,0,0,0,
0,9,0,8,0,0,0,7,0,6,0,0,14,
0,9,0,8,0,0,0,7,0,15,0,0,0,
0,0,0,0,0,11,0,0,16,0,0,0,0,
0,0,0,0,_2,-2,12,0,-2,0,0,0,0,
0,0,0,0,-4,-4,-4,0,-4,0,0,0,0,
0,0,0,0,-6,-6,-6,0,-6,0,0,0,0);
typedefstruct〃狀態(tài)棧
(
intdata[max];
inttop;
}seqstackl;
typedefstruct〃符號(hào)棧
(
stringdata[max];
inttop;
}seqstack2;
structreserveedword〃保留字表結(jié)構(gòu)
stringword;
charvalue;
}reserveedwordl[maxsize];
structidentifer〃標(biāo)識(shí)符表結(jié)構(gòu)
(
charidentiname[15];
charidentitype[15];
intaddress;
}identiferl[maxsize];
structconstant//常量表結(jié)構(gòu)
(
stringconstantname;
stringvalue;
intconstantaddress;
}constantl[maxsize];
voidInitscanner();
voidLexscanO;
voidIsalpha(char);
voidIsnumber(char);
voidIsother(char);
voidOutput(int,int,char*);
voidScanner();
voidchange(charc[],stringstr)
intlen=str.length();
for(intnum=0;num<1en;num++)
c[num]=str[num];
c[len]=,\0J;
)
seqstackl*init_seqstackl()
(
seqstackl*s;
s=newseqstackl;
if(!s)
(
coutX〈〃空間不足!,z?endl;
returnNULL;
)
else
(
s->top=-l;
returns;
)
)
intempty_seql(seqstackl*s)
(
if(s->top==-l)
return1;
else
return0;
intpush_seql(seqstackl*s,intx)
if(s->top==max-l)
return0;
else
(
s->top++;
s->data[s->top]=x;
return1;
)
}
intpop_seql(seqstackl*s,int*x)
(
if(empty_seql(s))
return0;
else
(
*x=s->data[s->top];
s->top一;
return1;
voidtop_seql(seqstackl*s,int&e)
if(empty_seql(s))
cout<<〃占空!〃;
else
e=s->dataLs->top];
)
seqstack2*init_seqstack2()
(
seqstack2*s;
s=newseqstack2;
if(!s)
(
cout<<〃空間不足!z,?endl;
returnNULL;
)
else
(
s->top="l;
returns;
)
}
intempty_seq2(seqstack2*s)
(
if(s->top==-l)
return1;
else
return0;
intpush_seq2(seqstack2*s,stringx)
(
if(s->top==max-l)
return0;
else
(
s->top++;
s->data[s->top]=x;
return1;
)
)
intpop_seq2(seqstack2*s,string*x)
(
if(empty_seq2(s))
return0;
else
(
*x=s->data[s->top];
s->top-;
return1;
}
voidout_seql(seqstackl*s)
for(inti=0;i<=s->top;i++)
printfs->data[i]);
voidout_seq2(seqstack2*s)
(
charch[15];
for(inti=0;i<=s->top;i++)
(
change(ch,s->data[i]);
printf(〃%s〃,ch);
)
)
seqstackl*sl=init_seqstackl();
seqstack2*s2=init_seqstack2();
seqstack2*s3=init_seqstack2();
voidpop(intn)
(
intm;
strings;
for(inti=0;i<n;i++)
pop_seql(si,&m);
pop_seq2(s2,&s);
pop_seq2(s3,&s);
intscreamp(chara[15],stringb)
inti=0,j=0;
while(a[i]!='\0'!='\0')
{
if(a[i]==b[i])
(
i++;
j++;
}
else
return0;
)
if(a[i]==b[i])
return1;
else
return0;
}
intscreampl(stringa,stringb)
(
inti=0,j=0;
while(a[i]!='\0'!='\0')
if(a[i]==b[i])
i++;
j++;
)
else
return0;
)
if(a[i]==b[i])
return1;
else
return0;
)
voidclear(seqstackl*sl,seqstack2*s2,seqstack2*s3)
(
intm;
strings;
while(!empty_seql(si))
(
pop_seql(si,&m);
pop_seq2(s2,&s);
pop_seq2(s3,&s);
)
)
voidcharTable()
charstrl[15],str2[15];
cout?〃\n生成的標(biāo)識(shí)符表為:〃;
cout<<,,\n\tname\ttype\tvalue\taddress,z;
for(inti=0;i<m;i++)
printf(z,\n%d\t%s\t%s,z,i,identiferl[i].identiname,identiferl[i].
identitype);
cout?〃"生成的常數(shù)表為:〃;
cout<<,z\n\tvalue\ttype\tname\taddressz,;
for(intj=0;j<n;j++)
(
change(strl,constantl[j].constantname);
change(str2,constantl[j].value);
printfC,\n%d\t%s\t%s,z,j,strl,str2);
)
)
intjudge(stringm[],inti,stringx)
(
for(intj=0;j<i;j++)
if(screampl(x,
return1;
return0;
intaddress(stringm[],inti,stringx)
for(intj=0;j<i;j++)
if(screampl(x,m[j]))
returnj;
)
voidprint(strings[])
(
cout?zz\n產(chǎn)生的四元式為〃<<endl;
charch[max];
for(inti=0;i<count;i++)
(
change(ch,s[i]);
printf(〃%s〃,ch);
cout<<endl;
)
cout<<endl;
)
voidemit(stringstrl,stringstr2,stringstr3,stringstr4)
(
s[count]+=zz(〃;s[count]+=strl;s[count]+=,/,;
s[count]+=str2;s[count]+二〃,〃;s[count]+=str3;
s[count]+=〃,〃;s[count]+=str4;s[count]+=〃)〃;
count++;
stringnewtempO
chars[2];
s[0]=V;
s[l]=t;
S⑵八O';
t++;
returns;
}
voidactionl(inti,strings)
(
intpos,j;
j=address(vl,8,s);
pos=analysis_tablel[i][j];
charstr[15];
change(str,s);
out_seql(si);
printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq2(s3);printf
(〃\t\t〃);
if(pos==100)
(
cout<<〃分析成功!z,?endl;
***************〃〈<eridl;
)
else
printf(,zaction[%d,%s]=S%d狀態(tài)%d入棧\n〃,i,str,pos,pos);
pushseql(si,pos);
push_seq2(s2,s);
push_seq2(s3,〃_〃);
getl=in[addr];
addr++;
)
voidgotol(inti,strings)
(
intpos,j;
if(judge(vl,8,s))
j=address(vl,8,s);
pos=analysis_tablel[i][j];
charstr[15];
change(str,s);
printf(z,goto[%d,%s]=%d\nz,,i,str,pos);
push_seql(si,pos);
push_seq2(s2,s);
}
voidslrl()
(
clear(si,s2,s3);
charstrl[15];
pushseql(si,0);
push_seq2(s2,〃#〃);
push_seq2(s3,〃_〃);
getl=in[addr];
addr++;
inttop,j;
while(1)
(
j=address(vl,8,getl);
top_seql(si,top);
if(top==100)
(
addr一;
return;
)
j=analysis_tablel[top][j];
if(j<0)
(
if(j==-l)
{
out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq
2(s3);printf("\t\t用S->D;歸約");
pop(2);
top_seql(si,top);
gotol(top,"S");
push_seq2(s3,;
)
elseif(j==-2)
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq
2(s3)jprintf(,z\t\t用D->intid歸約〃);
change(strl,z/int/z);
for(intk=0;k<15;k++)
identiferl[kk].identitype[k]=stri[k];
kk++;
pop⑵;
top_seql(si,top);
gotol(top,〃D〃);
push_seq2(s3,〃_〃);
}
elseif(j==-3)
(
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq
2(s3);printfC\t\t用D->floatid歸約〃);
change(strl,Afloat,z);
for(intk=0;k<15;k++)
identiferl[kk].identitypeLk]=str1[k];
kk++;
pop(2);
top_seql(si,top);
gotol(top,ZZD,Z);
push_seq2(s3,〃_〃);
)
elseif(j==-4)
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq
2(s3);printf(,z\t\t用D->D,id歸約〃);
for(intk=0;k<15;k++)
identiferl[kk].identitype[k]=identiferl[kk-l].identitype[k];
kk++;
pop(3);
top_seql(si,top);
gotol(top,,ZDZ/);
push_seq2(s3,〃_〃);
)
)
elseif(j>0)
actionl(top,getl);
)
)
voidaction2(inti,strings)
(
intpos,j;
if(judge(v2,13,s))
j=address(v2,13,s);
pos=ana1ysis_tab1e2[i][j];
charstr[15];
change(str,s);
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(/z\t\t,,);out_se
q2(s3);printf(〃\t\t〃);
if(pos==100)
(
cout<〈〃分析成功!〃<<endl;
********************〃<〈end1;
)
else
printf(z,action[%d,%s]=S%d狀態(tài)%d入棧\n〃,i,str,pos,pos);
push_seql(si,pos);
push_seq2(s2,s);
push_seq2(s3,〃_〃);
getl=in[addr];
addr++;
)
voidgoto2(inti,strings)
(
intpos,j;
if(judge(v2,13,s))
j=address(v2,13,s);
pos=analysis_table2[i][j];
charstr[15];
change(str,s);
printf("goto[%d,%s]=%d\nz,,i,str,pos);
pushseql(si,pos);
push_seq2(s2,s);
voidslr2()
{
t=r;
clear(si,s2,s3);
push_seql(si,0);
push_seq2(s2,〃#〃);
push_seq2(s3,〃_〃);
getl=in[addr];
addr++;
stringp[10];intnum=0;
p[num]=ins[addr-l];num++;
inttop,j;
charstrl[15];
while(1)
(
j=address(v2,13,getl);
top_seql(si,top);
if(top==100)
(
addr一一;
return;
j=analysis_table2[top][j];
if(j>0)
action2(top,getl);
elseif(j<0)
(
if(j==-l)
(
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq
2(s3);printf(z,\t\t用A->id=E;歸約〃);
pop(4);
top_seql(si,top);
goto2(top,〃A〃);
for(inti=0;i<m;i++)
if((screamp(identiferl[i].identiname,p[O]))&&(identiferl[i].ide
ntitype!=NULL))
I
change(strl,identiferl[i].identiname);
emit(z,=z/,E,〃_〃,strl);
push_seq2(s3,strl);
)
)
elseif(j==-2)
(
out_seql(si);printf(〃\t\t〃);out_seq2(s2);printf(〃\t\t〃);out_seq
2(s3);printfC\t\t用E->E+T歸約〃);
pop(3);
top_seql(si,top);
goto2(top,"E");
E1=E;
E=newtemp();
emitEl,T,E);
push_seq2(s3,E);
)
elseif(j==-3)
{
out_seql(si);printf("\t't");out_seq2(s2);printf;out_seq
2(s3);printfC\t\t用E->T歸約");
pop(l);
topseql(si,top);
goto2(top,"E");
E=T;
push_seq2(s3,T);
)
elseif(j==-4)
{
out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq
2(s3);printfC\t\t用T->T*F歸約”);
pop⑶;
top_seql(si,top);
goto2(top,"T");
T1=T;
T=newtemp();
emit("*",Tl,F,T);
push_seq2(s3,T);
)
elseif(j==-5)
{
out_seql(si);printf("\t\t");out_seq2(s2);printf("\t\t");out_seq
2(s3);printfC\t\t用T->F歸約");
pop(l);
top_seql(si,top);
goto2(top,"T");
T=F;
push_seq2(s3,F);
)
elseif(j==-6)
{
out_seql(sl);printf(z/\t\tz,);out_seq2(s2);printf("\t\t");out_seq
2(s3);printfC\t\t用F->(E)歸約“);
pop(3);
topseql(si,top);
goto2(top,"F");
F=E;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度石英砂信用保證與銷售合同
- 二零二五年度農(nóng)村自建房買賣定金合同范本3篇
- 二零二五年度房屋抵押貸款再擔(dān)保服務(wù)合同3篇
- 二零二五年度家政服務(wù)人員權(quán)益保障三方合同范本3篇
- 二零二五年度教師職務(wù)晉升勞動(dòng)合同范本3篇
- 二零二五年度文化創(chuàng)意門面租賃與藝術(shù)展覽合作合同3篇
- 2025年度海上油輪保險(xiǎn)合同范本發(fā)布3篇
- 海南衛(wèi)生健康職業(yè)學(xué)院《西醫(yī)外科學(xué)醫(yī)學(xué)免疫學(xué)與病原生物學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 螃蟹涂鴉課程設(shè)計(jì)
- 二零二五年度二手房購(gòu)置糾紛調(diào)解服務(wù)合同
- 直播電商基地入駐協(xié)議書范文
- 兒童涂色畫空白填色圖(100張文本打印版)
- 2024版合同及信息管理方案
- 人教精通版小學(xué)英語(三年級(jí)起點(diǎn))四年級(jí)上冊(cè)同步練習(xí)試題(全套)
- 2024-2025學(xué)年人教版生物八年級(jí)上冊(cè)期末綜合測(cè)試卷
- 有機(jī)農(nóng)業(yè)種植技術(shù)操作手冊(cè)
- 2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)人教版期末測(cè)評(píng)卷(含答案)
- 2024-2030年中國(guó)裸眼3D市場(chǎng)深度調(diào)查與競(jìng)爭(zhēng)格局分析研究報(bào)告
- 曲線與曲面積分練習(xí)題含答案
- 《ISO56001-2024創(chuàng)新管理體系 - 要求》之25:“9績(jī)效評(píng)價(jià)-9.2內(nèi)部審核”解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024)
- 小升初典型奧數(shù):相遇問題(講義)-2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)人教版
評(píng)論
0/150
提交評(píng)論