




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 編譯原理實(shí)驗(yàn)報告Compilers Principles Experiment Report 所在學(xué)院: 所在班級: 學(xué)生姓名: 學(xué) 號: 指導(dǎo)教師:教 務(wù) 處2015年 12 月詞法分析程序一、實(shí)驗(yàn)?zāi)康模涸O(shè)計(jì)、編制和調(diào)試一個具體的詞法分析程序,加深對詞法分析的理解。二、實(shí)驗(yàn)要求:1、通過對PL/0詞法分析程序(GETSYS)的分析,編制一個具有以下功能的詞法分析程序:a.輸入為字符串(或待進(jìn)行詞法分析的源程序),輸出為單詞串,即由(單詞,類別)所組成的二元組序列; b.有一定的錯誤檢查能力,例如能發(fā)現(xiàn)2a這類 不能作為單詞的字符串。 三、實(shí)驗(yàn)代碼#define ID 12/標(biāo)識符#defi
2、ne INT 13/常數(shù)#define JF 14/界符#define YSF 15/運(yùn)算符#define N 30/字符讀取的最大長度char TOKENN;FILE *write;/查詢一個字符串,看其是否與指定的字符相匹配,如果匹配返回1個非零的值,如果不匹配,則返回一個0值*/int looksame(char *a)int i;char*key22 = begin,end,if,then,else,for,do,while,and,or,not,BEGIN,END,IF,THEN,ELSE,FOR,DO,WHILE,AND,OR,NOT ;for (i = 0;i 22;i+)if
3、(strcmp(keyi, a) = 0)/該字符串是否與關(guān)鍵字相匹配return (i % 11 + 1);return 0;/把a(bǔ)輸入到指定文件中,然后從該文件中讀出字符串,放到一個數(shù)組中輸出void out(int a, char *b)FILE *write;write = fopen(E:b.txt, a+);if (write = NULL)printf(文件打開失敗);exit(0);fprintf(write, %dt, a);fwrite(b, strlen(b), 1, write);fprintf(write, n);fclose(write);printf(%d %20
4、stt, a, b);int error()printf(書寫格式錯誤,未被識別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()判斷是否為英文字母,是則返回非 零值,否則返回零TOKEN0 = ch;ch = fgetc(fp);i = 1;while (isalnum(ch) /isalnum()判斷字符是否
5、為英文字 母或數(shù)字,如果是則返回非零值,如果不是則返回零/TOKENi = ch;i+;ch = fgetc(fp);TOKENi = 0;fseek(fp, -1, 1); /用于二進(jìn)制方式打開的文件,移動文件讀寫指針位置c = looksame(TOKEN);if (c = 0)out(ID, TOKEN);printf(標(biāo)識符n);elseout(c, TOKEN);printf(關(guān)鍵字n);else if (isdigit(ch) /isdigit()判斷是否為0-9的數(shù)字TOKEN0 = ch;ch = fgetc(fp);i = 1;while (isdigit(ch)TOKENi
6、 = ch;i+;ch = fgetc(fp);TOKENi = 0;fseek(fp, -1, 1);out(INT, TOKEN);printf(常數(shù)n);elseswitch (ch)case+:out(YSF, +);printf(運(yùn)算符n);break;case-:out(YSF, -);printf(運(yùn)算符n);break;case;:out(JF, ;);printf(界符n);break;case,:out(JF, ,);printf(界符n);break;case|:out(YSF, |);printf(運(yùn)算符n);break;case:out(JF, );printf(界符
7、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:ch = fgetc(fp);if (ch = =)out(YSF, )out(YSF, );printf(運(yùn)算符n);elsefseek(fp, -1, 1);out(YSF, :ch = fgetc(fp);if (ch = =
8、)out(YSF, =);printf(運(yùn)算符n);elsefseek(fp, -1, 1);out(YSF, );printf(運(yùn)算符n);break;case:ch = fgetc(fp);if (ch = =)out(YSF, :=);printf(運(yùn)算符n);elsefseek(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(
9、fp, -2, 1);ch = fgetc(fp);if (ch = *)fseek(fp, 1, 1);break;elsefseek(fp, 2, 1);ch = fgetc(fp);fseek(fp, -2, 1);elsefseek(fp, -1, 1);out(JF, /);printf(界符n);break;case*:ch = fgetc(fp);if (ch = /)out(JF, */);printf(界符n);elsefseek(fp, -1, 1);out(YSF, *);printf(運(yùn)算符n);break;case EOF:break;default:error();
10、break;int 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;四、實(shí)驗(yàn)截圖a.txt b.tx
11、t基于LL(1)方法的語法分析程序1、 實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制和調(diào)試一個典型的語法分析方法,進(jìn)一步掌握常用的語法分析方法。二、實(shí)驗(yàn)要求1、根據(jù)LL(1)分析法編寫一個語法分析程序,可根據(jù)自己實(shí)際情況,選擇以下一項(xiàng)作為分析算法的輸入: a.直接輸入根據(jù)已知文法構(gòu)造的分析表M; b.輸入文法的FIRST()和FOLLOW(U)集合,由 程序自動生成文法的分析表M; c.輸入已知文法,由程序自動構(gòu)造文法的分析表M。2、程序具有通用性 所開發(fā)的程序可適用于不同的文法和任意輸入串,且能判斷該文法是否為LL(1)文法。3、 有運(yùn)行實(shí)例 對于輸入的文法和符號串,所編制的語法分析程序應(yīng)能正確判斷此串是否為文法的句
12、子,并要求輸出分析過程。三、實(shí)驗(yàn)代碼#include stdafx.h#include#include#include#includechar A20;/*分析棧*/char B20;/*剩余串*/char v120 = i,+,*,(,),# ;/*終結(jié)符 */char v220 = E,G,T,S,F ;/*非終結(jié)符 */int j = 0, b = 0, top = 0, l;/*L為輸入串長度 */typedef struct type /*產(chǎn)生式類型定義 */char origin; /*大寫字符 */char array5; /*產(chǎn)生式右邊字符 */int length; /*字符
13、個數(shù) */type;type e, t, g, g1, s, s1, f, f1;/*結(jié)構(gòu)體變量 */type C1010;/*預(yù)測分析表 */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+)/*輸出對齊符*/printf( );for (j = b;j = l;j+)printf(%c, Bj);printf(ttt);int _tmain(int argc, _
14、TCHAR* argv)int m, n, k = 0, flag = 0, finish = 0;char ch, x;type cha;/*用來接受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;strcpy(g.array, +TG);g.length = 3;g1.origin = G;g1.array0 = ;g1.length = 1;s.origin = S;strcpy(s.a
15、rray, *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+)/*初始化分析表*/for (n = 0;n = 5;n+)Cmn.origin = N;/*全部賦為空*/ /*填充分析表*/C00 = e;C03 = e;C11 = g;C14 = g1;C15 = g1;C20 = t;C23 = t;C31 =
16、 s1;C32 = s;C34 = C35 = s1;C40 = f1;C43 = f;printf(提示:本程序只能對由i,+,*,(,)構(gòu)成的以#結(jié)束的字符串進(jìn)行分析,n);printf(請輸入要分析的字符串:);do/*讀入分析串*/scanf(%c, &ch);if (ch != i) & (ch != +) & (ch != *) & (ch != () & (ch != ) & (ch != #)printf(輸入串中有非法字符n);exit(1);Bj = ch;j+; while (ch != #);l = j;/*分析串長度*/ch = B0;/*當(dāng)前分析字符*/Atop =
17、 #; A+top = E;/*#,E進(jìn)棧*/printf(步驟tt分析棧 tt剩余字符 tt所用產(chǎn)生式 n);dox = Atop-;/*x為當(dāng)前棧頂字符*/printf(%d, k+);printf(tt);for (j = 0;j = 5;j+)/*判斷是否為終結(jié)符*/if (x = v1j)flag = 1;break;if (flag = 1)/*如果是終結(jié)符*/if (x = #)finish = 1;/*結(jié)束標(biāo)記*/printf(acc!n);/*接受 */getchar();getchar();exit(1);/*if*/if (x = ch)print();print1();
18、printf(%c匹配n, ch);ch = B+b;/*下一個輸入字符*/flag = 0;/*恢復(fù)標(biāo)記*/*if*/else/*出錯處理*/print();print1();printf(%c出錯n, ch);/*輸出出錯終結(jié)符*/exit(1);/*else*/*if*/else/*非終結(jié)符處理*/for (j = 0;j = 4;j+)if (x = v2j)m = j;/*行號*/break;for (j = 0;j , cha.origin);/*輸出產(chǎn)生式*/for (j = 0;j= 0;j-)/*產(chǎn)生式逆序入棧*/A+top = cha.arrayj;if (Atop = )
19、/*為空則不進(jìn)棧*/top-;/*if*/else/*出錯處理*/print();print1();printf(%c出錯n, x);/*輸出出錯非終結(jié)符*/exit(1);/*else*/*else*/ while (finish = 0);return 0;4、 實(shí)驗(yàn)截圖基于LR(0)方法的語法分析程序一、實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制和調(diào)試一個典型的語法分析方法,進(jìn)一步掌握常用的語法分析方法。二、實(shí)驗(yàn)要求可根據(jù)自己實(shí)際情況,選擇以下一項(xiàng)作為分析算法的輸入:(1)直接輸入根據(jù)己知文法構(gòu)造的LR(0)分析表。(2)輸入已知文法的項(xiàng)目集規(guī)范族和轉(zhuǎn)換函數(shù),由程序自動生成LR(0)分析表;(3)輸入已知文法,
20、由程序自動生成LR(0)分析表。三、程序代碼#include stdafx.h#include#include#include#includeusing namespace std;struct stack int top;int st15; /狀態(tài)棧char sn15; /符號棧*sign;struct analysis /動作表結(jié)構(gòu)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
21、,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, $,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,
22、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 (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
23、(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, back;bool flag = true;sign = new stack;cout 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(2
24、0) 符 號 setw(20) 輸 入 串n;cout = setw(20) = setw(20) = setw(20) =n;cout step+ setw(20) st0 setw(21) sn setw(21) instr endl;while (flag) cout step+ stsign-top; /couta ia ix1 actionix1ia.act; /hhjhjif (ia = 99) cout top += 1;sign-snsign-top = a;sign-sn(sign-top) + 1 = 0;sign-stsign-top = actionix1ia.stat
25、us;current+;else if (actionix1ia.act = r) iG = actionix1ia.status - 1; /零下表開始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) + 1 = 0;else cout 此文法無法識別該輸入串!;break;else i
26、f (actionix1ia.act = $) cout 此文法無法識別該輸入串!;break;else if (actionix1ia.act = A) flag = false;for (i = 0;i top;i+)cout sti ;cout top) sn sn) current endl;if (flag = false) cout 文法分析成功! endl;四、實(shí)驗(yàn)截圖中間代碼生成程序(逆波蘭表示)一、實(shí)驗(yàn)?zāi)康?加深對語義翻譯的理解二、實(shí)驗(yàn)要求(1)編制一個中間代碼生成程序,能將算術(shù)表達(dá)式等翻譯成逆波蘭形式;(2)程序具有通用性,即能接受各種不同的算術(shù)表達(dá)式等語法成分。(3)有運(yùn)
27、行實(shí)例對于語法正確的算術(shù)表達(dá)式,能生成逆波蘭表示,并輸出結(jié)果;對不正確的表達(dá)式,能檢測出錯誤。(4) 提交實(shí)習(xí)報告,報告內(nèi)容應(yīng)包括:目的、要求,算法描述,程序代碼,運(yùn)行截圖三、程序代碼#include stdafx.h#include #include using namespace std;class Transformprivate: char s_stack20;/棧string s_result;/轉(zhuǎn)換之后的字符串,也就是后綴表達(dá)式int top;/棧頂public:Transform()top=0;s_stack0=#;s_result=;void pop() top-;void p
28、ush(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);elsewhile(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
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沖壓產(chǎn)品供貨合同范本
- 勞動合同范本表格
- 供暖ppp項(xiàng)目合同范本
- 醫(yī)師兼職勞務(wù)合同范本
- 公司瓶子采購合同范本
- 廈門車庫出租合同范本
- 公司工裝合同范本
- 公司簽商務(wù)合同范本
- 單體藥店轉(zhuǎn)讓貨品合同范例
- 包租汽車合同范本
- (2025)輔警招聘公安基礎(chǔ)知識必刷題庫及參考答案
- 基于圖像處理的CAD圖紙比對算法
- 2025年大模型應(yīng)用落地白皮書:企業(yè)AI轉(zhuǎn)型行動指南
- 2025年中國文玩電商行業(yè)發(fā)展現(xiàn)狀調(diào)查、競爭格局分析及未來前景預(yù)測報告
- 2025年臨床醫(yī)師定期考核必考復(fù)習(xí)題庫及答案(900題)
- JTG5120-2021公路橋涵養(yǎng)護(hù)規(guī)范
- 巨量千川(中級)營銷師認(rèn)證考試題(附答案)
- 寒假日常生活勞動清單及評價表
- 幼兒心理健康教育注意缺陷與多動障礙
- 竣工結(jié)算審核重難點(diǎn)分析及建議
- 【MOOC】營養(yǎng)學(xué)-武漢大學(xué) 中國大學(xué)慕課MOOC答案
評論
0/150
提交評論