ImageVerifierCode 换一换
格式:DOC , 页数:28 ,大小:498.50KB ,
资源ID:6103006      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6103006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理 语法分析器 (java完美运行版).doc)为本站会员(buyk185)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

编译原理 语法分析器 (java完美运行版).doc

1、实验二 语法分析器一、实验目的通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。二、实验内容 根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析。 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 分析法的功能是利用 LL(1)控制程序根据显示栈栈顶内容、向前看符号以及 LL(1)分析表,对输入符号串自上而下的分析过程。 三、 LL( 1)分析法实验设计思想及算

2、法 模块结构:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立 LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等) ;(3)控制部分:从键盘输入一个表达式符号串;(4)利用 LL(1)分析算法进行表达式处理:根据 LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。四、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用 LL(1)分析法对任意输入的符号串进行分析: (1)E-TG(2)G-+TG|TG(3)G-(4)T-FS(5)S-

3、*FS|/FS(6)S-(7)F-(E)(8)F-i输出的格式如下:5、实验源程序LL1.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 extends JFrame implements ActionListener/* */private static final long serialVersionUI

4、D = 1L;JTextField tf1;JTextField tf2;JLabel l;JButton b0;JPanel p1,p2,p3;JTextArea t1,t2,t3;JButton b1,b2,b3;JLabel l0,l1,l2,l3,l4;JTable table;Statement sta;Connection conn;ResultSet rs;DefaultTableModel dtm;String Vn=null;Vector P=null;int firstComplete=null;/存储已判断过first 的数据char first=null;/存储最后fi

5、rst结果int followComplete=null;/存储已判断过 follow的数据char follow=null;/存储最后follow结果char select=null;/存储最后select结果int LL=0;/标记是否为LL (1 )String vt_tou=null;/储存VtObject shuju=null;/存储表达式数据char yn_null=null;/存储能否推出空LL1() setLocation(100,0);setSize(700,780);tf1=new JTextField(13);tf2=new JTextField(13);l=new JL

6、abel(“);l0=new JLabel(“输入字符串:“);l1=new JLabel(“输入的文法为: “);l2=new JLabel(“ “);l3=new JLabel(“分析的结果: “);l4=new JLabel(“预测分析表: “);/p1=new JPanel();p2=new JPanel();p3=new JPanel();t1=new JTextArea(24,20);t2=new JTextArea(1,30);t3=new JTextArea(24,40);b0=new JButton(“确定(S为开始)“);b1=new JButton(“ 判断文法 “);b

