




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)報(bào)告課程名稱:編譯原理課程設(shè)計(jì)題目:語法分析器姓 名:系:計(jì)算機(jī)專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)年 級(jí):2009級(jí)學(xué) 號(hào):指導(dǎo)教師:職 稱:20102011學(xué)年第一學(xué)期評(píng)語:成績(jī):指導(dǎo)教師簽字:任務(wù)下達(dá)日期:評(píng)定日期:目 錄1 正則表達(dá)式11.1 正則表達(dá)式11.2 確定化(化簡(jiǎn))后的狀態(tài)轉(zhuǎn)換圖11.3 分析程序代碼11.4 程序運(yùn)行截圖41.5 小結(jié)42 LL(1)分析52.1 LL(1)文法52.2 LL(1)預(yù)測(cè)分析表52.3 分析程序代碼52.4 程序運(yùn)行截圖72.5 小結(jié)73 算符優(yōu)先分析83.1 算符優(yōu)先文法83.2 算符優(yōu)先關(guān)系表83.3 分析程序代碼83.4 程序運(yùn)行截圖103
2、.5 小結(jié)114 LR分析124.1 LR文法124.2 LR分析表124.3 分析程序代碼124.4 程序運(yùn)行截圖144.5 小結(jié)14參考文獻(xiàn):141 正則表達(dá)式1.1 正則表達(dá)式 (a|b)*(aa|bb)(a|b)* (注:該正規(guī)式為示例,可更改)1.2 確定化(化簡(jiǎn))后的狀態(tài)轉(zhuǎn)換圖 1.3 分析程序代碼 #include <iostream> #include <string> using namespace std; const
3、160;int Max=20; typedef struct ArcNode int adjvex;/該弧所指向的頂點(diǎn)的位置 char info; /權(quán)
4、; struct ArcNode *nextarc;/指向下一條弧的指針 ArcNode; typedef struct VNode char data; /頂點(diǎn)信息
5、; ArcNode *firstarc; /指向第一條依附該頂點(diǎn)的弧的指針 VNode; class Nfa public: Nfa(); /構(gòu)造函數(shù),初始化nf
6、a int FindAdj(char c); /返回c狀態(tài)的在鄰接表中的序號(hào) void AlpAdd(char c); /向字母表集合中添加表中沒有的新元素c void Ini
7、tVisit(); /初始化Visited集合 void e_closure(int index); /求單一狀態(tài)c的e-閉包 void e_closure(int a); /重載的狀態(tài)集合的e-閉包
8、; void move(int I,char a); /單一狀態(tài)I的a弧轉(zhuǎn)換 void move(int I,char a); /重載的狀態(tài)集合的a弧轉(zhuǎn)換 void Nfa:Visit_I(int *Temp); /Visited轉(zhuǎn)換為集合
9、160; void Insert(int I,int a); /向狀態(tài)集合中添加新元素 int TAdd(int I); /狀態(tài)矩陣T中加入新狀態(tài)集合 void Resault(int i);
10、 void Nfa_Dfa(); private: int K; /狀態(tài)數(shù) int TMaxMax;
11、/狀態(tài)子集矩陣 VNode AdjListMax; /nfa,鄰接表的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ) VNode DfaMax; /dfa
12、 bool VisitedMax; /存e-閉包結(jié)果 char AlpMax; /字母表,0號(hào)單元用于存放個(gè)數(shù) Nfa:Nfa() K=Alp0=0;
13、; char c; string line; ArcNode *p; while(cin>>c&&c!='#') &
14、#160;AdjListK.data=c; AdjListK.firstarc=new ArcNode; AdjListK.firstarc->nextarc=NULL; K+;
15、160; getline(cin,line); while(getline(cin,line)&&line!="#") int index=
16、FindAdj(line0); if(index!=-1) p=AdjListindex.firstarc;
17、160; while(p->nextarc) p=p->nextarc; p->nextarc=new ArcNode;&
18、#160; p->nextarc->nextarc=NULL; p->nextarc->adjvex=FindAdj(line4);
19、160; p->nextarc->info=line2; AlpAdd(p->nextarc->info); co
20、ut<<"-"<<endl; cout<<"Initialization completely."<<endl; cout<<"K=" for(int i=0;i<K-1;i+)
21、60; cout<<AdjListi.data<<"," cout<<AdjListK-1.data<<"."<<endl; cout<<"=" for(int i=1;i<(int)Alp0;i
22、+) cout<<Alpi<<"," cout<<AlpAlp0<<"."<<endl; for(int i=0;i<K;i+) &
23、#160; p=AdjListi.firstarc; p=p->nextarc; while(p)
24、; cout<<"f("<<AdjListi.data<<","<<p->info<<")="<<p->adjvex<<" " p
25、=p->nextarc; if(i<K&&AdjListi.firstarc->nextarc) #include<stdio.h>int exch42=1,2,3,2,1,3,3,3;void judge(char *s) int
26、cur = 0, i = 0;while(si)if(si-'a' > 1 | si < 'a')break;cur=exchcur si+ - 'a'if(si = 0 && cur = 3)printf ("%s Right!nn",s);else printf ("%s × Wrong!nn",s);int main()char str100;while(1) printf("有限自動(dòng)機(jī),判斷是否符合 (a|b)*(aa|bb)(a|b)*n"
27、); printf("請(qǐng)輸入字符串: "); gets(str); judge(str);1.4 程序運(yùn)行截圖1.5 小結(jié)平時(shí)的學(xué)習(xí)需要通過實(shí)踐來檢驗(yàn),通過這次實(shí)驗(yàn)我能發(fā)現(xiàn)自身存在的一些問題,并且加以改正,同時(shí)通過實(shí)驗(yàn)加強(qiáng)了自己的動(dòng)手能力,并且增強(qiáng)了對(duì)于正則表達(dá)式的理解,并不只在于應(yīng)試方面。2 LL(1)分析2.1 LL(1)文法 ETE' (注:該文法為示例,可更改) E'+TE'| TFT' T'*FT'| F(E)|i2.2 LL(1)預(yù)測(cè)分析表i+*()#EETE'ETE'E'E'+TE
28、'E'E'TTFT'TFT'T'T'T'*FT'T'T'FFiF(E)2.3 分析程序代碼 輸入文法:ETE' (注:該文法為示例,可更改) E'+TE'| TFT' T'*FT'| F(E)|i代碼:#include<stdio.h>#include<string.h> char data5610= "12","","","12",""
29、,"", "","12+","","","-","-", "34","","","34","","", "","-","34*","","-","-", "i","","
30、",")0(","","",;/ 第一維0-4分別代表 EE'TT'F ,第二維0-5代表i+*()# -代表int exch(char ch)switch(ch) case 'i': return 0; case '+': return 1; case '*': return 2; case '(': return 3; case ')': return 4; case 0 : return 5; /字符串結(jié)束標(biāo)志代表'
31、#'. default: return -1;void judge(char *s)int tot=0,i=0,cur,k=exch(s0);char sta100;sta+tot='0'while(tot>0)cur = statot - '0'if(si = ' ') / 去空格+tot,k=exch(s+i);else if(cur+'0' = si) / 推導(dǎo)出相同字符,出棧k=exch(s+i);else if(k < 0 | datacurk0 = 0) / 踩空,或者出現(xiàn)非法字符break;els
32、e if(datacurk0 != '-') /不是,進(jìn)棧繼續(xù)推導(dǎo)strcpy(sta+tot,datacurk);tot+=strlen(datacurk);-tot; if(tot=0) printf(" %s Right!nn",s); else printf(" %s × Wrong!nn",s);int main() char str100;printf("判斷符號(hào)串是否符合文法:nntETE'nt");printf("E'+TE'|ntTFT'ntT
33、9;*FT'|ntF(E)|inn");while(printf("輸入符號(hào)串: ")&&gets(str)&&str0)judge(str);return 0;2.4 程序運(yùn)行截圖2.5 小結(jié) 實(shí)踐實(shí)踐驗(yàn)證里的唯一標(biāo)準(zhǔn),這次課程設(shè)計(jì)主要鞏固了我對(duì)LL(1)文法的深刻認(rèn)識(shí),掌握程序?qū)崿F(xiàn)文法判斷、鏈表的使用等多種問題的基本方法,進(jìn)一步提高了綜合運(yùn)用所學(xué)知識(shí)的能力。 3 算符優(yōu)先分析3.1 算符優(yōu)先文法 ET | E+T | E-T (注:該文法為示例,可更改) TF | T*F | T/F F(E) | i3.2 算符優(yōu)先關(guān)系
34、表+-*/()i#+-*/()i#3.3 分析程序代碼#include<stdio.h>#include<string.h>char com88= '>', '>', '<', '<', '<', '>', '<', '>', '>', '>', '<', '<', '<', '&
35、gt;', '<', '>', '>', '>', '>', '>', '<', '>', '<', '>', '>', '>', '>', '>', '<', '>', '<', '>',
36、39;<', '<', '<', '<', '<', '=', '<', ' ', '>', '>', '>', '>', '-', '>', '-', '>', '>', '>', '>', '>&
37、#39;, '-', '>', '-', '>', '<', '<', '<', '<', '<', '-', '<', '=',; / 0-7 分別代表+ - * / ( ) i #int exch(char ch)switch(ch) case '+': return 0; case '-': return 1; case
38、 '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; case 'i': return 6; case 0 : return 7; /字符串結(jié)束標(biāo)志代表# default: return -1;char expre65="N+N","N-N","N*N","N/N","(=N)","i" /為了挽回因
39、忽略語法變量而產(chǎn)生的錯(cuò)誤,在規(guī)約時(shí)檢驗(yàn)終結(jié)符是否帶了應(yīng)有的操作對(duì)象。int confirm(char *sta,int t) /檢驗(yàn)終結(jié)符是否帶了應(yīng)有的變量。int i,n=t; while( n>0&&stan!='<')n-; if(n>0)for(i=0;i<6;i+)if(memcmp(exprei,sta+n+1,sizeof(char)*(t-n)=0)stan = 'N' / 說明是有應(yīng)有的操作對(duì)象,所以進(jìn)行規(guī)約。return n;return 0;void judge(char *s) char sta10
40、0;int tot=0,cur,m,k,i=0;sta+tot=0;while(tot>0)m=tot;do cur=exch(stam-);while(cur<0); / 要忽略變量,直接對(duì)終結(jié)符進(jìn)行比較優(yōu)先級(jí)。while(si = ' ') / 跳過空格i+;k = exch(si);if( cur=k&&cur=7)tot = 0; / 規(guī)約成功,結(jié)束標(biāo)記。 else if( k<0 | comcurk = '-' ) / 踩空或者輸入非法符tot = -1; else if( comcurk != '>
41、39; ) / 遇到>',準(zhǔn)備規(guī)約if(statot = 'N') / 這里一個(gè)小問題就是變量N是要在'<'左邊還是右邊呢,這要取決于終結(jié)符是什么,左右兩邊有幾個(gè)變量,不過針對(duì)本程序方法,只需全部放在右邊。statot = comcurk;sta+tot = 'N'else sta+tot = comcurk;sta+tot =si+;else if( (tot = confirm( sta,tot )=0 ) /檢驗(yàn)終結(jié)符是否帶了應(yīng)有的變量。沒有,就規(guī)約失敗 tot = -1;if(tot=0) printf("
42、%s Right!nn",s); else printf(" %s × Wrong!nn",s);int main() char str100;printf("判斷符號(hào)串是否符合文法:nntET | E+T | E-TntTF | T*F | T/FntF(E) | inn");while(printf("輸入符號(hào)串: ")&&gets(str)&&str0)judge(str);return 0;3.4 程序運(yùn)行截圖3.5 小結(jié)通過這次課程設(shè)計(jì),我發(fā)現(xiàn)之前沒發(fā)現(xiàn)的問題。算符優(yōu)先分析方法有一定的局限性由于算符優(yōu)先分析法去掉了單非終結(jié)符之間的歸約,盡管在分析過程中,當(dāng)決定是否為句柄時(shí)采取一些檢查措施,但仍難完全避免把錯(cuò)誤的句子得到正確的歸約。4 LR分析4.1 LR文法 (0) S'S (注:該文法為示例,可更改) (1) SBB (2) BaB (3) Bb4.2 LR分析表ACTIONGOTOab#SB0S3S4121acc2S3S453S3S464r3r3r35r1r1r16r2r2r24.3 分析程序代碼#include<stdio.h>#include<string.h> int a
溫馨提示
- 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. 人人文庫(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療軟件合同范例
- 出售固定資產(chǎn)合同范本
- 單方出資合作合同范本
- 農(nóng)村大包建房合同范本
- 合同范例效力
- 印刷合同范本 博客
- 廠房消防設(shè)計(jì)合同范本
- 農(nóng)業(yè)合作社入股合同范本
- 醫(yī)生顧問聘用合同范本
- 導(dǎo)演工作室合作合同范本
- 2025人教版一年級(jí)下冊(cè)數(shù)學(xué)教學(xué)進(jìn)度表
- DeepSeek教案寫作指令
- 2025年安徽省合肥熱電集團(tuán)招聘50人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 休學(xué)復(fù)學(xué)申請(qǐng)書
- 北京2025年02月北京市地質(zhì)礦產(chǎn)勘查院所屬事業(yè)單位公開招考工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- DeepSeek零基礎(chǔ)到精通手冊(cè)(保姆級(jí)教程)
- 瓷磚鋪貼勞務(wù)承包協(xié)議書
- 2025年四川司法警官職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫(kù)含答案解析
- 新建污水處理廠工程EPC總承包投標(biāo)方案(技術(shù)標(biāo))
- 柔性電路板自動(dòng)化制造-深度研究
- 2024年河南建筑職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
評(píng)論
0/150
提交評(píng)論