编译原理实验二_第1页
编译原理实验二_第2页
编译原理实验二_第3页
编译原理实验二_第4页
编译原理实验二_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、集美大学计算机工程学院实验报告课程名称:编译原理班级:指导教师:姓名:实验项目编号:实验二学号:实验项目名称:语法分析器的设计实验成绩:一、实验目的通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发使用程序的基本方法。二、实验内容根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。三、实验

2、要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。四、实验设计方案1、设计思想、LL(1)文法的定义LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。LL(1)文法的判别需要依次计算FIRST集、FOLLOW和SELLEC集,然后判断是否为LL(1)文法,最后再进行句子分析。需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符

3、时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其和剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A,A,都要满足下面条件:SELECT(A)ASELECT(A)=、预测分析表构造LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推导。它的行对应文法的非终极符,列对应终极符,表中的值有两种:一是产生式的右部的字符串,一是null。若用M表示LL(1)分析表,则M可表示如下:M:VNXVTPUErrorM(A,t)=Aa,当tselect(Aa),否则M(A,t

4、)=Error其中P表示所有产生式的集合。、语法分析程序构造LL(1)分析中X为符号栈栈顶元素,a为输入流当前字符,E为给定测试数据的开始符号,#为句子括号即输入串的括号。分析表用一个二位数组M表示,数组元素MA,a中的下标A表示非终结符,a为终结符或句子括号#二维数组中存放的是一条关于A的产生式,表明当非终结符A向下推导时,面临输入符a时,所采用的候选产生式,当元素内容无产生式时,则表明用A的左部向下推导时出现了不该出现的符号,因此元素内容转向出错处理的信息。LL(1)分析过程主要包括以下四个动作:替换:当XVN时选相应产生式的右部去替换X。此时X出栈,逆序入栈。匹配:当XVT时它和a进行匹

5、配,其结果可能成功,也可能失败,如果成功则符号栈中将X退栈并将输入流指针向前移动一位,否则报错。接受:当格局为(#,空#)时报告分析成功。报错:出错后,停止分析。并给出相应的错误提示信息。2.程序流程图:输入要分析的字符串#E进栈,当前终结符号送入a3、实验程序(1)分析栈类:publicclassstackprivatechars;privateinttop;publicstack()s=newchar200;s0=#;top=0;chargetTop()returnstop;voidpush(Stringstr)for(inti=str.length()-1;i=0;i-)s+top=st

6、r.charAt(i);voidclear()top=0;charpop()if(top!=0)top-;returnstop;publicStringtoString()Stringtmp=”;for(inti=0;i+elsestack.pop();stack.push(tmp);pri(+ctmp+-+tmp);publicStringwork(Stringts)input=ts;input=input.trim()+#;symbol=true;stack.clear();剩余输入栈剩余输入栈tempBuffer.append(rn步骤感分析栈所用产生式rn);analyse();if(

7、symbol)tempBuffer.append(r是正确的符号串r);returntempBuffer.toString();elsetempBuffer.append(r不是正确的符号串rreturntempBuffer.toString();/getsandsets/publicStringBuffergetTempBuffer()returntempBuffer;publicvoidsetTempBuffer(StringBuffertempBuffer)this.tempBuffer=tempBuffer;publicstackgetStack()returnstack;public

8、voidsetStack(stackstack)this.stack=stack;publicStringgetTab()returntab;publicvoidsetTab(Stringtab)this.tab=tab;publicStringgetInput()returninput;publicvoidsetInput(Stringns)this.input=ns;publicintgetPtr()returnptr;publicvoidsetPtr(intptr)this.ptr=ptr;publicintgetRow()returnrow;publicvoidsetRow(intro

9、w)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;importj

10、ava.awt.Panel;importjavax.swing.JFrame;importjavax.swing.JScrollPane;publicclassguiextendsjavax.swing.JFrame/*Createsnewformgui*/TOCo1-5hzprivatejavax.swing.JButtonjButton1;privatejavax.swing.JLabeljLabell;privatejavax.swing.JLabeljLabel2;privatejavax.swing.JTextAreajTextAreal;privatejavax.swing.JTe

11、xtFieldjTextFieldl;privatePanelpl=newPanel();privatePanelp2=newPanel();publicgui()initComponents();privatevoidinitComponents()jLabell=newjavax.swing.JLabel();jTextFieldl=newjavax.swing.JTextField();jLabel2=newjavax.swing.JLabel();jTextAreal=newjavax.swing.JTextArea(20,30);jButton1=newjavax.swing.JBu

12、tton();E);jLabell.setText(本程序只能对由+,-,*,7,(,),i构成的以#结尾的字符串进行分析。请输入要翻译的表达式:“);jLabel2.setText(分析结果:);jButton1.setText(分析);jButton1.addActionListener(newjava.awt.event.ActionListener()publicvoidactionPerformed(java.awt.event.ActionEventevt)jButton1ActionPerformed(evt););finalGridLayoutgridLayout=newGri

13、dLayout(0,1);/创建表格布局管理器管理器gridLayout.setVgap(O);gridLayout.setHgap(O);p1.setLayout(gridLayout);p1.add(jLabel1);p1.add(p2.add(jTextField1);jLabel2);newJScrollPane(p2.add(getContentPane().add(getContentPane().add(getContentPane().add(setSize(600,500);jTextArea1);p1,BorderLayout.p2,BorderLayout.jButton

14、1/设置组件之间垂直距离/设置组件之间平行距离,BorderLayout.NORTH);CENTER);SOUTH);EXIT_ON_CLOSE);EXIT_ON_CLOSE);setLocation(400,100);setVisible(true);setDefaultCloseOperation(JFrame.evt)anlysisans=jTextArea1anlysisans=jTextArea1newanlysis();.setText(ans.work(jTextField1.getText();publicstaticvoidmain(Stringargs)java.awt.EventQueue.publicvoidrun()newgui().setVisible(java.awt.Ev

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论