版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理语法分析器的设计根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。实验设计方案1、设计思想(1)、LL(1)文法的定义LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A,A,都要满足下面条件:SELECT(A)∩SELECT(A)=(2)、预测分析表构造LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推导。它的行对应文法的非终极符,列对应终极符,表中的值有两种:一是产生式的右部的字符串,一是null。若用M表示LL(1)分析表,则M可表示如下: M:VN×VTP∪{Error} M(A,t)=Aα,当tselect(Aα),否则 M(A,t)=Error其中P表示所有产生式的集合。、语法分析程序构造LL(1)分析中X为符号栈栈顶元素,a为输入流当前字符,E为给定测试数据的开始符号,#为句子括号即输入串的括号。分析表用一个二位数组M表示,数组元素M[A,a]中的下标A表示非终结符,a为终结符或句子括号‘#’,二维数组中存放的是一条关于A的产生式,表明当非终结符A向下推导时,面临输入符a时,所采用的候选产生式,当元素内容无产生式时,则表明用A的左部向下推导时出现了不该出现的符号,因此元素内容转向出错处理的信息。LL(1)分析过程主要包括以下四个动作:替换:当XVN时选相应产生式的右部去替换X。此时X出栈,逆序入栈。匹配:当XVT时它与a进行匹配,其结果可能成功,也可能失败,如果成功则符号栈中将X退栈并将输入流指针向前移动一位,否则报错。接受:当格局为(#,空#)时报告分析成功。报错:出错后,停止分析。并给出相应的错误提示信息。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中存放输入的表达式privateStringBuffertempBuffer;//存放要输出的字符串privateintptr,row,col,step;//指针,预测表中的行,列,当前步骤privatebooleansymbol;privatestackstack;publicanlysis(){ stack=newstack(); tempBuffer=newStringBuffer(); symbol=true; input=""; row=1; ptr=0; step=1;}//////////////////////////////////methods./////////////////////////////////publicintcolumn(charc){//判断预测表中的列 switch(c){ case'+': return1; case'-': return2; case'*': return3; case'/': return4; case'(': return5; case')': return6; case'i': return7; case'#': return8; default: return-1; }}publicintline(charc){//判定预测表中的行 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]);//预测表中的第一个元素‘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步骤分析栈剩余输入栈所用产生式\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'构成的以'#'结尾的字符串进行分析。请输入要翻译的表达式:"); jLabel2.setText("分析结果:"); jButton1.setText("分析"); jButton1.addActionListener(newjava.awt.event.ActionListener(){ publicvoidactionPerformed(java.awt.event.ActionEventevt){ jButton1ActionPerformed(evt); } }); finalGridLayoutgridLayout=newGridLayout(0,1);//创建表格布局管理器 gridLayout.setVgap(0); //设置组件之间垂直距离 gridLayout.setHgap(0); //设置组件之间平行距离 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); } }); }}五、实验结果实验结果分析:
本次设计借助语法分析,设计一个表达式的判断分析器,从键盘上输入算术表达式,分析器对该表达式的正确与否进行分析。若是正确的算术表达式,则符合文法,输出正确;若是错误的算术表达式,则表达式不符合文法,输出其错误之处并显示异常。该程序执行过程无误,输出结果正常。但由于我们的疏忽,该程序未能完全满足实验要求,并不能够构造其LR分析表,并不是由该分析表驱动的语法分析器程序,这是本次实验的一个缺陷。
七、实验总结:
此次实验,让我对编译原理的基本知识有了深入的了解,加强了对语法分析的认识。代码的编写过程中用到了一些以前从未用过的函数,都是现学现用,掌握还不是很深。在代码调试过程中结果出现许多无法解释的错误,但仍旧坚持下来了,最终调试出了结果。通过这次实验,我们的动手实践能力得到很大的提高。基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工业电阻炉上的应用研究基于双单片机冲床数控系统的研究与开发基于Cygnal单片机的μC/OS-Ⅱ的研究基于单片机的一体化智能差示扫描量热仪系统研究基于TCP/IP协议的单片机与Internet互联的研究与实现变频调速液压电梯单片机控制器的研究基于单片机γ-免疫计数器自动换样功能的研究与实现基于单片机的倒立摆控制系统设计与实现单片机嵌入式以太网防盗报警系统基于51单片机的嵌入式Internet系统的设计与实现单片机监测系统在挤压机上的应用MSP430单片机在智能水表系统上的研究与应用基于单片机的嵌入式系统中TCP/IP协议栈的实现与应用单片机在高楼恒压供水系统中的应用基于ATmega16单片机的流量控制器的开发基于MSP430单片机的远程抄表系统及智能网络水表的设计基于MSP430
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 墙面涂料采购合同(2篇)
- 多渠道电商合作协议(2篇)
- 2024年跨国贸易货物销售条款制定及执行合同一
- 2024月饼企业战略规划与实施合同3篇
- 2024版事业单位招聘
- 2024新款:虚拟现实旅游体验服务合同
- 民工用工协议书
- 专业码头作业运输协议协议指南版B版
- 2024年花岗岩采购与销售补充协议条款版B版
- 1空气占据空间吗 说课稿-2024-2025学年三年级科学上册苏教版
- 劳工人权培训课件
- 《查对制度PDCA》课件
- 浙江省台州市2023-2024学年八年级上学期期末科学试题
- GB/T 292-2023滚动轴承角接触球轴承外形尺寸
- 小区建设项目立项报告
- 【高一语文】《乡土中国》-《差序格局》课件18张 2023-2024学年统编版高中语文必修上册
- 院感科对多重耐药菌(MRSA)分离率下降原因分析品管圈鱼骨图柏拉图
- 《公司薪酬调研分析报告》
- 个人所得税专项附加扣除及个人所得税计算培训
- 烙铁焊接作业指导书
- 年产1万吨一氯甲烷的工艺流程设计
评论
0/150
提交评论