7、2=new JButton(“输入“ );b3=new JButton(“清空“ );table=new JTable();JScrollPane jp1=new JScrollPane(t1);JScrollPane jp2=new JScrollPane(t2);JScrollPane jp3=new JScrollPane(t3);p2.add(tf1);p2.add(l);p2.add(tf2);p2.add(b0);p2.add(b1);p2.add(l0);p2.add(l2);p2.add(jp2);p2.add(b2);p2.add(b3);p2.add(l1);p2.add(

8、l3);p2.add(jp1);p2.add(jp3);p3.add(l4);p3.add(new JScrollPane(table);add(p2,“Center“);add(p3,“South“);b0.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);table.setPreferredScrollableViewportSize(ne

9、w Dimension(660,200);setVisible(true);public void actionPerformed(ActionEvent e)if(e.getSource()=b0)String a=tf1.getText();String b=tf2.getText();t1.append(a+b+n); if(e.getSource()=b1)t3.setText(“);int Vnnum=0,k;Vn=new String100;P=new Vector();String s=t1.getText().split(“n“);for(int i=0;i=Ak=Vnnum)

10、VnVnnum=si.substring(0, 1);/存入Vn 数据Vnnum+;P.add(si);elset3.setText(“文法输入有误,请重新输入“);return;yn_null=new char100;first=new charVnnum100;int flag=0;String firstVn=null;firstComplete=new intVnnum;for(int i=0;Vni!=null;i+) /依次求 FIRST*flag=0;firstVn=new String20;if(flag=add_First(firsti,Vni,firstVn,flag)=-

11、1)return;firstCompletei=1;t3.append(“first集:“ +“n“); /显示FIRST*for(int i=0;Vni!=null;i+)t3.append(“first(“+Vni+“)= “);for(int j=0;firstij!=0;j+)t3.append(firstij+“ , “);t3.append(“+“n“);follow=new charVnnum100;String followVn=null;followComplete=new intVnnum;for(int i=0;Vni!=null;i+) /求FOLLOW*flag=0;

12、followVn=new String20;if(flag=tianjiaFollow(followi,Vni,followVn,flag)=-1)return;followCompletei=1;t3.append(“follow集:“+“n“ ); /显示FOLLOW*for(int i=0;Vni!=null;i+)t3.append(“follow(“+Vni+“)= “);for(int j=0;followij!=0;j+)t3.append(followij+“ , “);t3.append(“+“n“);select=new charP.size()100;for(int i=

13、0;iZ|t.charAt(j)=0;i-)zifufzifu=s.charAt(i);fzifu+;int buzhou=2;char n=new char65;/存储要显示的内容t3.append(“步骤 分析栈 剩余输入串 所用产生式或匹配“+ “n“);n0=1;n15=#;n14=S;int u=29;for(int i=fzifu-1;i=0;i-)nu=zifui;u+;while(!(fenxiffenxi-1=#char t=zifufzifu-1;char k=fenxiffenxi-1;if(t=k)/产生式匹配n49=k;n50=匹 ;n51=配 ;t3.append(

14、String.copyValueOf(n)+“n“);n=new char65;fzifu-;ffenxi-;if(buzhou=0;y-)/处理分析栈,出栈nu=fenxiy;u+;u=29;for(int y=fzifu-1;y=0;y-)/处理剩余字符串,消除一个字符nu=zifuy;u+;buzhou+;continue;for(i=0;Vni!=null;i+)/搜寻所用产生式的左部if(Vni.equals(String.valueOf(k)break;for(j=0;j=vt_tou.length)/全部产生式都不能符合则报错t3.append(String.copyValueO

15、f(n);t3.append(“n“+“该串不是 该文法的句型“+“n“);return;Object result1=shujuij;if(result1=null)t3.append(String.copyValueOf(n);t3.append(“n“+“该串不是 该文法的句型“+“n“);return;else/找到所用产生式 n49=Vni.charAt(0);u=50;String result=(String)result1;for(int y=0;y0;i-)/将分析栈内非终结符换为右边表达式if(result.charAt(i)!=#)fenxiffenxi=result.c

16、harAt(i);ffenxi+;if(buzhou=0;y-)nu=fenxiy;u+;u=29;for(int y=fzifu-1;y=0;y-)nu=zifuy;u+;buzhou+;n=new char65;n0=1;n14=#;n29=#; n49=分 ;n50=析 ;n51=成 ;n52=功 ;t3.append(String.copyValueOf(n);t3.append(“n“+“该串是此文法的句型 “+“n“);return;elset3.setText(“请先依次输入LL(1 )文法,并点击 文法判断 按钮“+ “n“);return;private int add_Fi

17、rst(char a,String b,String firstVn,int flag) /计算FIRST*(递归)if(puanduanString(firstVn,b.charAt(0)addString(firstVn,b);elsereturn flag;for(int i=0;iZ|t.charAt(k)Z|t.charAt(j+1)Z|t.charAt(j+1)=t.length()/下一个非终结符可推出空,把表达式左边非终结符的follow集加入所求follow集int p=followComplete(t.charAt(0);if(p!=-1)flag=addElementFo

18、llow(a,p,flag);else if(flag=tianjiaFollow(a,String.valueOf(t.charAt(0),followVn,flag)=-1)return -1;else/错误t3.setText(“文法输入有误,请重新输入“+ “n“);return -1;if(t.charAt(j)=b.charAt(0)if(p!=-1)flag=addElementFollow(a,p,flag);else if(flag=tianjiaFollow(a,String.valueOf(t.charAt(0),followVn,flag)=-1)return -1;r

19、eturn flag;private void tianjiaSelect(char a,String b,int flag) /计 算 SELECT*int i=2;int biaozhi=0;while(iZ|b.charAt(i)=Afor(j=0;Vni!=null;j+)if(Vnj.equals(String.valueOf(b.charAt(i)break;for(int k=0;firstjk!=0;k+)if(puanduanChar(a,firstjk) if(firstjk=#)biaozhi=1;/表达式右侧能推出空,标记elseaflag=firstjk;/不能推出空

20、,直接将first集加入 select集flag+;if(biaozhi=1)/表达式右侧能推出空for(j=0;Vni!=null;j+)if(Vnj.equals(b.substring(0,1)break;for(int k=0;followjk!=0;k+)if(puanduanChar(a,followjk)aflag=followjk;/将将表达式左侧的非终结符的follow加入selectflag+;break;elsebiaozhi=0;break;/返回 b在Vt 的位置private int puanduanXulie(char Vt,char b)int i;for(i=

21、0;Vti!=0;i+)if(Vti=b)break;return i;/判断b是否在a中,在返回 false,不在返回trueprivate boolean puanduanChar(char a,char b)for(int i=0;ai!=0;i+)if(ai=b)return false;return true;/判断b是否在a中,在返回 false,不在返回trueprivate boolean puanduanString(String a,char b)for(int i=0;ai!=null;i+)if(ai.equals(String.valueOf(b)return fal

22、se;return true;/把b加入字符串组firstVnprivate void addString(String firstVn,String b)int i;for(i=0;firstVni!=null;i+) firstVni=b;/判断b是否已完成first判断private int firstComplete(char b)int i;for(i=0;Vni!=null;i+) if(Vni.equals(String.valueOf(b)if(firstCompletei=1)return i;else return -1;return -1;/判断b是否已完成follow判

23、断private int followComplete(char b)for(int i=0;Vni!=null;i+) if(Vni.equals(String.valueOf(b)if(followCompletei=1)return i;else return -1;return -1;/把相应终结 符添加到 first*中private int addElementFirst(char a,int p,int flag) for(int i=0;firstpi!=0;i+)if(puanduanChar(a,firstpi)flag+;return flag;/把相应终结 符添加到 f

24、ollow*中private int addElementFollow(char a,int p,int flag) for(int i=0;followpi!=0;i+)if(puanduanChar(a,followpi)aflag=followpi;flag+;return flag;/判断a能是否包含空private boolean panduan_kong(char a)int i;for(i=0;Vni!=null;i+)if(Vni.equals(String.valueOf(a)break;for(int j=0;firstij!=0;j+)if(firstij=#)retur

25、n true;return false;public static void main(String args) new LL1();6、实验结果7、实验心得体会通过这次的实验,我深入了解了词法分析器和 LL(1)文法预测分析法设计和实现,增强了我的自学能力和独立思考能力,也让我对程序设计有了更大的兴趣,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对编译原理应用有了更深入的认识与掌握。在完成这个程序后,真的很开心,也了使我解到编译原理的魅力所在,激发了我要解决更多更难问题的决心。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习 java 语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报