語法分析(自上而下分析)實驗報告_第1頁
語法分析(自上而下分析)實驗報告_第2頁
語法分析(自上而下分析)實驗報告_第3頁
語法分析(自上而下分析)實驗報告_第4頁
語法分析(自上而下分析)實驗報告_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 實習二 語法分析自上而下分析一、 實驗目的使用預測分析方法對輸入的表達式進行分析,掌握其具體的使用并且學會去分析一個文法。二、 實驗內(nèi)容1 設計表達式的語法分析器算法(使用預測分析)2 編寫一段代碼并上機調(diào)試查看其運行結(jié)果三、 實驗要求使用LL(1)分析算法設計表達式的語法分析器LL(1)文法是一個自上而下的語法分析方法,它是從文法的開始符號出發(fā),生成句子的最左推導,從左到右掃描源程序,每次向前查看一個字符,確定當前應該選擇的產(chǎn)生式。實現(xiàn)LL(1)分析的另一種有效方法是使用一張分析表和一個棧進行聯(lián)合控制。預測分析程序的總控程序在任何時候都是按STACK棧頂符號X和當前a的輸入符號行事的。對于

2、任何(X,a),總控程序每次都執(zhí)行三種可能的動作之一。1. 若Xa“#”,則宣布分析成功,停止分析過程2. 若Xa“#”,則把X從STACK棧頂逐出,讓a指向下一個輸入符號。3. 若X是一個非終結(jié)符,則查看分析表。四、 運行結(jié)果(本程序只能對由i,+,*,(,)構(gòu)成的以#結(jié)束的字符串進行分析)五、 源程序?qū)崿F(xiàn)/*LL(1)分析法源程序,只能在VC+中運行 */#include#include#include#includechar A20;char B20;char v120=i,+,*,(,),#;/*終結(jié)符 */char v220=E,G,T,S,F;/*非終結(jié)符 */int j=0,b=

3、0,top=0,l;/*L為輸入串長度 */typedef struct type char origin;/*大寫字符 */ char array5;/*產(chǎn)生式右邊字符 */ int length;/*字符個數(shù) */type;type e,t,g,g1,s,s1,f,f1;/*結(jié)構(gòu)體變量 */type C1010;/*預測分析表 */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

4、;j+)/*輸出對齊符*/ printf( ); for(j=b;j=l;j+) printf(%c,Bj); printf(ttt);/*print1*/void main() 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;

5、g1.origin=G; g1.array0=; g1.length=1; s.origin=S; strcpy(s.array,*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;C1

6、4=g1;C15=g1; C20=t;C23=t; C31=s1;C32=s;C34=C35=s1; C40=f1;C43=f; 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;/*當前分析字符*/ Atop=#; A+top=E;/*#,E進棧*/ printf(步驟tt分析棧 tt剩余字符 tt

7、所用產(chǎn)生式 n); do x=Atop-;/*x為當前棧頂字符*/ 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é)束標記*/ printf(acc!n);/*接受 */ getchar(); getchar(); exit(1); /*if*/ if(x=ch) print(); print1(); printf(%c匹配n,ch); ch=B+b;/*下一個輸入字符*/ flag=0;/*恢復標記*

8、/ /*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=)/*為空則不進棧*/ top-; /*if*/ else/*出錯處理*/ print(); print1(); printf(%c出錯

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論