編譯原理實(shí)驗(yàn)報(bào)告_第1頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第2頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第3頁(yè)
編譯原理實(shí)驗(yàn)報(bào)告_第4頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、本文格式為word版,下載可任意編輯編譯原理實(shí)驗(yàn)報(bào)告 編譯原理試驗(yàn)報(bào)告 compilers principles experiment report 所在學(xué)院: 所在班級(jí): 同學(xué)姓名: 學(xué) 號(hào): 指導(dǎo)老師: 教 務(wù) 處 2021 年 12 月 詞法分析程序 一、試驗(yàn)?zāi)康模?設(shè)計(jì)、編制和調(diào)試一個(gè)詳細(xì)的詞法分析程序,加深對(duì)詞法分析的理解。 二、試驗(yàn)要求: 1、通過(guò)對(duì) pl/0 詞法分析程序(getsys)的分析,編制一個(gè)具有以下功能的詞法分析程序: a.輸入為字符串(或待進(jìn)行詞法分析的源程序),輸出為單詞串,即由(單詞,類(lèi)別)所組成的二元組序列; b.有肯定的錯(cuò)誤檢查力量,例如能發(fā)覺(jué) 2a這類(lèi) 不

2、能作為單詞的字符串。 三、試驗(yàn)代 碼 #define id 12/標(biāo)識(shí)符 #define int 13/常數(shù) #define jf 14/界符 #define ysf 15/運(yùn)算符 #define n 30/字符讀取的最大長(zhǎng)度 char tokenn; file *write; /查詢(xún)一個(gè)字符串,看其是否與指定的字符相匹配,假如匹配返回 1 個(gè)非零的值,假如不匹配,則返回一個(gè) 0 值*/ int looksame(char *a) int i; char*key22 = begin,end,if,then,else,for,do,while,and,or,not,begin,end,if,th

