




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、-. z.實(shí)驗(yàn)三自下而上語法分析及語義分析一、實(shí)驗(yàn)?zāi)康模和ㄟ^本實(shí)驗(yàn)掌握LR分析器的構(gòu)造過程,并根據(jù)語法制導(dǎo)翻譯,掌握屬性文法的自下而上計(jì)算的過程。二、實(shí)驗(yàn)學(xué)時:4學(xué)時。三、實(shí)驗(yàn)容根據(jù)給出的簡單表達(dá)式的語法構(gòu)成規(guī)則見五,編制LR分析程序,要求能對用給定的語法規(guī)則書寫的源程序進(jìn)展語法分析和語義分析。對于正確的表達(dá)式,給出表達(dá)式的值。對于錯誤的表達(dá)式,給出出錯位置。四、實(shí)驗(yàn)方法采用LR分析法。首先給出S-屬性文法的定義為簡便起見,每個文法符號只設(shè)置一個綜合屬性,即該文法符號所代表的表達(dá)式的值。屬性文法的定義可參照書137頁表6.1,并將其改造成用LR分析實(shí)現(xiàn)時的語義分析動作可參照書145頁表6.5。
2、接下來給出LR分析表。然后程序的具體實(shí)現(xiàn):LR分析表可用二維數(shù)組或其他實(shí)現(xiàn)。添加一個val棧作為語義分析實(shí)現(xiàn)的工具。編寫總控程序,實(shí)現(xiàn)語法分析和語義分析的過程。注:對于整數(shù)的識別可以借助實(shí)驗(yàn)1。五、文法定義簡單的表達(dá)式文法如下:E-E+T|E-T|T T-T*F|T/F|F F-(E)|i 上式中,i 為整數(shù)。六、處理程序例例1: 正確源程序例:23+(45+4)* 40分析結(jié)果應(yīng)為:正確的表達(dá)式。其值為:1983例2: 錯誤源程序例:5+(56+)-24分析結(jié)果應(yīng)為:錯誤的表達(dá)式:出錯位置為附錄:源程序#include #includestring.h #include using name
3、space std; #define R 30 #define C 20 typedef struct elem char e4; Elem; /ACTION表與GoTo表中的元素類型 Elem LRRC; /存放ACTION表與GoTo表中的容 typedef struct out int order; /序號 int state10; /狀態(tài)棧 char sign30; /符號棧 char grasen20; /產(chǎn)生式 char input30; /輸入串 char e*plen50; /解釋說明 OutNode; /輸出結(jié)果中每一行的類型 OutNode out20; /存放輸出結(jié)果 c
4、har Sentence20; /存放文法的一個句子 char GramSent1020; /存放文法的一組產(chǎn)生式 int row,colno; /row為狀態(tài)個數(shù)數(shù),colno為ACTION表與GoTo表列總數(shù) int stateTop=0,signTop=0; /狀態(tài)棧與符號棧的棧頂位置(值與棧中元素的個數(shù)相等) void input_GramSent() int i,num; printf(請輸入文法中產(chǎn)生式的個數(shù)n); scanf(%d,&num); for(i=0;inum;i+) printf(請輸入文法的第%d個產(chǎn)生式n,i); scanf(%s,GramSent+i-1); p
5、rintf(請輸入文法的一個句子n); scanf(%s,Sentence); printf(*n); printf(* 文法的產(chǎn)生式如下: *n); printf(*n); for(i=0;inum;i+) printf(%sn,GramSent+i); printf(*n); printf(* 文法的句子如下: *n); printf(*n); printf(%sn,Sentence); void input_LR(int row,int colno) /row為行總數(shù),colno為列總數(shù) int i,j; char mid4; printf(*n); printf(* 提示:每輸入一個元
6、素后就回車 *n); printf(*n); printf(請輸入LR分析表的終結(jié)符(包括#)與非終結(jié)符n); for(j=0;jcolno;j+) scanf(%s,LR0j.e); for(i=0;irow;i+) printf(請輸入%d號狀態(tài)所對應(yīng)的各列的元素,空白的地方用s代替n,i); for(j=0;jcolno;j+) scanf(%s,mid); if(strcmp(mid,s)=0|strcmp(mid,S)=0) strcpy(LRi+1j.e, ); else strcpy(LRi+1j.e,mid); void output_LR(int row,int colno)
7、 int i,j; printf(*n); printf(* LR分析表如下: *n); printf(*n); printf(n); printf( ); for(j=0;jcolno;j+) printf(%s ,LR0j.e); printf(n); for(i=1;i=row;i+) printf(%d ,i-1); for(j=0;jcolno;j+) printf(%s ,LRij.e); printf(n); printf(n); int SignNum(char ch)/給定一個終結(jié)符或非終結(jié)符,返回其在ACTION表與GoTo表中的列位置 int i; char c2=0;
8、c0=ch; for(i=0;icolno;i+) if(strcmp(c,LR0i.e)=0) return i; return -1; int CharChangeNum(char* ch)/給定一數(shù)字字符串,返回其所對應(yīng)的數(shù)字 int result=0; while(*ch!=0) result=result*10+(*ch-0); ch+; return result; int OutResult(int s,int c,int i)/輸出結(jié)果的第i+1行處理函數(shù),(s為狀態(tài),c為列) char mid4,gra20; int s_num,r_num; int n,len,j; str
9、cpy(mid,LRs+1c.e); if(strcmp(mid, )=0) printf(不能規(guī)約n); return -2; if(strcmp(mid,acc)=0|strcmp(mid,ACC)=0) printf(規(guī)約成功n); return -1; outi+1.order=i+2; if(mid0=s|mid0=S) s_num=CharChangeNum(mid+1);/s_num為S后的數(shù)字 for(j=0;jstateTop;j+) outi+1.statej=outi.statej; outi+1.statestateTop=s_num; outi+1.state+sta
10、teTop=-1; /完成第i+1行的狀態(tài)棧賦值 strcpy(outi+1.sign,outi.sign); outi+1.signsignTop=outi.input0; outi+1.sign+signTop=0; /完成第i+1行的符號棧的賦值 strcpy(outi+1.grasen, ); /完成第i+1行的產(chǎn)生式的賦值 strcpy(outi+1.input,outi.input+1); /完成第i+1行的輸入符號串的賦值 else if(mid0=r|mid0=R) r_num=CharChangeNum(mid+1);/r_num為r后的數(shù)字 strcpy(gra,*(Gra
11、mSent+r_num-1); len=strlen(gra); for(j=0;j) break; n=strlen(gra+j+2); stateTop-=n; signTop-=n; for(j=0;jstateTop;j+) outi+1.statej=outi.statej; j=SignNum(gra0); outi+1.statestateTop=CharChangeNum(LRouti+1.statestateTop-1+1j.e); outi+1.state+stateTop=-1; /完成第i+1行的狀態(tài)棧賦值 strcpy(outi+1.sign,outi.sign);
12、outi+1.signsignTop=gra0; outi+1.sign+signTop=0; /完成第i+1行的符號棧的賦值 strcpy(outi+1.grasen,gra); /完成第i+1行的產(chǎn)生式的賦值 strcpy(outi+1.input,outi.input); /完成第i+1行的輸入符號串的賦值 return 1; void OutputResult(int r) int i,j; printf(*n); printf(* 句子:%s 用LR分析表 規(guī)約過程如下: *n,Sentence); printf(*n); for(i=0;i=r;i+) j=0; printf(%2
13、d ,outi.order); while(outi.statej!=-1) printf(%d,outi.statej+); printf( %s %s %sn,outi.sign,outi.grasen,outi.input); int OutControl()/輸出結(jié)果的總控函數(shù) int s_num,i=0; out0.order=1; /序號賦值 out0.state0=0; stateTop=1; out0.statestateTop=-1; /狀態(tài)棧賦值,置棧頂位 strcpy(out0.sign,#); signTop=1; /符號棧賦值,置棧頂位 strcpy(out0.gra
14、sen, ); /產(chǎn)生式為空 strcpy(out0.input,Sentence); /以下兩行為輸入串賦值 strcat(out0.input,#); strcpy(out0.e*plen,0和#進(jìn)棧); /解釋說明 /初使化輸出結(jié)果的第一行 while(1) s_num=SignNum(outi.input0); /if(s_num!=-1) if(OutResult(outi.statestateTop-1,s_num,i)!=1) break; i+; return i; main() int r; printf(*n); printf(* 函數(shù)的輸入: 文法的產(chǎn)生式,文法句型的一個句子,LR分析表 *n); printf(* 函數(shù)的輸出: LR分析器的工作過程與說明 *n); printf(*n); printf(請輸入LR分析表中終結(jié)符與非終結(jié)符的總個數(shù)n); scanf(%d,&col
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)上市居間合同范本
- 2025年沈陽貨運(yùn)資格證考試中心
- 農(nóng)資貨物銷售合同范本
- 出售桌球桌子合同范本
- 全手機(jī)購銷合同范本
- 勞動解約合同范本
- 劃線施工合同范例
- 《第一單元 參考活動1 唱響團(tuán)歌》教學(xué)設(shè)計(jì) -2023-2024學(xué)年初中綜合實(shí)踐活動蘇少版八年級上冊
- 內(nèi)墻翻新粉刷合同范本
- 3人合伙養(yǎng)殖合同范本
- 一年級下冊口算題卡大全(50套直接打印版)
- 一年級下冊寫字表練字帖
- 2024PowerTitan系列運(yùn)維指導(dǎo)儲能系統(tǒng)運(yùn)維指導(dǎo)
- 2024年成都溫江興蓉西城市運(yùn)營集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 申請勞動仲裁申請書8篇
- 2024年互聯(lián)網(wǎng)行業(yè)人才發(fā)展趨勢報告-獵聘大數(shù)據(jù)研究院-202405
- 成品出貨檢驗(yàn)培訓(xùn)課件
- 審計(jì)報告中無所有者權(quán)益變動表書面聲明
- 5人小品《聚寶盆銀行》臺詞
- SJG 148-2024 橋梁結(jié)構(gòu)健康監(jiān)測技術(shù)標(biāo)準(zhǔn)
- 《計(jì)算機(jī)網(wǎng)絡(luò)(第8版)》 課件 第5、6章 運(yùn)輸層、應(yīng)用層
評論
0/150
提交評論