




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、黃岡師范學(xué)院提高型實(shí)驗(yàn)報告實(shí)驗(yàn)課題簡易C語言編譯器(實(shí)驗(yàn)類型:口綜合性 設(shè)計(jì)性 口應(yīng)用性)實(shí)驗(yàn)課程編譯原理實(shí)驗(yàn)時間2010年12 月19日學(xué)生姓名夏濤專業(yè)班級 網(wǎng)絡(luò)200801學(xué) 號 200826340124一、 設(shè)計(jì)題目- 1 -二、 運(yùn)行環(huán)境- 1 -三 、 算法設(shè)計(jì)的思想- 1 -四、 算法的流程圖- 3 -五、 算法設(shè)計(jì)分析- 6 -六 、 源代碼 - 11 -七 、 運(yùn)行結(jié)果分析- 15 -八 、 收獲及體會- 18 -一、設(shè)計(jì)題目簡易C語言編譯器二、運(yùn)行環(huán)境? 硬件環(huán)境:奔騰IV處理器,主頻2.0GHz;內(nèi)存512M;硬盤80G以 上;1024X 768顯示分辨率? 軟件環(huán)境: W
2、indows XP2; Visual C+6.0三、算法設(shè)計(jì)的思想編譯程序的工作過程一般可以分為五個階段:詞法分析、語法分析、語義分析與中間代碼產(chǎn)生、優(yōu)化、目標(biāo)代碼生成。每一個階段在功能上 是相對獨(dú)立的,它一方面從上一個階段獲取分析的結(jié)果來進(jìn)行分析,另 一方面由將結(jié)果傳遞給下一個階段。由編譯程序的五個階段就對應(yīng)了編 譯系統(tǒng)的結(jié)構(gòu)。其中詞法分析器利用超前搜索、狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成 為一個一個的單詞符號二元式。一般程序語言的單詞符號包括關(guān)鍵字、 運(yùn)算符、常數(shù)、標(biāo)識符和界符。語法分析器將這些單詞符號作為輸入, 對它進(jìn)行語法分析。語法分析分為兩種方法:自上而下分析法和自下而 上分析法。針對不
3、同程序語言的語法規(guī)則可以采取不同的分析方法,當(dāng) 然兩種方法也可以同時使用。語法分析器把語法單元作為輸入供語義分 析器使用。一般的語義分析器主要采用的是語法制導(dǎo)方法,即在語法分析的同時進(jìn)行語法分析,并產(chǎn)生一定的語義動作,來生成中間代碼。上 面三個過程可以與硬件無關(guān),而接下來的優(yōu)化器和目標(biāo)代碼生成器是針 對某一種處理器而言的。代碼優(yōu)化是將語義分析生成的中間代碼進(jìn)行優(yōu) 化,產(chǎn)生執(zhí)行效率更高的代碼。目標(biāo)代碼生成器最終生成可以在某種機(jī) 器上運(yùn)行的機(jī)器語言或者匯編語言。在整個編譯過程中還包括對表格的 操作和對錯誤的處理,這些也都是非常重要的環(huán)節(jié)。下圖給出了編譯系統(tǒng)的結(jié)構(gòu)框圖:詞法分析器1,單詞符號語法分析
4、器1r語法單元語義分析與中間代碼生成器1:中間代碼優(yōu)化器1,中間代碼目標(biāo)代碼生成器源程序目標(biāo)代碼出錯處理-21 -四、算法的流程圖1、詞法分析:ar)isalpha(buffer isdigit(bufferChbufferChar=alpha( bufferChar);bufferChar=digit (bufferChar);bufferChar=other (bufferChar);rollback。;rollback。;rollback。;Char)bufferChar!='#'Tbu他rChar!=#'T2、語法分析:開始從詞法輸出中讀入token序列,放入i
5、nput初始化堆棧,并將 '#'和'S'放入堆棧3、語義分析:五、算法設(shè)計(jì)分析1、使用的數(shù)據(jù)結(jié)構(gòu)和關(guān)鍵變量struct Stack /棧結(jié)構(gòu)體:序號、內(nèi)容、連接下一結(jié)點(diǎn)指針int num;char name;struct Stack *next;;struct Guiyue /規(guī)則集結(jié)構(gòu)體:序號、規(guī)則長度、符號、連接下一結(jié)點(diǎn) 指針int num;int count;char name;struct Guiyue *next;struct Relation /分析表結(jié)構(gòu)體:狀態(tài)序號、對應(yīng)符號列、操作類型的對 應(yīng)序號、操作類型、連接下一結(jié)點(diǎn)指針int line_St
6、ates ;char rank_Letter;int relationship;char name;struct Relation *next;struct Sign /符號表結(jié)構(gòu)體:自變量名、標(biāo)識類型、連接下一結(jié)點(diǎn)指針char name20;char kind;struct Sign *next;;struct Word /單詞表結(jié)構(gòu)體:單詞名字、標(biāo)識類型、狀態(tài)、序號、行號、 連接符號表指針、連接下一結(jié)點(diǎn)指針char name20;char mark_name;int state;int num;int line;struct Sign *link;struct Word *next;FIL
7、E *fp1, fp2; / 文件指針int row = 1;/字符行變量int line10000, Lin300;/ 字符行int w_num; /單詞所在行、字符數(shù)char buffer10000; / 字符串緩沖區(qū)struct Word *head,*find;/單詞表結(jié)構(gòu)體頭指針struct Relation *r_head;/分析表結(jié)構(gòu)體頭指針struct Guiyue *g_head;/規(guī)約集結(jié)構(gòu)體頭指針struct Stack *s_head;/棧結(jié)構(gòu)體頭指針2、用到的LR文法Terminator m v ( ) i = ; f e w a b c d , & | &l
8、t; > # + - * / nNonTerminator B Q S A C X Y Z E H G L I K T FStarter BPrecept00、B->Q01、Q->v m ( ) A 02、S->C ; S03、A->S A04、A->S05、C->C ; X06、C->X07、X->Y Z08、Y->a09、Y->b10、Y->c11、 Y->d12、Z->i , i13、Z->i14、S->f ( E ) A e A 15、S->w ( E ) A 16、S->i =
9、 L ;17、E->E & H18、E->H19、H->H | G20、H->G 21、G->i < i22、G->i > i23、G->i # i24、G->i i25、G->( E )26、G->! E27、G->i28、L->L + I29、L->I30、I->I - K31、I->K32、K->K / T33、K->K34、T->T * F35、T->F36、F->( L )37、F->n38、 F->i3、主要功能函數(shù)簡述以下是實(shí)現(xiàn)的
10、主要功能函數(shù)的信息簡述,具體實(shí)現(xiàn)請參看六、源代碼int judge(char ch)功能:接收ch判斷字符,變量flag返回字符類別void scan()功能:掃描輸入源文件,并生成單詞種別碼struct Word *InitWord()功能:包括分割單詞、標(biāo)識單詞、生成變量符號表、完善單詞屬性表int ResultAnely(Relation* r_head,Stack *s_head, char str口,Guiyue *g_head, int cal)功能:詞法分析函數(shù)int ResultAnely(Relation *r_head,Stack *s_head,charstr口,Guiy
11、ue *g_head,int cal)功能:語法分析函數(shù)void ProduceStyle(char str口,int order_num)功能:算術(shù)表達(dá)式四元式函數(shù)void BoolStyle(char str口,int order_num)功能:布爾表達(dá)式四元式函數(shù)void FourStyle(int goon, Word *head)功能:顯示四元式函數(shù)Stack *MarkPush(Stack *ip,char mark,int I_i)功能:進(jìn)棧void MarkPop(Stack *ip)功能:出棧void FindWordDeclare(Word *head)功能:正確性檢測函數(shù)
12、,查找保留字是否被聲名和符號是否對稱Relation *FirstRelation()功能:初始化分析表函數(shù)Guiyue *FirstGuiyue()功能:初始化規(guī)則表函數(shù)六、源代碼(部分)由于此次實(shí)驗(yàn)中所用全部代碼量太多,在此只列出主要的功能模塊(函數(shù))的代碼以做基本概要的說明:int judge(char ch)/接收ch判斷字符,變量flag返回字符類別(int flag;if(ch='!'11ch='$'|ch='&'|ch='*'11ch='('|ch=')'11ch='-
13、'|ch='_'| ch='+'|ch='='|ch='|'|ch=''|ch=''11ch=''11ch=''11ch=''| ch=':'|ch='"'|ch='<'|ch=','|ch='>'|ch='.'|ch='/'|ch=''') flag=1;else if('0
14、39;<=ch&&ch<='9')flag=2;else if('a'<=ch&&ch<='z')|('A'<=ch&&ch<='Z')flag=3;else if(ch='')flag=4;else if(ch='n')flag=5;else if(ch='?')flag=6;else if(feof(fp1)flag=7;/結(jié)束elseflag=0; /illegal charac
15、terreturn(flag);void scan()char ch;int flag,j=0,i=-1;while(!feof(fp1) ch=fgetc(fp1);flag=judge(ch);printf("%c",ch);/顯示打開的文件if(flag=1|flag=2|flag=3) i+;bufferi=ch;linei=row;else if(flag=4)i+;bufferi='?'linei=row;else if(flag=5)i+;bufferi=''row+;else if(flag=7) continue;else
16、cout<<"n請注意,第"<<row<< "行的"<<ch<<"是非法字符! "<<endl;w_num=i;/*確定單詞所在的行*/int one,two,k=0;for(i=0;i<w_num;i+)one=judge(bufferi);two=judge(bufferi+1);if(one!=two&&bufferi!='?'&&bufferi!='')|one=1) Link=line
17、i;k+; void FindWordDeclare(Word *head)struct Sign *s_first;struct Word *find,*w_name1000,*word_fu100;struct Stack *ip,*q;int i,cal=0,ca=0,end;find=head;cout<<endl<<"=顯 示 檢 查 結(jié) 果 ="<<endl;while(find)if(find->mark_name='i') w_namecal=find;cal+;if(find->next!=N
18、ULL)if(find->mark_name=find->next->mark_name)&&(find->mark_name!='')&&(find->mark_name!='')&&(find->mark_name!='(')&&(find->mark_nam e!=')cout<<"第"<<find->line<<"行,"<<find-
19、>mark_name<<"'存在字符重復(fù)錯誤!"<<endl;elseif(find->mark_name='i'&&find->next->mark_name='')|(find->mark_na me=','&&find->next->mark_name='')|(find->mark_name=','&&find->next->mark_name=
20、39;')|(find->mark_n ame=''&&find->next->mark_name=',')|(find->mark_name='('&&find->next->mark_name=',')|(find->mark_n ame=','&&find->next->mark_name='(')|(find->mark_name=')'&&fi
21、nd->next->mark_name='')|(find->mark_n ame=')'&&find->next->mark_name=',')|(find->mark_name=')'&&find->next->mark_name='') cout<<"第"<<find->line<<"行,"<<find->name<<&
22、quot;處存在符號連接錯誤!"<<endl;if(find->mark_name='a'|find->mark_name='b'|find->mark_name=' c'|find->mark_name='d')&&(find->next->mark_name=''|find->next->mark_name=''|find->next- >mark_name=','|find->
23、;next->mark_name=''|find->next->mark_name='('|find->next-> mark_name=')'|find->next->mark_name='+'|find->next->mark_name='-'|find->next- >mark_name='*'|find->next->mark_name='/'|find->next->mark_name
24、='&'|find->next- >mark_name='>'|find->next->mark_name='<'|find->next->mark_name='='|find->next->mark_name='!'|find->next->mark_name=''|find->next->mark_name='n') cout<<"第"<<fin
25、d->line<<"行,"<<find->mark_name<<"'存在自變量聲明搭配錯誤!"<<endl;if(find->mark_name='('|find->mark_name=')'|find->mark_name=''| |find->mark_name='')word_fuca=find;ca+;iffind->name0>='0'&&find
26、->name0<='9'&&find->name1>='a'&&f ind->name1<='z')cout<<"第"<<find->line<<"行,"<<find->name<<"存在變 量聲明錯誤!"<<endl;find=find->next;int j=0;for(i=0;i<cal;i+)s_first=head-
27、>link;end=1;while(s_first&&end)if(strcmp(s_first->name,w_namei->name)=0) end=0;else s_first=s_first->next;if(end=1&&i!=cal-1) cout<<"錯誤!第"<<w_namei->line<<"行,變量"<<w_namei->name<<"沒有被聲 明!"<<endl;q=ip=(
28、struct Stack *)malloc(sizeof(struct Stack);ip->name='$'for(i=0;i<ca;i+)if(word_fui->mark_name='(')|(word_fui->mark_name='') ip=MarkPush(ip,word_fui->mark_name,i);elseif(ip->name='('&&word_fui->mark_name=')')|(ip->name=''
29、&&word _fui->mark_name='') MarkPop(ip);else cout<<"錯誤! 第"<<word_fui->line<<”行," "<<word_fui->name<<" ”存在符號匹配錯誤! "<<endl;if(ip->name!='$') cout<<"錯誤!第"<<word_fui-1->line<<"
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025茶葉銷售代理合同樣本
- 八下語文知識點(diǎn)經(jīng)典常談要點(diǎn)
- 《實(shí)訓(xùn)公共關(guān)系學(xué):互動與實(shí)踐》課件
- 《南京河西策略提報》課件
- 《中國的行政區(qū)劃解析》課件
- 《探索故宮博物館》課件
- 教育部新版人教版一年級道德與法治上冊第七課《課間十分鐘》教學(xué)設(shè)計(jì)市級公開課教案
- 《醫(yī)學(xué)影像學(xué)總論》課件
- 北師大版九年級上冊1 用樹狀圖或表格求概率表格教學(xué)設(shè)計(jì)
- 嘉應(yīng)學(xué)院《運(yùn)動心理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2023年新改版教科版科學(xué)三年級下冊活動手冊參考答案(word可編輯)
- 消防重點(diǎn)單位檔案十八張表格doc-消防安全重點(diǎn)單位檔案
- 多模態(tài)視域下北京市核心區(qū)語言景觀研究
- 《單軸面筋脫水機(jī)設(shè)計(jì)報告(論文)》
- 內(nèi)分泌系統(tǒng) 腎上腺 (人體解剖生理學(xué)課件)
- YY 9706.240-2021醫(yī)用電氣設(shè)備第2-40部分:肌電及誘發(fā)反應(yīng)設(shè)備的基本安全和基本性能專用要求
- GPS靜態(tài)數(shù)據(jù)觀測記錄表
- GB/T 1094.7-2008電力變壓器第7部分:油浸式電力變壓器負(fù)載導(dǎo)則
- GB 12048-1989數(shù)字網(wǎng)內(nèi)時鐘和同步設(shè)備的進(jìn)網(wǎng)要求
- 2022餐桌禮儀培訓(xùn)PPT餐桌禮儀培訓(xùn)課件模板
- 山西省城鎮(zhèn)教師支援農(nóng)村教育工作登記表
評論
0/150
提交評論