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

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn)二:自上而下語法分析一、實(shí)驗(yàn)?zāi)康模焊鶕?jù)某一文法編制調(diào)試遞歸下降分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)自上而下分析法的理解。二、實(shí)驗(yàn)預(yù)習(xí)提示自下而上分析法的前提改造文法:消除二義性、消除左遞歸、提取左因子,判斷是否為L(zhǎng)L(1)文法A遞歸下降1、遞歸下降分析法的功能詞法分析器的功能是利用函數(shù)之間的遞歸調(diào)用模擬語法樹自上而下的構(gòu)造過程。2、遞歸下降分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法為G的每個(gè)非終結(jié)符號(hào)U構(gòu)造一個(gè)遞歸過程,不妨命名為U。U的產(chǎn)生式的右邊指出這個(gè)過程的代碼結(jié)構(gòu):(1)

2、若是終結(jié)符號(hào),則和向前看符號(hào)對(duì)照,若匹配則向前進(jìn)一個(gè)符號(hào);否則出錯(cuò)。(2)若是非終結(jié)符號(hào),則調(diào)用與此非終結(jié)符對(duì)應(yīng)的過程。當(dāng)A的右部有多個(gè)產(chǎn)生式時(shí),可用選擇結(jié)構(gòu)實(shí)現(xiàn)。具體為:(1)對(duì)于每個(gè)非終結(jié)符號(hào)U-u1|u2|un處理的方法如下:U( )ch=當(dāng)前符號(hào);if(ch可能是u1字的開頭) 處理u1的程序部分;else if(ch可能是u2字的開頭)處理u2的程序部分;else error() (2)對(duì)于每個(gè)右部u1-x1x2xn的處理架構(gòu)如下:處理x1的程序;處理x2的程序; 處理xn的程序;(3)如果右部為空,則不處理。(4)對(duì)于右部中的每個(gè)符號(hào)xi如果xi為終結(jié)符號(hào):if(xi= = 當(dāng)前的

3、符號(hào)) NextChar(); return; else出錯(cuò)處理如果xi為非終結(jié)符號(hào),直接調(diào)用相應(yīng)的過程xi()說明: NextChar為前進(jìn)一個(gè)字符函數(shù)。BLL(1)分析法1、LL(1)分析法的功能LL(1)分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號(hào)以及LL(1)分析表,對(duì)輸入符號(hào)串自上而下的分析過程。XVN#S進(jìn)棧,當(dāng)前輸入符送a上托棧頂符號(hào)放入X若產(chǎn)生式為X X1X2Xn按逆序即XnX2X1入棧出錯(cuò)X=#XVTX=aMX,a是產(chǎn)生式嗎出錯(cuò)X=a讀入下一個(gè)符號(hào)結(jié)束是是是是否否否否否是2、LL(1)分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法三、實(shí)驗(yàn)過程和指導(dǎo):(一)準(zhǔn)備:1.閱讀課本有

4、關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī):將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過。(三)程序要求:程序輸入/輸出示例:對(duì)下列文法,用兩種分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析:(1)E-TG(2)G-+TG (3)G-(4)T-FS(5)S-*FS(6)S-(7)F-(E)(8)F-i輸出的格式如下:(1)遞歸下降分析程序輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串例如:i+i*i#輸出結(jié)果:i+i*i#為合法符號(hào)串備注:輸入一符號(hào)串如i+i*#,要求輸出為“非法的符號(hào)串”。(2)LL(1)分析:輸入一以#

5、結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串例如:i+i*i#輸出結(jié)果:i+i*i#為合法符號(hào)串注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、字符I,結(jié)束符#;2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),可以詳細(xì)的輸出推導(dǎo)的過程,即詳細(xì)列出每一步使用的產(chǎn)生式。分析棧剩余輸入串所用產(chǎn)生式Ei+i*i#E-TG4.與讀文件有關(guān)的函數(shù):FILE *fp; if(fp=fopen(E:222.txt,r)=NULL) /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符fprintf(stderr,error opening.

