實(shí)驗(yàn)三自下而上語法分析及語義分析_第1頁
實(shí)驗(yàn)三自下而上語法分析及語義分析_第2頁
實(shí)驗(yàn)三自下而上語法分析及語義分析_第3頁
實(shí)驗(yàn)三自下而上語法分析及語義分析_第4頁
實(shí)驗(yàn)三自下而上語法分析及語義分析_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論