3、en,else,for,do,while,and,or,not ; for (i = 0;i 22;i+) if (strcmp(keyi, a) = 0)/該字符串是否與關(guān)鍵字相匹配 return (i % 11 + 1); return 0; /把 a輸入到指定文件中,然后從該文件中讀出字符串,放到一個(gè)數(shù)組中輸出 void out(int a, char *b) file *write; write = fopen(e:b.txt, a+); if (write = null) printf(文件打開(kāi)失敗); exit(0); fprintf(write, %dt, a); fwrite(

4、b, strlen(b), 1, write); fprintf(write, n); fclose(write); printf(%d %20stt, a, b); int error() printf(書(shū)寫(xiě)格式錯(cuò)誤,未被識(shí)別n); return 0; void function(file *fp) char ch = ; int i, c; while (ch != eof) ch = fgetc(fp);/從文件中讀取字符 while (ch = | ch = t | ch = n) ch = fgetc(fp); if (isalpha(ch) /isalpha()推斷是否為英文字母,

5、是則返回非 零值,否則返回零 token0 = ch; ch = fgetc(fp); i = 1; while (isalnum(ch) /isalnum()推斷字符是否為英文字 母或數(shù)字,假如是則返回非零值,假如不是則返回零/ tokeni = ch; i+; ch = fgetc(fp); tokeni = 0; fseek(fp, -1, 1); /用于二進(jìn)制方式打開(kāi)的文件,移動(dòng)文件讀寫(xiě)指針位置 c = looksame(token); if (c = 0) out(id, token);printf(標(biāo)識(shí)符n); else out(c, token);printf(關(guān)鍵字n); el

6、se if (isdigit(ch) /isdigit()推斷是否為0-9 的數(shù)字 token0 = ch; ch = fgetc(fp); i = 1; while (isdigit(ch) tokeni = ch; i+; ch = fgetc(fp); tokeni = 0; fseek(fp, -1, 1); out(int, token); printf(常數(shù)n); else switch (ch) case+:out(ysf, +);printf(運(yùn)算符n); break; case-:out(ysf, -);printf(運(yùn)算符n); break; case;:out(jf, ;

7、);printf(界符n); break; case,:out(jf, ,);printf(界符n); break; case|:out(ysf, |);printf(運(yùn)算符n); break; case:out(jf, );printf(界符n); break; case(:out(jf, ();printf(界符n); break; case!:out(jf, !);printf(界符n); break; case:out(jf, );printf(界符n); break; case):out(jf, );printf(界符n); break; case:out(jf, );printf(

8、界符n); break; case:ch = fgetc(fp); if (ch = =) out(ysf, =); printf(運(yùn)算符n); else if (ch = ) out(ysf, ); printf(運(yùn)算符n); else fseek(fp, -1, 1); out(ysf, ); printf(運(yùn)算符n); break; case=:out(ysf, =);printf(運(yùn)算符n); break; case:ch = fgetc(fp); if (ch = =) out(ysf, =); printf(運(yùn)算符n); else fseek(fp, -1, 1); out(ysf

9、, ); printf(運(yùn)算符n); break; case:ch = fgetc(fp); if (ch = =) out(ysf, :=); printf(運(yùn)算符n); else fseek(fp, -1, 1); out(jf, :); printf(界符n); break; case/:ch = fgetc(fp); if (ch = *) out(jf, /*); printf(界符n); while (1)/解釋的內(nèi)容在詞法分析中不顯示 while (ch != /) ch = fgetc(fp); fseek(fp, -2, 1); ch = fgetc(fp); if (ch

10、= *) fseek(fp, 1, 1); break; else fseek(fp, 2, 1); ch = fgetc(fp); fseek(fp, -2, 1); else fseek(fp, -1, 1); out(jf, /); printf(界符n); break; case*:ch = fgetc(fp); if (ch = /) out(jf, */); printf(界符n); else fseek(fp, -1, 1); out(ysf, *); printf(運(yùn)算符n); break; case eof:break; default:error(); break; int

11、 main() file *read; read = fopen(e:a.txt, r); write = fopen(e:b.txt, a+); if (read = null) printf(file open fail!); exit(0); printf(=n); printf(=詞法分析程序=n); printf(=該分析程序的文件存放在e:a.txt 名目下=n); printf(=該程序的分析結(jié)果存放在e:b.txt 名目下=n); printf(= =n); function(read); fclose(read); system(pause); return 0; 四、試驗(yàn)截

12、圖 a.txt b.txt 基于 ll(1)方法的語(yǔ)法分析程序 一、 試驗(yàn)?zāi)康?設(shè)計(jì)、編制和調(diào)試一個(gè)典型的語(yǔ)法分析方法,進(jìn)一步把握常用的語(yǔ)法分析方法。 二、試驗(yàn)要求 1、依據(jù) ll(1)分析法編寫(xiě)一個(gè)語(yǔ)法分析程序,可依據(jù)自己實(shí)際狀況,選擇以下一項(xiàng)作為分析算法的輸入: a.直接輸入依據(jù)已知文法構(gòu)造的分析表 m; b.輸入文法的 first()和 follow(u)集合,由 程序自動(dòng)生成文法的分析表 m; c.輸入已知文法,由程序自動(dòng)構(gòu)造文法的分析表m。 2、程序具有通用性 所開(kāi)發(fā)的程序可適用于不同的文法和任意輸入串,且能推斷該文法是否為 ll(1)文法。 3、有運(yùn)行實(shí)例 對(duì)于輸入的文法和符號(hào)串,

13、所編制的語(yǔ)法分析程序應(yīng)能正確推斷此串是否為文法的句子,并要求輸出分析過(guò)程。 三、試驗(yàn)代碼 #include stdafx.h #includestdio.h #includestdlib.h #includestring.h #includedos.h char a20;/*分析棧*/ char b20;/*剩余串*/ char v120 = i,+,*,(,),# ;/*終結(jié)符 */ char v220 = e,g,t,s,f ;/*非終結(jié)符 */ int j = 0, b = 0, top = 0, l;/*l 為輸入串長(zhǎng)度 */ typedef struct type /*產(chǎn)生式類(lèi)型定義

14、 */ char origin; /*大寫(xiě)字符 */ char array5; /*產(chǎn)生式右邊字符 */ int length; /*字符個(gè)數(shù) */ type; type e, t, g, g1, s, s1, f, f1;/*結(jié)構(gòu)體變量 */ type c1010;/*猜測(cè)分析表 */ void print()/*輸出分析棧 */ int a;/*指針*/ for (a = 0;a = top + 1;a+) printf(%c, aa); printf(tt); /*print*/ void print1()/*輸出剩余串*/ int j; for (j = 0;jb;j+)/*輸出對(duì)齊符

15、*/ printf( ); for (j = b;j = l;j+) printf(%c, bj); printf(ttt); int _tmain(int argc, _tchar* argv) int m, n, k = 0, flag = 0, finish = 0; char ch, x; type cha;/*用來(lái)接受 cmn*/ /*把文法產(chǎn)生式賦值結(jié)構(gòu)體*/ e.origin = e; strcpy(e.array, tg); e.length = 2; t.origin = t; strcpy(t.array, fs); t.length = 2; g.origin = g;

16、strcpy(g.array, +tg); g.length = 3; g1.origin = g; g1.array0 = ; g1.length = 1; s.origin = s; strcpy(s.array, *fs); s.length = 3; s1.origin = s; s1.array0 = ; s1.length = 1; f.origin = f; strcpy(f.array, (e); f.length = 3; f1.origin = f; f1.array0 = i; f1.length = 1; for (m = 0;m = 4;m+)/*初始化分析表*/ f

17、or (n = 0;n = 5;n+) cmn.origin = n;/*全部賦為空*/ /*填充分析表*/ c00 = e;c03 = e; c11 = g;c14 = g1;c15 = g1; c20 = t;c23 = t; c31 = s1;c32 = s;c34 = c35 = s1; c40 = f1;c43 = f; printf(提示:本程序只能對(duì)由i,+,*,(,)構(gòu)成的 以#結(jié)束的字符串進(jìn)行分析,n); printf(請(qǐng)輸入要分析的字符串:); do/*讀入分析串*/ scanf(%c, ch); if (ch != i) (ch != +) (ch != *) (ch !

18、= () (ch != ) (ch != #) printf(輸入串中有非法字符n); exit(1); bj = ch; j+; while (ch != #); l = j;/*分析串長(zhǎng)度*/ ch = b0;/*當(dāng)前分析字符*/ atop = #; a+top = e;/*#,e進(jìn)棧*/ printf(步驟tt 分析棧 tt 剩余字符 tt 所用產(chǎn)生式 n); do x = atop-;/*x 為當(dāng)前棧頂字符*/ printf(%d, k+); printf(tt); for (j = 0;j = 5;j+)/*推斷是否為終結(jié)符*/ if (x = v1j) flag = 1; brea

19、k; if (flag = 1)/*假如是終結(jié)符*/ if (x = #) finish = 1;/*結(jié)束標(biāo)記*/ printf(acc!n);/*接受 */ getchar(); getchar(); exit(1); /*if*/ if (x = ch) print(); print1(); printf(%c匹配n, ch); ch = b+b;/*下一個(gè)輸入字符*/ flag = 0;/*恢復(fù)標(biāo)記*/ /*if*/ else/*出錯(cuò)處理*/ print(); print1(); printf(%c出錯(cuò)n, ch);/*輸出出錯(cuò)終結(jié)符*/ exit(1); /*else*/ /*if*/

20、 else/*非終結(jié)符處理*/ for (j = 0;j = 4;j+) if (x = v2j) m = j;/*行號(hào)*/ break; for (j = 0;j = 5;j+) if (ch = v1j) n = j;/*列號(hào)*/ break; cha = cmn; if (cha.origin != n)/*推斷是否為空*/ print(); print1(); printf(%c-, cha.origin);/*輸出產(chǎn)生式*/ for (j = 0;jcha.length;j+) printf(%c, cha.arrayj); printf(n); for (j = (cha.leng

21、th - 1);j = 0;j-)/*產(chǎn)生式逆序入棧*/ a+top = cha.arrayj; if (atop = )/*為空則不進(jìn)棧*/ top-; /*if*/ else/*出錯(cuò)處理*/ print(); print1(); printf(%c出錯(cuò)n, x);/*輸出出錯(cuò)非終結(jié)符*/ exit(1); /*else*/ /*else*/ while (finish = 0); return 0; 四、 試驗(yàn)截圖 于 基于 lr(0) 方法的語(yǔ)法分析程序 一、試驗(yàn)?zāi)康?設(shè)計(jì)、編制和調(diào)試一個(gè)典型的語(yǔ)法分析方法,進(jìn)一步把握常用的語(yǔ)法分析方法。 二、試驗(yàn)要求 可依據(jù)自己實(shí)際狀況,選擇以下一項(xiàng)作

22、為分析算法的輸入: (1)直接輸入依據(jù)己知文法構(gòu)造的 lr(0)分析表。 (2)輸入已知文法的項(xiàng)目集規(guī)范族和轉(zhuǎn)換函數(shù),由程序自動(dòng)生成 lr(0)分析表; (3)輸入已知文法,由程序自動(dòng)生成 lr(0)分析表。 三、程序代碼 #include stdafx.h #includeiostream #includestring.h #includeiomanip #includestdlib.h using namespace std; struct stack int top; int st15; /狀態(tài)棧 char sn15; /符號(hào)棧 *sign; struct analysis /動(dòng)作表結(jié)構(gòu)

23、 char act; int status; action6 = s,5,$,0,$,0, s,4,$,0, $,0 , $,0,s,6,$,0, $,0,$,0, a,0 , $,0,r,2,s,7, $,0,r,2, r,2 , $,0,r,4,r,4, $,0,r,4, r,4 , s,5,$,0,$,0, s,4,$,0, $,0 , $,0,r,6,r,6, $,0,r,6, r,6 , s,5,$,0,$,0, s,4,$,0, $,0 , s,5,$,0,$,0, s,4,$,0, $,0 , $,0,s,6,$,0, $,0,s,11,$,0 , $,0,r,1,s,7, $,

24、0,r,1, r,1 , $,0,r,3,r,3, $,0,r,3, r,3 , $,0,r,5,r,5, $,0,r,5, r,5 ; analysis g = e,3 , e,1 , t,3 , t,1 , f,3 , f,1 ; /此文法信息 int go3 = 1,2,3,99,99,99,99,99,99,99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99 ; int index(char m) int id; if (m = i) | (m = e) id = 0; else if

25、(m = +) | (m = t) id = 1; else if (m = *) | (m = f) id = 2; else if (m = () id = 3; else if (m = ) id = 4; else if (m = #) id = 5; else id = 99; return id; void main() cout 參照文法為:n (1)ee+tn (2)etn (3)tt*fn (4)tfn (5)f(e)n (6)fin; char instr20, *current, a; int i = 0, step = 0, ix1, ia, ix2, ig, ig,

26、back; bool flag = true; sign = new stack; cout 請(qǐng)輸入待分析的字符串(以#結(jié)束):n; do cin instri+; while (instri - 1 != #); instri = 0; current = instr; sign-st0 = 0;sign-sn0 = #;sign-sn1 = 0;sign-top = 0; cout 步驟 setw(20) 狀 態(tài) setw(20) 符 號(hào) setw(20) 輸 入 串n; cout = setw(20) = setw(20) = setw(20) =n; cout step+ setw(2

27、0) sign-st0 setw(21) sign-sn setw(21) instr endl; while (flag) cout step+ setw(20); a = *current;ia = index(a); ix1 = sign-stsign-top; /couta ia ix1 actionix1ia.act; /hhjhj if (ia = 99) cout 此文法無(wú)法識(shí)別該輸入串!; break; if (actionix1ia.act = s) sign-top += 1; sign-snsign-top = a; sign-sn(sign-top) + 1 = 0;

28、sign-stsign-top = actionix1ia.status; current+; else if (actionix1ia.act = r) ig = actionix1ia.status - 1; /零下表開(kāi)頭 back = gig.status; sign-top -= back; ix2 = sign-stsign-top; ig = index(gig.act); if (goix2ig != 99) sign-top += 1; sign-stsign-top = goix2ig; sign-snsign-top = gig.act; sign-sn(sign-top)

29、 + 1 = 0; else cout 此文法無(wú)法識(shí)別該輸入串!; break; else if (actionix1ia.act = $) cout 此文法無(wú)法識(shí)別該輸入串!; break; else if (actionix1ia.act = a) flag = false; for (i = 0;i = sign-top;i+) cout sign-sti ; cout setw(20 - (sign-top) sign-sn setw(20 - strlen(sign-sn) current endl; if (flag = false) cout 文法分析勝利! endl; 四、試驗(yàn)

30、截圖 中間代碼生成程序(逆波蘭表示) 一、試驗(yàn)?zāi)康?加深對(duì)語(yǔ)義翻譯的理解 二、試驗(yàn)要求 (1)編制一個(gè)中間代碼生成程序,能將算術(shù)表達(dá)式等翻譯成逆波蘭形式; (2)程序具有通用性,即能接受各種不同的算術(shù)表達(dá)式等語(yǔ)法成分。 (3)有運(yùn)行實(shí)例對(duì)于語(yǔ)法正確的算術(shù)表達(dá)式,能生成逆波蘭表示,并輸出結(jié)果;對(duì)不正確的表達(dá)式,能檢測(cè)出錯(cuò)誤。 (4) 提交實(shí)習(xí)報(bào)告,報(bào)告內(nèi)容應(yīng)包括: 目的、要求,算法描述,程序代碼,運(yùn)行截圖 三、程序代碼 #include stdafx.h #include iostream #include string using namespace std; class transform

31、private: char s_stack20;/棧 string s_result;/轉(zhuǎn)換之后的字符串,也就是后綴表達(dá)式 int top;/棧頂 public: transform() top=0; s_stack0=#; s_result=; void pop() top-; void push(char b) top+; s_stacktop=b; string tf(string a) bool q=0; for (int i=0;ia.length();i+) switch (ai) case +: case -: q=1; if (s_stacktop!=*s_stacktop!=/s_stacktop!=s_stacktop!=+s_stacktop!=-) push(ai); else while(s_stacktop=*|s_stacktop=/|s_stacktop=|s_stacktop=+|s_stacktop=-) s_result+=s_stacktop; pop(); push(ai); break; case *: case /: q=1; if (s_stacktop!=s_s

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論