語法分析器的設(shè)計_第1頁
語法分析器的設(shè)計_第2頁
語法分析器的設(shè)計_第3頁
語法分析器的設(shè)計_第4頁
語法分析器的設(shè)計_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

編譯原理語法分析器的設(shè)計根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對任意輸入的符號串進(jìn)行分析。構(gòu)造預(yù)測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設(shè)計語言的分析程序。分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。實驗設(shè)計方案1、設(shè)計思想(1)、LL(1)文法的定義LL(1)分析法屬于確定的自頂向下分析方法。LL(1)的含義是:第一個L表明自頂向下分析是從左向右掃描輸入串,第2個L表明分析過程中將使用最左推導(dǎo),1表明只需向右看一個符號便可決定如何推導(dǎo),即選擇哪個產(chǎn)生式(規(guī)則)進(jìn)行推導(dǎo)。LL(1)文法的判別需要依次計算FIRST集、FOLLOW集和SELLECT集,然后判斷是否為LL(1)文法,最后再進(jìn)行句子分析。需要預(yù)測分析器對所給句型進(jìn)行識別。即在LL(1)分析法中,每當(dāng)在符號棧的棧頂出現(xiàn)非終極符時,要預(yù)測用哪個產(chǎn)生式的右部去替換該非終極符;當(dāng)出現(xiàn)終結(jié)符時,判斷其與剩余輸入串的第一個字符是否匹配,如果匹配,則繼續(xù)分析,否則報錯。LL(1)分析方法要求文法滿足如下條件:對于任一非終極符A的兩個不同產(chǎn)生式A,A,都要滿足下面條件:SELECT(A)∩SELECT(A)=(2)、預(yù)測分析表構(gòu)造LL(1)分析表的作用是對當(dāng)前非終極符和輸入符號確定應(yīng)該選擇用哪個產(chǎn)生式進(jìn)行推導(dǎo)。它的行對應(yīng)文法的非終極符,列對應(yīng)終極符,表中的值有兩種:一是產(chǎn)生式的右部的字符串,一是null。若用M表示LL(1)分析表,則M可表示如下: M:VN×VTP∪{Error} M(A,t)=Aα,當(dāng)tselect(Aα),否則 M(A,t)=Error其中P表示所有產(chǎn)生式的集合。、語法分析程序構(gòu)造LL(1)分析中X為符號棧棧頂元素,a為輸入流當(dāng)前字符,E為給定測試數(shù)據(jù)的開始符號,#為句子括號即輸入串的括號。分析表用一個二位數(shù)組M表示,數(shù)組元素M[A,a]中的下標(biāo)A表示非終結(jié)符,a為終結(jié)符或句子括號‘#’,二維數(shù)組中存放的是一條關(guān)于A的產(chǎn)生式,表明當(dāng)非終結(jié)符A向下推導(dǎo)時,面臨輸入符a時,所采用的候選產(chǎn)生式,當(dāng)元素內(nèi)容無產(chǎn)生式時,則表明用A的左部向下推導(dǎo)時出現(xiàn)了不該出現(xiàn)的符號,因此元素內(nèi)容轉(zhuǎn)向出錯處理的信息。LL(1)分析過程主要包括以下四個動作:替換:當(dāng)XVN時選相應(yīng)產(chǎn)生式的右部去替換X。此時X出棧,逆序入棧。匹配:當(dāng)XVT時它與a進(jìn)行匹配,其結(jié)果可能成功,也可能失敗,如果成功則符號棧中將X退棧并將輸入流指針向前移動一位,否則報錯。接受:當(dāng)格局為(#,空#)時報告分析成功。報錯:出錯后,停止分析。并給出相應(yīng)的錯誤提示信息。2.程序流程圖:3、實驗程序(1)分析棧類:publicclassstack{ privatechars[]; privateinttop; publicstack(){ s=newchar[200]; s[0]='#'; top=0; } chargetTop(){ returns[top]; } voidpush(Stringstr){ for(inti=str.length()-1;i>=0;i--){ s[++top]=str.charAt(i); } } voidclear(){ top=0; } charpop(){ if(top!=0){ top--; } returns[top]; } publicStringtoString(){ Stringtmp=""; for(inti=0;i<=top;i++){ tmp+=s[i]; } returntmp; }} (2)語法分析器類:publicclassanlysis{ //分析表 privateStringtab[][]={{"$","+","-","*","/","(",")","i","#"}, {"E","$","$","$","$","TG","$","TG","$"}, {"G","+TG","-TG","$","$","$","ε","$","ε"}, {"T","$","$","$","$","FS","$","FS","$"}, {"S","ε","ε","*FS","/FS","$","ε","$","ε"}, {"F","$","$","$","$","(E)","$","i","$"}};privateStringinput;//input中存放輸入的表達(dá)式privateStringBuffertempBuffer;//存放要輸出的字符串privateintptr,row,col,step;//指針,預(yù)測表中的行,列,當(dāng)前步驟privatebooleansymbol;privatestackstack;publicanlysis(){ stack=newstack(); tempBuffer=newStringBuffer(); symbol=true; input=""; row=1; ptr=0; step=1;}//////////////////////////////////methods./////////////////////////////////publicintcolumn(charc){//判斷預(yù)測表中的列 switch(c){ case'+': return1; case'-': return2; case'*': return3; case'/': return4; case'(': return5; case')': return6; case'i': return7; case'#': return8; default: return-1; }}publicintline(charc){//判定預(yù)測表中的行 switch(c){ case'E': return1; case'G': return2; case'T': return3; case'S': return4; case'F': return5; default: return-1; }}publicvoidpri(Stringstr){ tempBuffer.append(String.format("%-8d%-20s%-20s%-20s\r\n",step,stack .toString(),input.substring(ptr),str)); step++;}publicvoidanalyse(){ stack.push(tab[row][0]);//預(yù)測表中的第一個元素‘E’ pri("初始化"); Stringtmp; charctmp;//棧頂元素 while(!(input.charAt(ptr)=='#'&&stack.getTop()=='#')){ ctmp=stack.getTop(); if(input.charAt(ptr)==ctmp){//與棧頂元素比較 stack.pop(); ptr++; pri(""+ctmp+"匹配"); continue; } col=column(input.charAt(ptr)); if(col==-1){ symbol=false; pri("未定義的字符"); ptr++; continue; } row=line(ctmp); if(row==-1){ symbol=false; pri("出錯"); stack.pop(); if(input.charAt(ptr)!='#'){ ptr++; } continue; } tmp=tab[row][col]; if(tmp.charAt(0)=='$'){ symbol=false; pri("出錯"); stack.pop(); if(input.charAt(ptr)!='#'){ ptr++; } }elseif(tmp.charAt(0)=='ε'){ stack.pop(); pri(""+ctmp+"->"+'ε'); }else{ stack.pop(); stack.push(tmp); pri(""+ctmp+"->"+tmp); } }}publicStringwork(Stringts){ input=ts; input=input.trim()+'#'; symbol=true; stack.clear(); tempBuffer.append("\r\n步驟分析棧剩余輸入棧所用產(chǎn)生式\r\n"); analyse(); if(symbol){ tempBuffer.append("\r是正確的符號串\r"); returntempBuffer.toString(); }else{ tempBuffer.append("\r不是正確的符號串\r"); returntempBuffer.toString(); } }////////////////////////////////////getsandsets////////////////////////////////publicStringBuffergetTempBuffer(){ returntempBuffer;}publicvoidsetTempBuffer(StringBuffertempBuffer){ this.tempBuffer=tempBuffer;}publicstackgetStack(){ returnstack;}publicvoidsetStack(stackstack){ this.stack=stack;}publicString[][]getTab(){ returntab;}publicvoidsetTab(String[][]tab){ this.tab=tab;}publicStringgetInput(){ returninput;}publicvoidsetInput(Stringns){ this.input=ns;}publicintgetPtr(){ returnptr;}publicvoidsetPtr(intptr){ this.ptr=ptr;}publicintgetRow(){ returnrow;}publicvoidsetRow(introw){ this.row=row;}publicintgetCol(){ returncol;}publicvoidsetCol(intcol){ this.col=col;}publicintgetStep(){ returnstep;}publicvoidsetStep(intstep){ this.step=step;}publicbooleanisBoo(){ returnsymbol;}publicvoidsetBoo(booleanboo){ this.symbol=boo;}} (3)WINDOW窗體類:importjava.awt.BorderLayout;importjava.awt.GridLayout;importjava.awt.Panel;importjavax.swing.JFrame;importjavax.swing.JScrollPane;publicclassguiextendsjavax.swing.JFrame{ /**Createsnewformgui*/ privatejavax.swing.JButtonjButton1; privatejavax.swing.JLabeljLabel1; privatejavax.swing.JLabeljLabel2; privatejavax.swing.JTextAreajTextArea1; privatejavax.swing.JTextFieldjTextField1; privatePanelp1=newPanel(); privatePanelp2=newPanel(); publicgui(){ initComponents(); } privatevoidinitComponents(){ jLabel1=newjavax.swing.JLabel(); jTextField1=newjavax.swing.JTextField(); jLabel2=newjavax.swing.JLabel(); jTextArea1=newjavax.swing.JTextArea(20,30); jButton1=newjavax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("本程序只能對由'+','-','*','/','(',')','i'構(gòu)成的以'#'結(jié)尾的字符串進(jìn)行分析。請輸入要翻譯的表達(dá)式:"); jLabel2.setText("分析結(jié)果:"); jButton1.setText("分析"); jButton1.addActionListener(newjava.awt.event.ActionListener(){ publicvoidactionPerformed(java.awt.event.ActionEventevt){ jButton1ActionPerformed(evt); } }); finalGridLayoutgridLayout=newGridLayout(0,1);//創(chuàng)建表格布局管理器 gridLayout.setVgap(0); //設(shè)置組件之間垂直距離 gridLayout.setHgap(0); //設(shè)置組件之間平行距離 p1.setLayout(gridLayout); p1.add(jLabel1); p1.add(jTextField1); p2.add(jLabel2); p2.add(newJScrollPane(jTextArea1)); getContentPane().add(p1,BorderLayout.NORTH); getContentPane().add(p2,BorderLayout.CENTER); getContentPane().add(jButton1,BorderLayout.SOUTH); setSize(600,500); setLocation(400,100); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){ anlysisans=newanlysis(); jTextArea1.setText(ans.work(jTextField1.getText())); } publicstaticvoidmain(Stringargs[]){ java.awt.EventQueue.invokeLater(newRunnable(){ publicvoidrun(){ newgui().setVisible(true); } }); }}五、實驗結(jié)果實驗結(jié)果分析:

本次設(shè)計借助語法分析,設(shè)計一個表達(dá)式的判斷分析器,從鍵盤上輸入算術(shù)表達(dá)式,分析器對該表達(dá)式的正確與否進(jìn)行分析。若是正確的算術(shù)表達(dá)式,則符合文法,輸出正確;若是錯誤的算術(shù)表達(dá)式,則表達(dá)式不符合文法,輸出其錯誤之處并顯示異常。該程序執(zhí)行過程無誤,輸出結(jié)果正常。但由于我們的疏忽,該程序未能完全滿足實驗要求,并不能夠構(gòu)造其LR分析表,并不是由該分析表驅(qū)動的語法分析器程序,這是本次實驗的一個缺陷。

七、實驗總結(jié):

此次實驗,讓我對編譯原理的基本知識有了深入的了解,加強(qiáng)了對語法分析的認(rèn)識。代碼的編寫過程中用到了一些以前從未用過的函數(shù),都是現(xiàn)學(xué)現(xiàn)用,掌握還不是很深。在代碼調(diào)試過程中結(jié)果出現(xiàn)許多無法解釋的錯誤,但仍舊堅持下來了,最終調(diào)試出了結(jié)果。通過這次實驗,我們的動手實踐能力得到很大的提高?;贑8051F單片機(jī)直流電動機(jī)反饋控制系統(tǒng)的設(shè)計與研究基于單片機(jī)的嵌入式Web服務(wù)器的研究MOTOROLA單片機(jī)MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機(jī)溫度控制系統(tǒng)的研制基于MCS-51系列單片機(jī)的通用控制模塊的研究基于單片機(jī)實現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機(jī)控制的二級倒立擺系統(tǒng)的研究基于增強(qiáng)型51系列單片機(jī)的TCP/IP協(xié)議棧的實現(xiàn)基于單片機(jī)的蓄電池自動監(jiān)測系統(tǒng)基于32位嵌入式單片機(jī)系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機(jī)的作物營養(yǎng)診斷專家系統(tǒng)的研究基于單片機(jī)的交流伺服電機(jī)運(yùn)動控制系統(tǒng)研究與開發(fā)基于單片機(jī)的泵管內(nèi)壁硬度測試儀的研制基于單片機(jī)的自動找平控制系統(tǒng)研究基于C8051F040單片機(jī)的嵌入式系統(tǒng)開發(fā)基于單片機(jī)的液壓動力系統(tǒng)狀態(tài)監(jiān)測儀開發(fā)模糊Smith智能控制方法的研究及其單片機(jī)實現(xiàn)一種基于單片機(jī)的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機(jī)沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機(jī)的在線間歇式濁度儀的研制基于單片機(jī)的噴油泵試驗臺控制器的研制基于單片機(jī)的軟起動器的研究和設(shè)計基于單片機(jī)控制的高速快走絲電火花線切割機(jī)床短循環(huán)走絲方式研究基于單片機(jī)的機(jī)電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機(jī)的智能手機(jī)充電器基于單片機(jī)的實時內(nèi)核設(shè)計及其應(yīng)用研究基于單片機(jī)的遠(yuǎn)程抄表系統(tǒng)的設(shè)計與研究基于單片機(jī)的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機(jī)系統(tǒng)單片機(jī)系統(tǒng)軟件構(gòu)件開發(fā)的技術(shù)研究基于單片機(jī)的液體點(diǎn)滴速度自動檢測儀的研制基于單片機(jī)系統(tǒng)的多功能溫度測量儀的研制基于PIC單片機(jī)的電能采集終端的設(shè)計和應(yīng)用基于單片機(jī)的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機(jī)單片機(jī)控制系統(tǒng)的研制基于單片機(jī)的數(shù)字磁通門傳感器基于單片機(jī)的旋轉(zhuǎn)變壓器-數(shù)字轉(zhuǎn)換器的研究基于單片機(jī)的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機(jī)控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機(jī)的多生理信號檢測儀基于單片機(jī)的電機(jī)運(yùn)動控制系統(tǒng)設(shè)計Pico專用單片機(jī)核的可測性設(shè)計研究基于MCS-51單片機(jī)的熱量計基于雙單片機(jī)的智能遙測微型氣象站MCS-51單片機(jī)構(gòu)建機(jī)器人的實踐研究基于單片機(jī)的輪軌力檢測基于單片機(jī)的GPS定位儀的研究與實現(xiàn)基于單片機(jī)的電液伺服控制系統(tǒng)用于單片機(jī)系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機(jī)的時控和計數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機(jī)和CPLD的粗光柵位移測量系統(tǒng)研究單片機(jī)控制的后備式方波UPS提升高職學(xué)生單片機(jī)應(yīng)用能力的探究基于單片機(jī)控制的自動低頻減載裝置研究基于單片機(jī)控制的水下焊接電源的研究基于單片機(jī)的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機(jī)的氚表面污染測量儀的研制基于單片機(jī)的紅外測油儀的研究96系列單片機(jī)仿真器研究與設(shè)計基于單片機(jī)的單晶金剛石刀具刃磨設(shè)備的數(shù)控改造基于單片機(jī)的溫度智能控制系統(tǒng)的設(shè)計與實現(xiàn)基于MSP430單片機(jī)的電梯門機(jī)控制器的研制基于單片機(jī)的氣體測漏儀的研究基于三菱M16C/6N系列單片機(jī)的CAN/USB協(xié)議轉(zhuǎn)換器基于單片機(jī)和DSP的變壓器油色譜在線監(jiān)測技術(shù)研究基于單片機(jī)的膛壁溫度報警系統(tǒng)設(shè)計基于AVR單片機(jī)的低壓無功補(bǔ)償控制器的設(shè)計基于單片機(jī)船舶電力推進(jìn)電機(jī)監(jiān)測系統(tǒng)基于單片機(jī)網(wǎng)絡(luò)的振動信號的采集系統(tǒng)基于單片機(jī)的大容量數(shù)據(jù)存儲技術(shù)的應(yīng)用研究基于單片機(jī)的疊圖機(jī)研究與教學(xué)方法實踐基于單片機(jī)嵌入式Web服務(wù)器技術(shù)的研究及實現(xiàn)基于AT89S52單片機(jī)的通用數(shù)據(jù)采集系統(tǒng)基于單片機(jī)的多道脈沖幅度分析儀研究機(jī)器人旋轉(zhuǎn)電弧傳感角焊縫跟蹤單片機(jī)控制系統(tǒng)基于單片機(jī)的控制系統(tǒng)在PLC虛擬教學(xué)實驗中的應(yīng)用研究基于單片機(jī)系統(tǒng)的網(wǎng)絡(luò)通信研究與應(yīng)用基于PIC16F877單片機(jī)的莫爾斯碼自動譯碼系統(tǒng)設(shè)計與研究基于單片機(jī)的模糊控制器在工業(yè)電阻爐上的應(yīng)用研究基于雙單片機(jī)沖床數(shù)控系統(tǒng)的研究與開發(fā)基于Cygnal單片機(jī)的μC/OS-Ⅱ的研究基于單片機(jī)的一體化智能差示掃描量熱儀系統(tǒng)研究基于TCP/IP協(xié)議的單片機(jī)與Internet互聯(lián)的研究與實現(xiàn)變頻調(diào)速液壓電梯單片機(jī)控制器的研究基于單片機(jī)γ-免疫計數(shù)器自動換樣功能的研究與實現(xiàn)基于單片機(jī)的倒立擺控制系統(tǒng)設(shè)計與實現(xiàn)單片機(jī)嵌入式以太網(wǎng)防盜報警系統(tǒng)基于51單片機(jī)的嵌入式Internet系統(tǒng)的設(shè)計與實現(xiàn)單片機(jī)監(jiān)測系統(tǒng)在擠壓機(jī)上的應(yīng)用MSP430單片機(jī)在智能水表系統(tǒng)上的研究與應(yīng)用基于單片機(jī)的嵌入式系統(tǒng)中TCP/IP協(xié)議棧的實現(xiàn)與應(yīng)用單片機(jī)在高樓恒壓供水系統(tǒng)中的應(yīng)用基于ATmega16單片機(jī)的流量控制器的開發(fā)基于MSP430單片機(jī)的遠(yuǎn)程抄表系統(tǒng)及智能網(wǎng)絡(luò)水表的設(shè)計基于MSP430

溫馨提示

  • 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

提交評論