6、n); exit(1); fgetc(fp) 從數(shù)據(jù)流中區(qū)下一個(gè)字符fopen 文件打開函數(shù),返回指向文件第一個(gè)字符的指針(四)程序思路(僅供參考):遞歸下降分析法:0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將輸入符號(hào)串輸入到字符緩沖區(qū)中。2.利用遞歸下降分析法分析,對(duì)每個(gè)非終結(jié)符編寫函數(shù),在主函數(shù)中調(diào)用文法開始符號(hào)的函數(shù)。LL(1)分析法:模塊結(jié)構(gòu):1、定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。2、初始化:設(shè)立LL(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體等);3、運(yùn)行程序:讓程序分析一個(gè)text文件,判斷輸入的字符串是否符合文法定義的規(guī)則;4、利用LL(1)分析算法進(jìn)行表達(dá)式

7、處理:根據(jù)LL(1)分析表對(duì)表達(dá)式符號(hào)串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯(cuò)誤則顯示簡(jiǎn)單的錯(cuò)誤提示。部分代碼示例:#include#include#include#includestruct Stackchar s30;int top; /*棧頂指針 */S1;char v16=i,+,*,(,),#;/*終結(jié)符 */char v25=E,G,T,S,F;/*非終結(jié)符 */*用二維數(shù)組保存預(yù)測(cè)分析表,可用符號(hào)來代替,注意字符串結(jié)束位自動(dòng)加0 */char table564=“TG”,”,”,”,”TG”,”,void print()/*輸出分析棧 */int a;/*指針*/for

8、(a=0;aS1.top;a+)coutS1.sa;coutendl;/*print*/void intialstack() S1.top=0;void push(char ch) S1.sS1.top=ch;S1.top+;char pop( ) S1.top-;return S1.sS1.top; void jinzhan(int hang,int lie) .int iszhongjie(char X ) ./*判斷X是否為終結(jié)符,返回下標(biāo)*/bool chabiao(char X,char sym)/*判斷X是否為非終結(jié)符,sym是否為終結(jié)符,若是查找預(yù)測(cè)表對(duì)應(yīng)表格是否為空白,是則出錯(cuò)

9、,否則進(jìn)棧*/void main() FILE *fp;char sym,X;bool flag,cuo; if(fp=fopen(E:222.txt,r)=NULL) /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符fprintf(stderr,error opening.n); exit(1); initialstack();push(#);push(E);sym=fgetc(fp);/*把第一個(gè)輸入符號(hào)讀進(jìn)sym*/flag=true;cuo=falsewhile (flag&!error) X=pop();if (X=#) .else if iszhongjie(X) els

10、e if(!chabiao(X,sym) cuo=true;(五)練習(xí)該實(shí)驗(yàn)的目的和思路:需要利用程序設(shè)計(jì)語言的知識(shí)和大量編程技巧,通過這個(gè)練習(xí)可大大提高軟件開發(fā)能力。通過練習(xí),掌握函數(shù)間相互調(diào)用的方法。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。五、上交:實(shí)驗(yàn)報(bào)告:實(shí)驗(yàn)名稱實(shí)驗(yàn)?zāi)康暮鸵螅ㄒ唬?shí)驗(yàn)內(nèi)容(1)功能描述:該程序具有什么功能?(2)程序結(jié)構(gòu)描述:函數(shù)調(diào)用格式、參數(shù)含義、返回值描述、函數(shù)

11、功能;函數(shù)之間的調(diào)用關(guān)系圖。(3)程序源代碼(二)實(shí)驗(yàn)過程記錄:出錯(cuò)次數(shù)、出錯(cuò)嚴(yán)重程度、解決辦法摘要。(三)實(shí)驗(yàn)總結(jié):你在編程過程中花時(shí)多少?遇到了哪些難題?你是怎么克服的?你的收獲有哪些?自上而下分析算法#include#include#define ERROR 0 char sym; /用于臨時(shí)存儲(chǔ)文件中讀出的單個(gè)字符FILE *fp; /讀取文件的指針/非終結(jié)符定義的方法 void e();void g();void t();void s();void f();/讀取文件中的下一個(gè)字符void advance();void main() if(fp=fopen(E:222.txt,r)=

