最新北方工業(yè)大學(xué)編譯原理試驗(yàn)2報(bào)告語(yǔ)法分析_第1頁(yè)
最新北方工業(yè)大學(xué)編譯原理試驗(yàn)2報(bào)告語(yǔ)法分析_第2頁(yè)
最新北方工業(yè)大學(xué)編譯原理試驗(yàn)2報(bào)告語(yǔ)法分析_第3頁(yè)
最新北方工業(yè)大學(xué)編譯原理試驗(yàn)2報(bào)告語(yǔ)法分析_第4頁(yè)
最新北方工業(yè)大學(xué)編譯原理試驗(yàn)2報(bào)告語(yǔ)法分析_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精品文檔編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:語(yǔ)法分析器構(gòu)造指導(dǎo)教師:楊健 姓名:楊先宇 班級(jí):計(jì) 13-4 學(xué)號(hào):實(shí)驗(yàn)成績(jī):精品文檔精品文檔實(shí) 驗(yàn) 題 目實(shí)驗(yàn)二 語(yǔ)法分析器構(gòu)造實(shí) 驗(yàn) 目 的 和 要 求借助于詞法分析程序提供的分析結(jié)果,編寫一個(gè)算符優(yōu)先語(yǔ)法分析程 序,程序能進(jìn)行語(yǔ)法結(jié)構(gòu)分析和錯(cuò)誤檢查,并產(chǎn)生相應(yīng)的歸約信息。同時(shí) 給出出錯(cuò)信息和錯(cuò)誤類型,從而加深對(duì)語(yǔ)法分析的理解。說明提示:1. 本實(shí)驗(yàn)的優(yōu)先表可以手工先設(shè)計(jì)好。2. 本實(shí)驗(yàn)要求中提出的“產(chǎn)出相應(yīng)的歸約信息”意指在語(yǔ)法分析的過程中,一旦產(chǎn) 生歸約,在程序上產(chǎn)生并最終輸出歸約產(chǎn)生式序號(hào)。3. 出錯(cuò)類型的產(chǎn)生可預(yù)先對(duì)應(yīng)優(yōu)

2、先表中出錯(cuò)欄列表說明其出錯(cuò)類型,并分別編序,當(dāng)分析中產(chǎn)生錯(cuò)誤時(shí)以字符串輸出相應(yīng)表中錯(cuò)誤信息。設(shè) 計(jì) 思 想 與 框 架功能描述: LL( 1)分析法是一種不帶回溯的非遞歸的自上而下的分析 法. 其基本思想是 根據(jù)輸入串的當(dāng)前輸入符號(hào)來唯一確定選用某條規(guī)則來 進(jìn)行推倒 , 當(dāng)這個(gè)輸入符號(hào)與推倒的第一個(gè)符號(hào)相同時(shí)再取輸入串的下一 個(gè)符號(hào),繼續(xù)確定下一個(gè)推倒應(yīng)選的規(guī)則 ,如此下去 ,直到推倒出被分析的 輸入串為止 .1. 首先,手工制作一個(gè)算符優(yōu)先表(也可以編程序?qū)崿F(xiàn)) 。2. 將詞法分析所得到的預(yù)處理文件作為該程序的輸入文件,并根據(jù)相應(yīng)的 算法提取出算術(shù)表達(dá)式并轉(zhuǎn)換為輸入串,將其保存在 strin

