LR分析表語法分析報告_第1頁
LR分析表語法分析報告_第2頁
LR分析表語法分析報告_第3頁
LR分析表語法分析報告_第4頁
LR分析表語法分析報告_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

學(xué)生實驗報告

試驗項目名稱:LR(1)分析表語法分析試驗課時:6同組學(xué)生姓名:無試驗地點:B513試驗日期:.4.7/4.21試驗成績:批改教師:批改時間:一、試驗?zāi)康暮鸵?guī)定語法分析重要目的是按照程序語言的語法規(guī)則,從由詞法分析輸出的源程序符號串中識別出各類語法成分,同步進行語法檢查,為語義分析和代碼生成作準(zhǔn)備.語法分析程序在分析過程中檢查符號串與否為該程序的句子.若是則輸出該句子的分析樹,否則就表達(dá)源程序存在語法錯誤,并匯報錯誤的性質(zhì)與位置.二、試驗儀器和設(shè)備主機一臺:有VisualStudio工具三、試驗過程闡明:此程序共有兩個類,Lexical進行詞法分析,Syntax進行語法分析.對于語法分析,采用LR(1)分析法,判斷程序與否滿足規(guī)定的構(gòu)造.1:LR-table.txt:寄存分析表,其中正數(shù)表達(dá)移進,負(fù)數(shù)表達(dá)歸約,100表達(dá)接受狀態(tài),0表達(dá)不操作。2:grammar.txt寄存文法開始符號3:lengh.txt寄存產(chǎn)生式右部字符長度4:inpur.txt輸入的程序語法規(guī)則:定義的文法,如下:Z---EE---E+TE---->TT---T*FT---FF---{E}F---i根據(jù)上面文法畫出的分層有限自動機并根據(jù)分層自動機構(gòu)造的LR(1)分析表:+*()I#ETF0S4S51231S6Acc2R2S7R2R23R4R4R4R44S4S58235R6R6R6R66S4S5937S4S5108S6S119R1S7R1R110R3R3R3R311R5R5R5R5語法分析的關(guān)鍵代碼和注釋如下:usingSystem;usingSystem.Text;usingSystem.IO;namespaceSyntax_Analyzer{ classSyntax { StreamReadermyStreamReader; intt; int[]lengh; intl=0; string[]grammar; ints=0; string[]Word; intw=0; int[]wordNum; intn=0; int[,]LR; publicSyntax() { lengh=newint[7]; grammar=newstring[7]; Word=newstring[100]; wordNum=newint[100]; LR=newint[30,30]; } publicvoidanalyzer() { //讀入grammar SyntaxmyTextRead=newSyntax(); Console.WriteLine("-----------------------------語法分析開始---------------------------------\n"); //*************************** //循環(huán)讀取文法 //*************************** stringstrStart; strStart="grammar.txt"; myTextRead.myStreamReader=newStreamReader(strStart); stringstrBufferStart; intuu=0; do { strBufferStart=myTextRead.myStreamReader.ReadLine(); if(strBufferStart==null) break; foreach(StringsubStringinstrBufferStart.Split()) { grammar[uu]=subString;//每行文法存入grammar[] uu++; } } while(strBufferStart!=null); myTextRead.myStreamReader.Close(); //*************************** //循環(huán)讀取lengh //*************************** strStart="lengh.txt"; myTextRead.myStreamReader=newStreamReader(strStart); uu=0; do { strBufferStart=myTextRead.myStreamReader.ReadLine(); if(strBufferStart==null) break; foreach(StringsubStringinstrBufferStart.Split()) { lengh[uu]=Convert.ToInt32(subString);//每行文法存入grammar[] uu++; } }while(strBufferStart!=null); myTextRead.myStreamReader.Close(); //**************************** //讀入文獻(xiàn),進行語法分析 // //**************************** stringstrReadFile; strReadFile="input.txt"; myTextRead.myStreamReader=newStreamReader(strReadFile); stringstrBufferText; intwid=0; Console.WriteLine("分析讀入程序(記號ID):\n"); do { strBufferText=myTextRead.myStreamReader.ReadLine(); if(strBufferText==null) break; foreach(StringsubStringinstrBufferText.Split()) { if(subString!="") { intll; if(subString!=null) { ll=subString.Length;//每一種長度 } else { break; } inta=ll+1; char[]b=newchar[a]; StringReadersr=newStringReader(subString); sr.Read(b,0,ll);//把substring讀到char[]數(shù)組里 intsort=(int)b[0]; //word[i]和wordNum[i]對應(yīng) //先識別出一整個串,再根據(jù)開頭識別是數(shù)字還是字母 Word[wid]=subString; if(subString.Equals("+")) {wordNum[wid]=0;} else { if(subString.Equals("*")) {wordNum[wid]=1;} else { if(subString.Equals("(")) {wordNum[wid]=2;} else { if(subString.Equals(")")) {wordNum[wid]=3;} else { if(subString.Equals("i")) {wordNum[wid]=4;} } } } } Console.Write(subString+"("+wordNum[wid]+")"+""); wid++; } } Console.WriteLine("\n"); }while(strBufferText!=null); wordNum[wid]=5; myTextRead.myStreamReader.Close(); //********************************* //讀入LR分析表 // //*********************************** stringstrLR; strLR="LR-table.txt"; myTextRead.myStreamReader=newStreamReader(strLR); stringstrBufferLR; intpp=0; do { strBufferLR=myTextRead.myStreamReader.ReadLine(); if(strBufferLR==null) break; else { intj=0; foreach(StringsubStringinstrBufferLR.Split()) { if(subString!=null) { intlllr=Convert.ToInt16(subString); LR[pp,j]=lllr;//把行與列讀入數(shù)組 j++; } } } pp++; } while(strBufferLR!=null); myTextRead.myStreamReader.Close(); int[]state=newint[100]; string[]symbol=newstring[100]; state[0]=0; symbol[0]="#"; intp1=0; intp2=0; Console.WriteLine("\n按文法規(guī)則歸約次序如下:\n"); //*************** //歸約算法 //*************** while(true) { intj,k; j=state[p2]; k=wordNum[p1]; t=LR[j,k];//當(dāng)出現(xiàn)t為的時候 if(t==0) { //錯誤類型stringerror="";if(k==0)error="+";elseif(k==1)error="*";elseif(k==2)error="(";elseif(k==3)error=")";elseif(k==4)error="i";elseerror="其他錯誤!"; Console.WriteLine("\n檢測成果:"); Console.WriteLine("代碼中存在語法錯誤"); Console.WriteLine("錯誤狀況:錯誤狀態(tài)編號為"+j+"讀頭下符號為"+error); break; } else { if(t==-100)//-100為到達(dá)接受狀態(tài) { Console.WriteLine("\n"); Console.WriteLine("\n檢測成果:"); Console.WriteLine("代碼通過語法檢測"); break; } if(t<0&&t!=-100)//歸約 { stringm=grammar[-t]; Console.Write(m+"");//輸出開始符 intlength=lengh[-t]; p2=p2-(length-1); SearchmySearch=newSearch(); intright=mySearch.search(m); if(right==0) { Console.WriteLine("\n"); Console.WriteLine("代碼中有語法錯誤"); break; } inta=state[p2-1]; intLRresult=LR[a,right]; state[p2]=LRresult; symbol[p2]=m; } if(t>0) { p2=p2+1; state[

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論