版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、黃岡師范學(xué)院提高型實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)課題簡(jiǎn)易C語言編譯器(實(shí)驗(yàn)類型:口綜合性 設(shè)計(jì)性 口應(yīng)用性)實(shí)驗(yàn)課程編譯原理實(shí)驗(yàn)時(shí)間2010年12 月19日學(xué)生姓名夏濤專業(yè)班級(jí) 網(wǎng)絡(luò)200801學(xué) 號(hào) 200826340124一、 設(shè)計(jì)題目- 1 -二、 運(yùn)行環(huán)境- 1 -三 、 算法設(shè)計(jì)的思想- 1 -四、 算法的流程圖- 3 -五、 算法設(shè)計(jì)分析- 6 -六 、 源代碼 - 11 -七 、 運(yùn)行結(jié)果分析- 15 -八 、 收獲及體會(huì)- 18 -一、設(shè)計(jì)題目簡(jiǎn)易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ì)的思想編譯程序的工作過程一般可以分為五個(gè)階段:詞法分析、語法分析、語義分析與中間代碼產(chǎn)生、優(yōu)化、目標(biāo)代碼生成。每一個(gè)階段在功能上 是相對(duì)獨(dú)立的,它一方面從上一個(gè)階段獲取分析的結(jié)果來進(jìn)行分析,另 一方面由將結(jié)果傳遞給下一個(gè)階段。由編譯程序的五個(gè)階段就對(duì)應(yīng)了編 譯系統(tǒng)的結(jié)構(gòu)。其中詞法分析器利用超前搜索、狀態(tài)轉(zhuǎn)換等方法,將源程序轉(zhuǎn)化成 為一個(gè)一個(gè)的單詞符號(hào)二元式。一般程序語言的單詞符號(hào)包括關(guān)鍵字、 運(yùn)算符、常數(shù)、標(biāo)識(shí)符和界符。語法分析器將這些單詞符號(hào)作為輸入, 對(duì)它進(jìn)行語法分析。語法分析分為兩種方法:自上而下分析法和自下而 上分析法。針對(duì)不
3、同程序語言的語法規(guī)則可以采取不同的分析方法,當(dāng) 然兩種方法也可以同時(shí)使用。語法分析器把語法單元作為輸入供語義分 析器使用。一般的語義分析器主要采用的是語法制導(dǎo)方法,即在語法分析的同時(shí)進(jìn)行語法分析,并產(chǎn)生一定的語義動(dòng)作,來生成中間代碼。上 面三個(gè)過程可以與硬件無關(guān),而接下來的優(yōu)化器和目標(biāo)代碼生成器是針 對(duì)某一種處理器而言的。代碼優(yōu)化是將語義分析生成的中間代碼進(jìn)行優(yōu) 化,產(chǎn)生執(zhí)行效率更高的代碼。目標(biāo)代碼生成器最終生成可以在某種機(jī) 器上運(yùn)行的機(jī)器語言或者匯編語言。在整個(gè)編譯過程中還包括對(duì)表格的 操作和對(duì)錯(cuò)誤的處理,這些也都是非常重要的環(huán)節(jié)。下圖給出了編譯系統(tǒng)的結(jié)構(gòu)框圖:詞法分析器1,單詞符號(hào)語法分析
4、器1r語法單元語義分析與中間代碼生成器1:中間代碼優(yōu)化器1,中間代碼目標(biāo)代碼生成器源程序目標(biāo)代碼出錯(cuò)處理-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)體:序號(hào)、內(nèi)容、連接下一結(jié)點(diǎn)指針int num;char name;struct Stack *next;;struct Guiyue /規(guī)則集結(jié)構(gòu)體:序號(hào)、規(guī)則長(zhǎng)度、符號(hào)、連接下一結(jié)點(diǎn) 指針int num;int count;char name;struct Guiyue *next;struct Relation /分析表結(jié)構(gòu)體:狀態(tài)序號(hào)、對(duì)應(yīng)符號(hào)列、操作類型的對(duì) 應(yīng)序號(hào)、操作類型、連接下一結(jié)點(diǎn)指針int line_St
6、ates ;char rank_Letter;int relationship;char name;struct Relation *next;struct Sign /符號(hào)表結(jié)構(gòu)體:自變量名、標(biāo)識(shí)類型、連接下一結(jié)點(diǎn)指針char name20;char kind;struct Sign *next;;struct Word /單詞表結(jié)構(gòu)體:?jiǎn)卧~名字、標(biāo)識(shí)類型、狀態(tài)、序號(hào)、行號(hào)、 連接符號(hào)表指針、連接下一結(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ù)簡(jiǎn)述以下是實(shí)現(xiàn)的
10、主要功能函數(shù)的信息簡(jiǎn)述,具體實(shí)現(xiàn)請(qǐng)參看六、源代碼int judge(char ch)功能:接收ch判斷字符,變量flag返回字符類別void scan()功能:掃描輸入源文件,并生成單詞種別碼struct Word *InitWord()功能:包括分割單詞、標(biāo)識(shí)單詞、生成變量符號(hà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)功能:正確性檢測(cè)函數(shù)
12、,查找保留字是否被聲名和符號(hào)是否對(duì)稱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請(qǐng)注意,第"<<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ù)錯(cuò)誤!"<<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;處存在符號(hào)連接錯(cuò)誤!"<<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<<"'存在自變量聲明搭配錯(cuò)誤!"<<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<<"存在變 量聲明錯(cuò)誤!"<<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<<"錯(cuò)誤!第"<<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<<"錯(cuò)誤! 第"<<word_fui->line<<”行," "<<word_fui->name<<" ”存在符號(hào)匹配錯(cuò)誤! "<<endl;if(ip->name!='$') cout<<"錯(cuò)誤!第"<<word_fui-1->line<<"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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屆江蘇省蘇州市平江中學(xué)高三沖刺模擬英語試卷含解析
- 江西上饒重點(diǎn)中學(xué)2025屆高考英語一模試卷含解析
- 遼寧省沈陽市2025屆高考英語全真模擬密押卷含解析
- 現(xiàn)代學(xué)徒制課題:數(shù)智賦能視角下中國(guó)特色學(xué)徒制創(chuàng)新發(fā)展研究(附:研究思路模板、可修改技術(shù)路線圖)
- 2025屆廣東省六校高考仿真卷英語試題含解析
- 上海市延安中學(xué)2025屆高三壓軸卷數(shù)學(xué)試卷含解析
- 2025屆黑龍江省哈市六中高考語文三模試卷含解析
- 甘肅省白銀市靖遠(yuǎn)一中2025屆高三第二次模擬考試數(shù)學(xué)試卷含解析
- 2025屆河北省唐山市樂亭一中高三第一次調(diào)研測(cè)試語文試卷含解析
- 2025屆浙江省嘉興市重點(diǎn)中學(xué)高三下學(xué)期一??荚囌Z文試題含解析
- 2024年黑龍江省龍東地區(qū)中考數(shù)學(xué)試題含答案
- 劉潤(rùn)年度演講2024
- 2024年廣東省學(xué)法考試年度考試考場(chǎng)一滿分答案
- 《上海市媒體廣告發(fā)布單位信用風(fēng)險(xiǎn)分級(jí)評(píng)價(jià)和分類監(jiān)管辦法》起草說明
- 口腔頜面外科臨床檢查-一般檢查顳下頜關(guān)節(jié)檢查(口腔科技術(shù))
- 青少年無人機(jī)課程:第一課-馬上起飛
- 小學(xué)生講海軍司令肖勁光的紅色故事肖勁光先進(jìn)事跡學(xué)習(xí)
- 基礎(chǔ)實(shí)驗(yàn)課程設(shè)計(jì)
- 養(yǎng)老院的經(jīng)營(yíng)規(guī)劃方案
- 自控儀表施工調(diào)試方案
- 消防大隊(duì)聯(lián)勤聯(lián)動(dòng)簽訂協(xié)議書模板
評(píng)論
0/150
提交評(píng)論