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

下載本文檔

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

文檔簡(jiǎn)介

編譯原理語(yǔ)法分析器的設(shè)計(jì)根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。構(gòu)造預(yù)測(cè)分析表,并利用分析表和一個(gè)棧來(lái)實(shí)現(xiàn)對(duì)上述程序設(shè)計(jì)語(yǔ)言的分析程序。分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號(hào)以及LL(1)分析表,對(duì)輸入符號(hào)串自上而下的分析過(guò)程。實(shí)驗(yàn)設(shè)計(jì)方案1、設(shè)計(jì)思想(1)、LL(1)文法的定義LL(1)分析法屬于確定的自頂向下分析方法。LL(1)的含義是:第一個(gè)L表明自頂向下分析是從左向右掃描輸入串,第2個(gè)L表明分析過(guò)程中將使用最左推導(dǎo),1表明只需向右看一個(gè)符號(hào)便可決定如何推導(dǎo),即選擇哪個(gè)產(chǎn)生式(規(guī)則)進(jìn)行推導(dǎo)。LL(1)文法的判別需要依次計(jì)算FIRST集、FOLLOW集和SELLECT集,然后判斷是否為L(zhǎng)L(1)文法,最后再進(jìn)行句子分析。需要預(yù)測(cè)分析器對(duì)所給句型進(jìn)行識(shí)別。即在LL(1)分析法中,每當(dāng)在符號(hào)棧的棧頂出現(xiàn)非終極符時(shí),要預(yù)測(cè)用哪個(gè)產(chǎn)生式的右部去替換該非終極符;當(dāng)出現(xiàn)終結(jié)符時(shí),判斷其與剩余輸入串的第一個(gè)字符是否匹配,如果匹配,則繼續(xù)分析,否則報(bào)錯(cuò)。LL(1)分析方法要求文法滿足如下條件:對(duì)于任一非終極符A的兩個(gè)不同產(chǎn)生式A,A,都要滿足下面條件:SELECT(A)∩SELECT(A)=(2)、預(yù)測(cè)分析表構(gòu)造LL(1)分析表的作用是對(duì)當(dāng)前非終極符和輸入符號(hào)確定應(yīng)該選擇用哪個(gè)產(chǎn)生式進(jìn)行推導(dǎo)。它的行對(duì)應(yīng)文法的非終極符,列對(duì)應(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)生式的集合。、語(yǔ)法分析程序構(gòu)造LL(1)分析中X為符號(hào)棧棧頂元素,a為輸入流當(dāng)前字符,E為給定測(cè)試數(shù)據(jù)的開(kāi)始符號(hào),#為句子括號(hào)即輸入串的括號(hào)。分析表用一個(gè)二位數(shù)組M表示,數(shù)組元素M[A,a]中的下標(biāo)A表示非終結(jié)符,a為終結(jié)符或句子括號(hào)‘#’,二維數(shù)組中存放的是一條關(guān)于A的產(chǎn)生式,表明當(dāng)非終結(jié)符A向下推導(dǎo)時(shí),面臨輸入符a時(shí),所采用的候選產(chǎn)生式,當(dāng)元素內(nèi)容無(wú)產(chǎn)生式時(shí),則表明用A的左部向下推導(dǎo)時(shí)出現(xiàn)了不該出現(xiàn)的符號(hào),因此元素內(nèi)容轉(zhuǎn)向出錯(cuò)處理的信息。LL(1)分析過(guò)程主要包括以下四個(gè)動(dòng)作:替換:當(dāng)XVN時(shí)選相應(yīng)產(chǎn)生式的右部去替換X。此時(shí)X出棧,逆序入棧。匹配:當(dāng)XVT時(shí)它與a進(jìn)行匹配,其結(jié)果可能成功,也可能失敗,如果成功則符號(hào)棧中將X退棧并將輸入流指針向前移動(dòng)一位,否則報(bào)錯(cuò)。接受:當(dāng)格局為(#,空#)時(shí)報(bào)告分析成功。報(bào)錯(cuò):出錯(cuò)后,停止分析。并給出相應(yīng)的錯(cuò)誤提示信息。2.程序流程圖:3、實(shí)驗(yàn)程序(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)語(yǔ)法分析器類: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ù)測(cè)表中的行,列,當(dāng)前步驟privatebooleansymbol;privatestackstack;publicanlysis(){ stack=newstack(); tempBuffer=newStringBuffer(); symbol=true; input=""; row=1; ptr=0; step=1;}//////////////////////////////////methods./////////////////////////////////publicintcolumn(charc){//判斷預(yù)測(cè)表中的列 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ù)測(cè)表中的行 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ù)測(cè)表中的第一個(gè)元素‘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("出錯(cuò)"); stack.pop(); if(input.charAt(ptr)!='#'){ ptr++; } continue; } tmp=tab[row][col]; if(tmp.charAt(0)=='$'){ symbol=false; pri("出錯(cuò)"); 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是正確的符號(hào)串\r"); returntempBuffer.toString(); }else{ tempBuffer.append("\r不是正確的符號(hào)串\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("本程序只能對(duì)由'+','-','*','/','(',')','i'構(gòu)成的以'#'結(jié)尾的字符串進(jìn)行分析。請(qǐng)輸入要翻譯的表達(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); } }); }}五、實(shí)驗(yàn)結(jié)果實(shí)驗(yàn)結(jié)果分析:

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

七、實(shí)驗(yàn)總結(jié):

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論