文法存儲及輸出_第1頁
文法存儲及輸出_第2頁
文法存儲及輸出_第3頁
文法存儲及輸出_第4頁
文法存儲及輸出_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精品好資料學習推薦實驗報告學號專業(yè)計算機班級姓名課程名稱編譯原理課程類型必修課實驗名稱實驗一、文法存儲及輸出實驗目的: 1.掌握文法在計算機內(nèi)的存儲表示;2.輸入任意的上下文無關文法;3.以四元組的形式輸出Chomsky 文實驗內(nèi)容:敘述本次實驗的實現(xiàn)方法、分析、實現(xiàn)了哪些功能、給出一個或多個測試用例及其預期運行結果,要求能夠反映本次實驗的成果。1.本次實驗的實現(xiàn)方法為:采用數(shù)組的形式實現(xiàn)文法在機內(nèi)的存儲表示。2.本次試驗的問題分析為:一是文法的輸入形式;二是文法在計算機內(nèi)的存儲表示形式。3.本次試驗應實現(xiàn)以下功能:輸入一個文法的識別符號與重寫規(guī)則,輸出文法的四要素VN,VT,P,Z。4.測試

2、實例:實例:輸入文法GE:E:=E+T|TT:=T*F|FF:=(E)|i實驗代碼如下:#include char GName10; typedef char SymbolT; SymbolT StartSymbol; typedef struct SymbolT LeftSym; SymbolT Rightpart20; int RightLength; RuleTC; RuleTC GrammarC20; SymbolTVT20; SymbolT VN20; int NVN=0,NVT=0; typedef struct int LeftSymNum; int RightpartNum20

3、; int RightLength; RuleT; RuleT Grammar20; int RuleN; char StartSym; char Input 20= E:=E+T|T, T:=T*F|F, F:=(E)|i, 0 ; int LineNumofG=3; void GetGrammar() char LeftS,Sym; int k,j,m; StartSym=GrammarC1.LeftSym; for(k=1; k=RuleN; k+) LeftS=GrammarCk.LeftSym; for(j=1; j=NVN; j+) if(LeftS=VNj) Grammark.L

4、eftSymNum=j+100; break; for(j=1; j=GrammarCk.RightLength; j+) Sym=GrammarCk.Rightpartj; for(m=1; m=NVN; m+)if(Sym=VNm) Grammark.RightpartNumj=m+100;break; if(m=NVN) continue; for(m=1; m=NVT; m+) if(Sym=VTm) Grammark.RightpartNumj=m; break; Grammark.RightLength=GrammarCk.RightLength; void storeG( ) i

5、nt row,colum, k,j,m; char sym,U; RuleN=0; row=0; NVN=NVT=0; while(rowLineNumofG) colum=0; sym=Inputrowcolum; for(k=1; kNVN) VN+NVN=sym; GrammarC+RuleN.LeftSym=sym; colum=colum+4; j=0; while(Inputrowcolum!=0) sym=Inputrowcolum+; if(sym=|) GrammarCRuleN.RightLength=j;U=GrammarCRuleN.LeftSym; RuleN=Rul

6、eN+1; GrammarCRuleN.LeftSym=U; j=0; continue; j=j+1; GrammarCRuleN.Rightpartj=sym; for(k=1;kNVT)VT+NVT=sym; GrammarCRuleN.RightLength=j; row=row+1; for( m=1; m=NVT; m+) for(k=1; k=NVN; k+) if(VTm=VNk) VTm= ; break; for(m=1;m=NVT; m+) if(VTm= ) for(j=m+1; j=NVT; j+) VTj-1=VTj; NVT=NVT-1; if(VTm= ) m=

7、m-1; continue; GetGrammar( ); DispG( ) int k,j,m; printf(n 文法的識別符號 Z 為:%cn, StartSym); printf(重寫規(guī)則集 P 為:n); for(k=1; k=RuleN; k+) printf(%8c%c:=, , VNGrammark.LeftSymNum-100); for(j=1; j=Grammark.RightLength; j+) m=Grammark.RightpartNumj; if(m100) printf(%c,VTm); else printf(%c,VNm-100); printf(n);

8、printf(文法的非終結符號集為:VN= ); for(k=1; k=NVN-1; k+) printf(%c, VNk); printf(,); printf(%c n,VNNVN); printf(文法的終結符號集為:VT= ); for(k=1; k=NVT-1; k+) printf(%c, VTk); printf(,); printf(%c n,VTNVT); void main( ) char c=Y; int j; printf(n 文法重寫規(guī)則:n); for(j=0; jLineNumofG; j+) printf(%sn,Inputj); printf(重新輸入文法的重

9、寫規(guī)則?(Y/N): ); scanf(%c,&c); if(c=Y | c=y) printf(輸入行數(shù)(一個規(guī)則一行):); scanf(%d,&LineNumofG); for(j=0; jLineNumofG; j+) scanf(%s,Inputj); storeG( ); DispG( ); 實驗結果:實例一:輸入文法GE:E:=E+T|TT:=T*F|FF:=(E)|i實例二:輸入文法G2Z:Z:=aZb|ab Z:=CSd S:=CSd|Cd實例三:輸入文法G3E:E:=T|E+T|E-TT:=F|T*F|T/F F:=(E)|i實例四:輸入文法:G4Z:Z:=Ab|c A:=Aab|a b:=cbD|d d:=bDd|D實驗總結

溫馨提示

  • 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

提交評論