3、gs 這個(gè)字符數(shù) 組中,并把表達(dá)式中相應(yīng)常量用字符 i 來表示,以便規(guī)約(以 #結(jié)束輸 入串)。3.其次,初始化符號(hào)棧。將輸入串里的字符讀進(jìn) a里(a 用于表示當(dāng)前的 輸入字符),將棧頂元素與 a(當(dāng)前字符 )相比較,如果棧頂元素的優(yōu)先級(jí)比 a 的低或等于則進(jìn)棧; 如果棧頂元素的優(yōu)先級(jí)比 a 的高則將棧頂指針下移,精品文檔精品文檔直到找到一個(gè)字符串的優(yōu)先級(jí)比它上一個(gè)字符串的優(yōu)先級(jí)低的字符串(該 過程為尋找最左素短語(yǔ)) ,然后將這兩個(gè)字符中間的符號(hào)串尋找匹配的產(chǎn)生 式后進(jìn)行規(guī)約,并將其彈出站定,將規(guī)約得到的非終結(jié)符入棧;棧頂元素 的下一個(gè)元素優(yōu)先級(jí)低于或等于當(dāng)前輸入的字符串就移進(jìn),否則就出錯(cuò)。

4、然后重復(fù) c 過程,直到輸入串結(jié)束 (遇見 #)。(輸出相應(yīng)的移近規(guī)約過 程)。4.重復(fù) b和c過程,直到該預(yù)處理文件結(jié)束(遇見 #)。核 心 算 法void process(char *temp)int k = 1, j, w, l, m, t = 0, p, q, v, yu = 0; stack0 = ;stackk = #; dangqianfuhao = ;panduanshengyuzifuchuan(yu);step = 0;shuchu(0, -1);/ 這是對(duì) #號(hào)的處理/-1 代表char Q;int i = 0;dodangqianfuhao = tempi; / 取符號(hào)

5、精品文檔精品文檔int flag = 0;/對(duì)終結(jié)符號(hào)的善意假設(shè)for (w = 0; w 8; w+) 匹配if (stackk = wordw) flag = 1;/ 查找運(yùn)算符表, 誰(shuí)與 stackkif (flag = 1)j = k; else/ j指向終極符了j = k - 1;/ j指向 stack 中最后一個(gè)非終結(jié)符for (w = 0; w )doQ = stackj;精品文檔精品文檔int flag = 0;/ 再次做出善意假設(shè)終結(jié)符for (w = 0; w 8; w+)if (stackj - 1 = wordw) flag = 1;if (flag = 1) j =

6、j - 1;elsej = j - 2;for (w = 0; w 8; w+)/ 找出 sj 和 Q 對(duì)應(yīng)優(yōu)先表里的位置,對(duì)決if (stackj = wordw) p = w;if (Q = wordw)q = w;/ p 記錄員,代理人/ q 記錄員,代理人 while (Mpq != );/ 當(dāng)然所有前提是, 可行的情況下,但是為了做出最初的判斷,使用了 do-whilestackj + 1 = N; 替/ N 的誕生,非終結(jié)符代精品文檔/ 符號(hào)棧出棧,向前走/ 以絕后患,置 0/ 規(guī)約之/ 剩下的事情就是根據(jù) M 判精品文檔for (w = j + 2; w = k; w+) 步,找

7、到另一個(gè)非終結(jié)符stackw = 0;k = j + 1;shuchu(1,1);break;if(Mlm=)斷,規(guī)約之k = k + 1;stackk = dangqianfuhao;yu+;panduanshengyuzifuchuan(yu);shuchu(0, -1);i+;else if(Mlm=)k=k+1;stackk=dangqianfuhao;yu+;panduanshengyuzifuchuan(yu);shuchu(0, 0); i+;精品文檔精品文檔 elseif(Mlm=e1)printf( 非法左括號(hào) !n); i+;else if(Mlm=e2)printf( 缺

8、少運(yùn)算符 !n); i+;else if(Mlm=e3)printf( 非法右括號(hào) !n); i+;while(tempi!=0);源 程 序 及 注#include#include#include char word8=+,-,*,/,(,),i,#;char *xingshi6=N+N,N-N,N*N,N/N,)N(,i;精品文檔精品文檔char M88=, , , , ,=,e2,e2, ,e2,e2, ,e3,=printf(%-10d, step); printf(%-10s, stack);if (m = -1) printf();printf(%10c, dangqianfuha

9、o);printf(%10s, shengyushuruchuan);if (t = 0) printf(移進(jìn) n);if (t = 1) printf(規(guī)約 n);step+;void panduanshengyuzifuchuan(int a) / 判斷剩余字符串 int t,v;for (t = 0; t strlen(aftertemp); t+) shengyushuruchuant = 0;for (t = 0, v = a; v strlen(aftertemp); t+, v+) shengyushuruchuant = aftertempv;void process(char

10、 *temp)int k = 1, j, w, l, m, t = 0, p, q, v, yu = 0; stack0 = ; stackk = #;dangqianfuhao = ; panduanshengyuzifuchuan(yu);step = 0; shuchu(0, -1);/ 這是對(duì) #號(hào)的處理/-1 代表精品文檔精品文檔char Q; int i = 0; dodangqianfuhao = tempi; int flag = 0;for (w = 0; w 8; w+)/取符號(hào)對(duì)終結(jié)符號(hào)的善意假設(shè)/ 查找運(yùn)算符表, 誰(shuí)與 stackk匹配if (stackk = word

11、w) flag = 1;if (flag = 1)j = k; else/ j指向終極符了j = k - 1;/ j指向 stack 中最后一個(gè)非終結(jié)符for (w = 0; w )/終結(jié)符的處理 do精品文檔精品文檔Q = stackj; int flag = 0;/ 再次做出善意假設(shè)終結(jié)符for (w = 0; w 8; w+)if (stackj - 1 = wordw)flag = 1;if (flag = 1)j = j - 1;elsej = j - 2;for (w = 0; w 8; w+)先表里的位置,對(duì)決if (stackj = wordw) p = w;if (Q = w

12、ordw)q = w; while (Mpq != );/ 找出 sj 和 Q 對(duì)應(yīng)優(yōu)/ p 記錄員,代理人/ q 記錄員,代理人/ 當(dāng)然所有前提是, 可行的情況下,但是為了做出最初的判斷,使用了 do-whilestackj + 1 = N;替for (w = j + 2; w = k; w+) 步,找到另一個(gè)非終結(jié)符stackw = 0;/ N 的誕生,非終結(jié)符代/ 符號(hào)棧出棧,向前走一/ 以絕后患,置 0精品文檔精品文檔k = j + 1;shuchu(1,1); / 規(guī)約之break;if(Mlm= | str = | str = ! | str = =) & ch = =)ch =

13、fgetc(fp);int k = 0;if(ch=#)printf( 語(yǔ)法分析結(jié)束! n); fclose(fp); return 0;ch = fgetc(fp);while (ch != & ch != #)tempk+ = ch;ch = fgetc(fp);tempk = 0;printf( 要處理的表達(dá)式為 %sn, temp);int t = 0;/ 現(xiàn)在開始處理int y = 0;while(tempt!=0)該串精品文檔精品文檔int flag = 0; / 做出善意推斷,非終結(jié)符while (isdigit(tempt) != 0)t+;flag = 1; / 數(shù)字是終結(jié)符

14、if (flag = 1)aftertempy = i;/ tempa 為終結(jié)符料理后事,既提取類型y+;if (flag = 0)aftertempy = tempt;/ 提取類型y+;t+;aftertempy = #;aftertempy + 1 = 0;/ 結(jié)束本串精品文檔精品文檔printf( 表達(dá)式轉(zhuǎn)化為輸入串為 %sn, aftertemp);printf( 步驟號(hào) 符號(hào)棧 優(yōu)先關(guān)系 當(dāng)前分析符 剩余輸入串 動(dòng)作n);for (int w = 1; w 10; w+)/ 初始化棧stackw = 0;process(aftertemp);fclose(fp);printf(END !n); retur

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論