收藏 分享(赏)

LL1语法分析JAVA实现(有界面).pdf

上传人:精品资料 文档编号:10305623 上传时间:2019-10-29 格式:PDF 页数:21 大小:170.23KB
下载 相关 举报
LL1语法分析JAVA实现(有界面).pdf_第1页
第1页 / 共21页
LL1语法分析JAVA实现(有界面).pdf_第2页
第2页 / 共21页
LL1语法分析JAVA实现(有界面).pdf_第3页
第3页 / 共21页
LL1语法分析JAVA实现(有界面).pdf_第4页
第4页 / 共21页
LL1语法分析JAVA实现(有界面).pdf_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.table.DefaultTableModel;importjava.sql.*;importjava.util.Vector;publicclassLL1extendsJFrameimplementsActionListener/*/privatestaticfinallongserialVersionUID=1L;JTextFieldtf1;JTextFieldtf2;JLabell;JButtonb0;JPanelp1,p2,p3;J

2、TextAreat1,t2,t3;JButtonb1,b2,b3;JLabell0,l1,l2,l3,l4;JTabletable;Statementsta;Connectionconn;ResultSetrs;DefaultTableModeldtm;StringVn=null;VectorP=null;intfirstComplete=null;/存储已判断过first的数据charfirst=null;/存储最后first结果intfollowComplete=null;/存储已判断过follow的数据charfollow=null;/存储最后follow结果charselect=nul

3、l;/存储最后select结果intLL=0;/标记是否为LL(1)Stringvt_tou=null;/储存VtObjectshuju=null;/存储表达式数据charyn_null=null;/存储能否推出空LL1()setLocation(100,0);setSize(700,780);tf1=newJTextField(13);tf2=newJTextField(13);l=newJLabel(“);l0=newJLabel(“输入字符串:“);l1=newJLabel(“输入的文法为:“);l2=newJLabel(“);l3=newJLabel(“分析的结果:“);l4=newJ

4、Label(“预测分析表:“);/p1=newJPanel();p2=newJPanel();p3=newJPanel();t1=newJTextArea(24,20);t2=newJTextArea(1,30);t3=newJTextArea(24,40);b0=newJButton(“确定(S为开始)“);b1=newJButton(“判断文法“);b2=newJButton(“输入“);b3=newJButton(“清空“);table=newJTable();JScrollPanejp1=newJScrollPane(t1);JScrollPanejp2=newJScrollPane(

5、t2);JScrollPanejp3=newJScrollPane(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(l3);p2.add(jp1);p2.add(jp3);p3.add(l4);p3.add(newJScrollPane(table);add(p2,“Center“);add(p3,“South“);b0.addActionListener(this);b1.a

6、ddActionListener(this);b2.addActionListener(this);b3.addActionListener(this);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);table.setPreferredScrollableViewportSize(newDimension(660,200);setVisible(true);/界面设计publicvoidactionPerformed(ActionEvente)if(e.getSource()=b0)Stringa=tf1.getText();Stringb=tf

7、2.getText();t1.append(a+b+n);if(e.getSource()=b1)t3.setText(“);intVnnum=0,k;Vn=newString100;P=newVector();Strings=t1.getText().split(“n“);for(inti=0;i=Ak=Vnnum)VnVnnum=si.substring(0,1);/存入Vn数据Vnnum+;P.add(si);elset3.setText(“文法输入有误,请重新输入“);return;yn_null=newchar100;first=newcharVnnum100;intflag=0;S

8、tringfirstVn=null;firstComplete=newintVnnum;for(inti=0;Vni!=null;i+)/依次求FIRST*flag=0;firstVn=newString20;if(flag=add_First(firsti,Vni,firstVn,flag)=-1)return;firstCompletei=1;t3.append(“first集:“+“n“);/显示FIRST*for(inti=0;Vni!=null;i+)t3.append(“first(“+Vni+“)=“);for(intj=0;firstij!=0;j+)t3.append(fir

9、stij+“,“);t3.append(“+“n“);follow=newcharVnnum100;StringfollowVn=null;followComplete=newintVnnum;for(inti=0;Vni!=null;i+)/求FOLLOW*flag=0;followVn=newString20;if(flag=tianjiaFollow(followi,Vni,followVn,flag)=-1)return;followCompletei=1;t3.append(“follow集:“+“n“);/显示FOLLOW*for(inti=0;Vni!=null;i+)t3.ap

10、pend(“follow(“+Vni+“)=“);for(intj=0;followij!=0;j+)t3.append(followij+“,“);t3.append(“+“n“);select=newcharP.size()100;for(inti=0;iZ|t.charAt(j)=0;i-)zifufzifu=s.charAt(i);fzifu+;intbuzhou=2;charn=newchar65;/存储要显示的内容t3.append(“步骤分析栈剩余输入串所用产生式或匹配“+“n“);n0=1;n15=#;n14=S;intu=29;for(inti=fzifu-1;i=0;i-)

11、nu=zifui;u+;while(!(fenxiffenxi-1=#chart=zifufzifu-1;chark=fenxiffenxi-1;if(t=k)/产生式匹配n49=k;n50=匹;n51=配;t3.append(String.copyValueOf(n)+“n“);n=newchar65;fzifu-;ffenxi-;if(buzhou=0;y-)/处理分析栈,出栈nu=fenxiy;u+;u=29;for(inty=fzifu-1;y=0;y-)/处理剩余字符串,消除一个字符nu=zifuy;u+;buzhou+;continue;for(i=0;Vni!=null;i+)/

12、搜寻所用产生式的左部if(Vni.equals(String.valueOf(k)break;for(j=0;j=vt_tou.length)/全部产生式都不能符合则报错t3.append(String.copyValueOf(n);t3.append(“n“+“该串不是该文法的句型“+“n“);return;Objectresult1=shujuij;if(result1=null)t3.append(String.copyValueOf(n);t3.append(“n“+“该串不是该文法的句型“+“n“);return;else/找到所用产生式n49=Vni.charAt(0);u=50;

13、Stringresult=(String)result1;for(inty=0;y0;i-)/将分析栈内非终结符换为右边表达式if(result.charAt(i)!=#)fenxiffenxi=result.charAt(i);ffenxi+;if(buzhou=0;y-)nu=fenxiy;u+;u=29;for(inty=fzifu-1;y=0;y-)nu=zifuy;u+;buzhou+;n=newchar65;n0=1;n14=#;n29=#;n49=分;n50=析;n51=成;n52=功;t3.append(String.copyValueOf(n);t3.append(“n“+“

14、该串是此文法的句型“+“n“);return;elset3.setText(“请先依次输入LL(1)文法,并点击文法判断按钮“+“n“);return;privateintadd_First(chara,Stringb,StringfirstVn,intflag)/计算FIRST*(递归)if(puanduanString(firstVn,b.charAt(0)addString(firstVn,b);elsereturnflag;for(inti=0;iZ|t.charAt(k)Z|t.charAt(j+1)Z|t.charAt(j+1)=t.length()/下一个非终结符可推出空,把表达

15、式左边非终结符的follow集加入所求follow集intp=followComplete(t.charAt(0);if(p!=-1)flag=addElementFollow(a,p,flag);elseif(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);elsei

16、f(flag=tianjiaFollow(a,String.valueOf(t.charAt(0),followVn,flag)=-1)return-1;returnflag;privatevoidtianjiaSelect(chara,Stringb,intflag)/计算SELECT*inti=2;intbiaozhi=0;while(iZ|b.charAt(i)=Afor(j=0;Vni!=null;j+)if(Vnj.equals(String.valueOf(b.charAt(i)break;for(intk=0;firstjk!=0;k+)if(puanduanChar(a,fir

17、stjk)if(firstjk=#)biaozhi=1;/表达式右侧能推出空,标记elseaflag=firstjk;/不能推出空,直接将first集加入select集flag+;if(biaozhi=1)/表达式右侧能推出空for(j=0;Vni!=null;j+)if(Vnj.equals(b.substring(0,1)break;for(intk=0;followjk!=0;k+)if(puanduanChar(a,followjk)aflag=followjk;/将将表达式左侧的非终结符的follow加入selectflag+;break;elsebiaozhi=0;break;/返

18、回b在Vt的位置privateintpuanduanXulie(charVt,charb)inti;for(i=0;Vti!=0;i+)if(Vti=b)break;returni;/判断b是否在a中,在返回false,不在返回trueprivatebooleanpuanduanChar(chara,charb)for(inti=0;ai!=0;i+)if(ai=b)returnfalse;returntrue;/判断b是否在a中,在返回false,不在返回trueprivatebooleanpuanduanString(Stringa,charb)for(inti=0;ai!=null;i+

19、)if(ai.equals(String.valueOf(b)returnfalse;returntrue;/把b加入字符串组firstVnprivatevoidaddString(StringfirstVn,Stringb)inti;for(i=0;firstVni!=null;i+)firstVni=b;/判断b是否已完成first判断privateintfirstComplete(charb)inti;for(i=0;Vni!=null;i+)if(Vni.equals(String.valueOf(b)if(firstCompletei=1)returni;elsereturn-1;r

20、eturn-1;/判断b是否已完成follow判断privateintfollowComplete(charb)for(inti=0;Vni!=null;i+)if(Vni.equals(String.valueOf(b)if(followCompletei=1)returni;elsereturn-1;return-1;/把相应终结符添加到first*中privateintaddElementFirst(chara,intp,intflag)for(inti=0;firstpi!=0;i+)if(puanduanChar(a,firstpi)flag+;returnflag;/把相应终结符添

21、加到follow*中privateintaddElementFollow(chara,intp,intflag)for(inti=0;followpi!=0;i+)if(puanduanChar(a,followpi)aflag=followpi;flag+;returnflag;/判断a能是否包含空privatebooleanpanduan_kong(chara)inti;for(i=0;Vni!=null;i+)if(Vni.equals(String.valueOf(a)break;for(intj=0;firstij!=0;j+)if(firstij=#)returntrue;returnfalse;publicstaticvoidmain(Stringargs)newLL1();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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