編譯原理實驗LL1分析法.doc_第1頁
編譯原理實驗LL1分析法.doc_第2頁
編譯原理實驗LL1分析法.doc_第3頁
編譯原理實驗LL1分析法.doc_第4頁
編譯原理實驗LL1分析法.doc_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編譯原理程序設計實驗報告表達式語法分析器的設計實現(xiàn)班級:計算機1306班姓名:王利達學號:20133959實驗目標:使用LL(1)分析法構造表達式語法分析器程序,判別算術表達式,給出判別結果。實驗內(nèi)容:一、概要設計1.算術表達式文法:E T | E0TT F | T1FF i | ( E )其中0:+ -1:* /i:數(shù)字或常數(shù)文法變換:E T MM 0 T M |T F | NN 1 F N |F i | ( E )其中0:+ -1:* /i:數(shù)字或常數(shù)2.LL(1)分析表表1.LL(1)分析表i+-*/()#EMT,pMT,pMMT,nMT,n,p,pTNF,pNF,pNNF,nNF,n,p,pF,n)E,n),n#OK二、數(shù)據(jù)結構1.輸入表達式定義char型數(shù)組expstr為存放輸入表達式的數(shù)組,char expstr100;2.分析棧定義一個棧來進行LL(1)分析。棧中有bottom、top、stacksize等元素,用于程序調(diào)用棧和對棧操作。typedef struct /定義語法的棧 SElemType *bottom;/底 SElemType *top;/頂 int stacksize;SqStack; (包括:概要設計、數(shù)據(jù)結構、流程圖、關鍵函數(shù)等有選擇填寫)源程序代碼:(加入注釋)#include#include#includeusing namespace std;#define STACKSIZE 30 /棧大小#define STACKINCREMENT 10 /棧增量#define OK 1#define Error 0#define OVERFLOW -1typedef char SElemType;typedef int Status;int i=0;int count1=0;int count2=0; /計數(shù)終結符的個數(shù)char expstr100;typedef struct /定義語法的棧 SElemType *bottom;/底 SElemType *top;/頂 int stacksize;SqStack;Status InitStack(SqStack &S) /初始化棧 S.bottom=(SElemType*)malloc(STACKSIZE*sizeof(SElemType); if(!S.bottom) exit(OVERFLOW); S.top=S.bottom; S.stacksize=STACKSIZE; return OK;Status PUSH(SqStack &S,SElemType e) if(S.top-S.bottom=S.stacksize) S.bottom=(SElemType*)realloc(S.bottom,(S.stacksize+STACKINCREMENT)*sizeof(SElemType); if(!S.bottom) exit(OVERFLOW); S.top=S.bottom+S.stacksize; S.stacksize+=STACKINCREMENT; *(S.top)=e; (S.top)+; return OK;Status POP(SqStack &S,SElemType &e) if(S.top=S.bottom) return Error; S.top-; e=*(S.top); return OK;void wrong()/調(diào)用此函數(shù),表示出錯 coutWrong!=0&sn=a&sn=0&c=a&c=0&si=a&si=0&si=a&si=0&si=a&si=0&si=a&si=z)/如果是數(shù)字或字母則依次計數(shù) while(ter_judge(e) if(e=si) i-; POP(S,e); else wrong(); while(count2!=0) i+; count2-; PUSH(S,e); i+; else /如果是+-*/則直接比較 if(e=si) i+; else wrong(); else wrong(); int main() SqStack S; InitStack(S); coutLL(1)nPlease enter the expression and end with the #:expstr; LL1(S,expstr,i); coutRight! endl; getchar(); return 0;程序運行結果:(截屏)圖1.正確的算術表達式(a+b)*(c/B)的判斷圖2.錯誤的算術表達式a/b+的判斷思考問題回答:(如

溫馨提示

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

評論

0/150

提交評論