12、NULL)/讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符 fprintf(stderr,error opening.n); exit(1); e();/對(duì)應(yīng)產(chǎn)生式(1)E-TGvoid e()advance();t();g();if(sym=#)printf(輸入的為合法的字符串n);else printf(非法字符串);/對(duì)應(yīng)產(chǎn)生式(2)G-+TG (3)G- 空 :不做任何處理void g()if(sym =+)printf(+);advance(); t();g();/對(duì)應(yīng)產(chǎn)生式 (4)T-FSvoid t()f();s();/ 對(duì)應(yīng)產(chǎn)生式(5)S-*FS (6)S-void

13、 s()if(sym=*)printf(*);advance();f();s();/對(duì)應(yīng)產(chǎn)生式(7)F-(E) (8)F-ivoid f()if(sym=()advance();e(); if(sym=) advance(); else printf(非法字符串); exit(ERROR); else if(sym=i) printf(i);advance();else printf(非法字符串);exit(ERROR);void advance()sym=fgetc(fp);/ 從數(shù)據(jù)流中區(qū)下一個(gè)字符預(yù)測(cè)表分析法#include#include#include#includestruct S

14、tackchar s30;int top; /*棧頂指針 */S1;int num=0;char v16=i,+,*,(,),#;/*終結(jié)符 */char v25=E,G,T,S,F;/*非終結(jié)符 */*用二維數(shù)組保存預(yù)測(cè)分析表,可用符號(hào)來代替,注意字符串結(jié)束位自動(dòng)加0 */char table564=GT,GT,GT+,SF,SF,SF*,i,)E(,;void print()/*輸出分析棧 */int a;/*指針*/for(a=0;aS1.top;a+)printf(%c,S1.sa);printf(t);/*print*/void intialstack() S1.top=0;/*初始

15、化棧*/void push(char ch) S1.sS1.top=ch;S1.top+;/*壓棧*/char pop( ) S1.top-;return S1.sS1.top; /*出棧*/void jinzhan(int hang,int lie) char *chuan;chuan=tablehanglie;chuan3=0;int i=0;while(chuani!=NULL&chuan0!=) push(chuani);i+;/*進(jìn)棧操作,將符號(hào)串?dāng)?shù)組壓入棧中*/int iszhongjie(char X )for(int i=0;i6;i+)if(X=v1i)return i;re

16、turn -1;/*判斷X是否為終結(jié)符,返回下標(biāo)*/int isfzhongjie(char X )for(int i=0;i,X);for(int i=(strlen(tablehanglie)-1);i=0;i-)printf(%c,tablehangliei);printf(n); jinzhan(hang,lie); return true;else printf(錯(cuò)誤n);return false;/*判斷X是否為非終結(jié)符,sym是否為終結(jié)符,若是查找預(yù)測(cè)表對(duì)應(yīng)表格是否為空白,是則出錯(cuò),否則進(jìn)棧*/void shuchuchuan()FILE *fp1;char c;int num1

17、=0; if(fp1=fopen(E:222.txt,r)=NULL) /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符fprintf(stderr,error opening.n); exit(1); c=fgetc(fp1);while(c!=#)if(num1=num)printf(%c,c);elseprintf( );c=fgetc(fp1);num1+;printf(#t);void main() FILE *fp;char sym,X;bool flag,cuo; if(fp=fopen(E:222.txt,r)=NULL) /讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個(gè)字符fprintf(stderr,error opening.n); exit(1); intialstack();push(#);push(E);sym=fgetc(fp);/*把第一個(gè)輸入

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論