java实现LL1语法分析(含GUI界面)

编译原理·Java实现语法分析:LL1文法(GUI实现界面)

1. 话不多说,先上代码

package ll1;

import 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 serialVersionUID = 1L;
    JTextField tf1;//左输入框	
    JTextField tf2;//右输入框
    JLabel l;//>>
    JPanel p1,p2,p3;//建立对象:p2上p3下
    JTextArea t1,t2,t3;//输入文法展示框、中间输入框、分析结果展示框
    JButton b0,b1,b2,b3;//按钮:文法确定、文法判断、输入、清空
    JLabel l0,l1,l2,l3,l4;
    JTable table;//
    Statement sta;//
    Connection conn;//
    ResultSet rs;//
    DefaultTableModel dtm;//
    String Vn[]=null;//
    Vector<String> P=null;//

    int firstComplete[]=null;
    //把已判断过first的数据储存
    char first[][]=null;
    //存储最终first
    int followComplete[]=null;
    //把已判断过follow的数据储存
    char follow[][]=null;
    //存储最终follow
    char select[][]=null;
    //存储最终select
    int LL=0;
    //标记是否为LL(1)文法
    String vt_tou[]=null;
    //储存Vt
    Object shuju[][]=null;
    //存储表达式数据
    char yn_null[]=null;
    //存储能否推出空
    
    
/*
 * 
 * 布局
 * 
 * */
    LL1()
    {
   
        setLocation(200,0);
        setSize(700,710);
        tf1=new JTextField(13);
        tf2=new JTextField(13);
        l=new JLabel(">>");
        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(22,30);
        t2=new JTextArea(2,30);
        t3=new JTextArea(22,30);
        b0=new JButton("   文  法  确  定         ");
        b1=new JButton("   文  法  判  断         ");
        b2=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(l3);
        p2.add(jp1);//左侧

        p3.add(l4);
        p2.add(jp3);//右侧

        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(new 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 String[100];
            P=new Vector<String>();
            String s[]=t1.getText().split("\n");
            //判断长度是否符合?
            for(int i=0;i<s.length;i++)
            {
   
                if(s.length<2){
   
                    t3.setText("文法输入有误,请重新输入");
                    return;
                }
                if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→')
                {
   
                    for(k=0;k<Vnnum;k++)
                    {
   
                        if(Vn[k].equals(s[i].substring(0, 1))){
   
                            break;
                        }
                    }
                    if(Vnnum==0||k>=Vnnum)
                    {
   
                    	//存入Vn数据
                        Vn[Vnnum]=s[i].substring(0, 1);
                        Vnnum++;
                    }
                    P.add(s[i]);
                }
                else
                {
   
                    t3.setText("文法输入有误,请重新输入");
                    return;
                }
            }
            yn_null=new char[100];
            first=new char[Vnnum][100];
            int flag=0;
            String firstVn[]=null;
            firstComplete=new int[Vnnum];
            //求First集
            for(int i=0;Vn[i]!=null;i++)   
            {
   
                flag=0;
                firstVn=new String[20];
                if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;
                firstComplete[i]=1;

            }
            t3.append("first集:"+"\n");//显示
            for(int i=0;Vn[i]!=null;i++)
            {
   
                t3.append("first("+Vn[i]+")={ ");
                for(int j=0;first[i][j]!='\0';j++)//
                {
   
                    t3.append(first[i][j]+" , ");
                }
                t3.append("}"+"\n");
            }
            follow=new char[Vnnum][100];
            String followVn[]=null;
            followComplete=new int[Vnnum];
            
            //求Follow集
            for(int i=0;Vn[i]!=null;i++)//
            {
   
                flag=0;
                followVn=new String[20];
                if((flag=tianjiaFollow(follow[i],Vn[i],followVn,flag))==-1)return;
                followComplete[i]=1;
            }
            t3.append("follow集:"+"\n");//显示
            for(int i=0;Vn[i]!=null;i++)
            {
   
                t3.append("follow("+Vn[i]+")={ ");
                for(int j=0;follow[i][j]!='\0';j++)
                {
   
                    t3.append(follow[i][j]+" , ");
                }
                t3.append("}"+"\n");
            }
            select=new char[P.size()][100];

            //求Select集
            for(int i=0;i<P.size();i++)//
            {
   
                flag=0;
                tianjiaSelect(select[i],(String)P.elementAt(i),flag);
            }
            t3.append("select集:"+"\n");//显示
            for(int i=0;i<P.size();i++)
            {
   
                t3.append("select("+(String)P.elementAt(i)+")={ ");
                for(int j=0;select[i][j]!='\0';j++)
         
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LL1语法分析是一种自上而下的逐步分析法,常应用于编译器中对源代码的语法分析。而Java作为一种面向对象编程语言,可以很好地实现LL1语法分析。 首先需要设计一个语法分析器的类,其中核心的功能是对输入的源代码进行分析,并据此建立语法分析树。这个类需要有两个主要方法:一个用于读入源代码,并将其存储到内存中;另一个用于对源代码进行语法分析,生成语法分析树。 为了实现LL1语法分析,还需要对源代码的文法进行LL1分析表的构建。这个表包文法中所有非终结符和终结符的FIRST集和FOLLOW集,以及文法规则对应的预测分析表格,用于判断分析串是否符合文法规则。 在具体实现过程中,需要先将输入的源代码转化为词法单元序列。这个过程可以通过使用正则表达式进行模式匹配,从而去除空格和注释等无关字符,提取出代表特定单词的有关信息。 然后建立语法分析树,树中每个节点代表一个非终结符或终结符,根据LL1分析表格,从根节点开始进行预测分析,并依次推导出分析树中的节点。 最后,将分析树与源代码进行比较,判断该源代码是否符合文法规则。如果符合,可执行相应语义分析,生成目标代码或执行相应操作。 总之,Java具有丰富的面向对象编程特性和强大的代码模块化能力,通过对LL1语法分析算法的深入理解与应用,也可以很好地实现自己的语法分析器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值