將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大的編譯程序_第1頁(yè)
將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大的編譯程序_第2頁(yè)
將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大的編譯程序_第3頁(yè)
將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大的編譯程序_第4頁(yè)
將詞法、語法、代碼生成等實(shí)驗(yàn)組合成一個(gè)大的編譯程序_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論