Java 语法分析器LR0

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Stack;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;

public class LR0 extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private char VN[]={'S','E','T','F'};//非终结符
	private char VT[]={'+','*','(',')','i','$','ε'};//终结符
	private char Total[]={'S','E','T','F','+','*','(',')','i','$'};
	/*private char Total[]={'S','E','C','c','d','$'};
	private char VN[]={'S','E','C'};//非终结符
	private char VT[]={'c','d','$','ε'};//终结符*/
	private String M[][]=new String[22][22];
	private String M1[][]=new String[22][22];
	private int N[][]=new int[22][22];
	private int Goto[][]=new int[22][Total.length];
	private String ACtion[][]=new String[22][VT.length-1];
	private boolean Visited[]=new boolean[22];
	private String G[]={"S->E","E->E+T","E->T","T->T*F","T->F","F->(E)","F->i"};//文法
	//private String G[]={"S->E","E->CC","C->cC","C->d"};//文法
	
	//建立表格
		private Object[] colname = {"步骤","分析栈","分析符号","剩余字符串","动作"};
		private Object[][] data=new Object[50][5];
		private JTable table;
		private JTextField j3;
		private JLabel j8;
		private JLabel j9;
		private JLabel j10;
		private JTextArea j5;
		private JScrollPane jsPan;
		private JScrollPane jsPane;
		private File imgFile = null;// 声明所选择文件
		private BufferedReader in1;
		private GridBagLayout layout;
	    private GridBagConstraints s;
	    private int h = 0;
	    private String getstr=null;
	    private int ONE_SECOND = 1000;
	    private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
	    private String time;
		
	  //获取系统的日期
		public String Get_Date() {
			 Date date = new Date();    
			 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
		     String dateNowStr = sdf.format(date);  
		     return dateNowStr;
		}
		
		public void Get_Time() {
			 
		     Timer tmr = new Timer();
		     tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
		}
		
		//将表格清空
				public void Get_Clear() {
					int i;
					for(i=0;i<50;i++) {
						data[i]=new Object[]{"","","","",""};
					}
				}
				
	
	public void Init() {//初始化follow集,将#放到开始符号集中去
		M[0][0]="S->.E";
		int i=0,j=0;
		for(i=0;i<22;i++) {
			for(j=0;j<22;j++) {
				N[i][j]=0;
			}
		}
	/*	for(i=0;i<22;i++) {
			for(j=0;j<22;j++) {
				M1[i][j]="love";
			}
		}*/
		M1[0][0]="S->.E";
		
		for(i=0;i<22;i++) {
			Visited[i]=false;
		}
	}
	
	public int IsInTotal(char c) {//判断是否在总的字符中
		int i;
		int locate=999;
		for(i=0;i<Total.length;i++) {
			if(Total[i]==c) {
				locate=i;
			}
		}
		return locate;
	}
	
	public int IsInVn(char ch) {//判断字符是否属于非终结符
		int judge=999;
		for(int i=0;i<VN.length;i++) {
			if(ch==VN[i]) {
				judge=i;
				break;
			}
		}
		return judge;
	}
	
	
	public int IsInVt(char ch) {//判断字符是否属于终结符
		int judge=999;
		for(int i=0;i<VT.length;i++) {
			if(ch==VT[i]) {
				judge=i;
				break;
			}
		}
		return judge;
	}
	
	
	
	
	
	public  String Simply(String s) {//去除重复的字符
        StringBuffer sb = new StringBuffer();
        int len = s.length();
        int i = 0;
        boolean flag = false;
 
        for (i = 0; i < len; i++) {
            char c = s.charAt(i);
            if(c!='n'&&c!='u'&&c!='l') {
 
            if (s.indexOf(c) != s.lastIndexOf(c)) {
                flag = false;
            }else{
                flag = true;
            }
            if(i==s.indexOf(c))
                flag=true;
            if (flag) {
                sb.append(c);
            }
        }
        }
        return sb.toString();
    }
	
	public boolean Check(int a[],int b[]) {//检查两个数组是否相等
		int i;
		int count=0;
		for(i=0;i<VN.length;i++) {
			if(a[i]==b[i]) {
				count++;
			} else {
				break;
			}
		}
		return (count==VN.length);
	}
	
	
	
	
	public int Get_NotNull(String temp[][],int k) {//返回最小为空的下标
		int i;
		int sum=0;
		for(i=0;i<22;i++) {
			if(temp[k][i]!=null) {
				sum++;
			}
		}
		return sum;
	}
	
	public boolean IsInI(String temp,String M[][],int i) {
		boolean judge=false;
		int k;
		for(k=0;k<22;k++) {
			if(temp.equals(M[i][k])) {
				judge=true;
			}
		}
		return judge;
	}
	
	public String Get_Xiang(String temp) {//得到项集
		StringBuilder d=new StringBuilder();
		int j;
		for(j=0;j<3;j++) {
			d.append(temp.charAt(j));
		}
		d.append('.');
		for(j=3;j<temp.length();j++) {
			d.append(temp.charAt(j));
		}
		
		return d.toString();
	}
	
	
	//求解CLOSURE
	public void CLOSURE(int I) {
		int i;
		int j,k;
		int h=0;
		for(i=0;i<M[I].length;i++) {//I中的每个项[A->A.Bb,a]
			if(M[I][i]!=null) {//如果字符串非空
				j=3;
				while(M[I][i].charAt(j)!='.'&&j<M[I][i].length()) {
					j++;
				}
				j++;
				if(IsInVn(M[I][i].charAt(j))!=999) {
					for(k=0;k<G.length;k++) {
						if(G[k].charAt(0)==M[I][i].charAt(j)) {
								if(IsInI(Get_Xiang(G[k]),M,I)==false) {
									h=Get_NotNull(M,I);
									M[I][h]=Get_Xiang(G[k]);
								}
							
						}
					}
				}
			}
		}
	}
	
	//备用
	
	public int Get_NotNull_B(String str[]) {//返回最小为空的下标
		int i;
		int sum=0;
		for(i=0;i<22;i++) {
			if(str[i]!=null) {
				sum++;
			}
		}
		return sum;
	}
	
	public boolean IsInI(String temp,String str[]) {
		boolean judge=false;
		int k;
		for(k=0;k<22;k++) {
			if(temp.equals(str[k])) {
				judge=true;
			}
		}
		return judge;
	}
	
	
	public void CLOSURE_B(String str[]) {
		int i;
		int j,k;
		int h=0;
		for(i=0;i<str.length;i++) {//I中的每个项[A->A.Bb,a]
			if(str[i]!=null) {//如果字符串非空
				j=3;
				while(str[i].charAt(j)!='.'&&j<str[i].length()) {
					j++;
				}
				j++;
				if(j<str[i].length()) {
					
					if(IsInVn(str[i].charAt(j))!=999) {
						for(k=0;k<G.length;k++) {
							if(G[k].charAt(0)==str[i].charAt(j)) 
									if(IsInI(Get_Xiang(G[k]),str)==false) {
										h=Get_NotNull_B(str);
										str[h]=Get_Xiang(G[k]);
									}
								
						}
					}
					
				}
			}
		}
	}
	
	
	public String Get_X(String temp[][],int i) {
		int j,k;
		StringBuilder d=new StringBuilder();
		for(j=0;j<temp[i].length;j++) {
			if(temp[i][j]!=null) {
				k=3;
				while(temp[i][j].charAt(k)!='.'&&k<temp[i][j].length()) {
					k++;
				}
				k++;
				if(k<temp[i][j].length()&&temp[i][j].charAt(k)!=',') {
					d.append(temp[i][j].charAt(k));
				}
			}

		}
		return d.toString();
		
	}
	
	public String[] Get_New(String temp[][],int i,char X) {//新的产生式
		String tem[]=new String[22];
		int j,k,f=0;
		StringBuilder d=new StringBuilder();
		j=0;
		while(j<temp[i].length) {
			if(temp[i][j]!=null) {
				k=0;
				while(temp[i][j].charAt(k)!='.'&&k<temp[i][j].length()) {
					d.append(temp[i][j].charAt(k));
					k++;
				}
				k++;
				if(k<temp[i][j].length()&&temp[i][j].charAt(k)==X) {
					d.append(temp[i][j].charAt(k));
					d.append('.');
					k++;
					while(k<temp[i][j].length()) {
						d.append(temp[i][j].charAt(k));
						k++;
					}
					tem[f]=d.toString();
					d.replace(0,d.length(),"");
					f++;
				} else {
					d.replace(0,d.length(),"");//清空
				}
			}
			j++;
		}
		return tem;
	}
	
	public int Get_N(String temp) {//获得元素个数
		return temp.length();
	}
	
	public int Get_J(int k,int h) {
		int sum=0;
		int i,j;
		for(i=0;i<k;i++) {
			for(j=0;j<22;j++) {
				sum+=N[i][j];
			}
		}
		for(j=0;j<h;j++) {
			sum+=N[k][j];
		}
		return sum;
	}
	
	public int Get_Same(String temp[]) {//判断求出的项集是否已经存在
		int i=0,j;
		int correct = 999;
		int sum = 0;
		while(i<22) {
			sum=0;
			int len=Get_NotNull(M,i);
			int len1=Get_NotNull_B(temp);
			if(len==len1) {
				for(j=0;j<len;j++) {
					if(M[i][j].equals(temp[j])) {
						sum++;
					}
				}
				
				if(sum==len) {
					correct=i;
					break;
				} else {
					i++;
				}
				
			} else {
				i++;
			}
		}
		return correct;
	}
	
	public int Get_In_X(int k,char X) {//获得字符在序列中的位置
		int locate=999;
		int i=0;
		for(i=0;i<Get_X(M,k).length();i++) {
			if(X==Get_X(M,k).charAt(i)) {
				locate=i;
			}
		}
		return locate;
	}
	
	public void Copy(int k,String str[]) {//将得到的项集赋值到M中去
		int i;
		for(i=0;i<22;i++) {
			M[k][i]=str[i];
		}
	}
	
	public int GOTO(int I,char X) {//求解goto函数
		String str[]=new String[22];
		str=Get_New(M,I,X);
		/*for(int n=0;n<10;n++) {
			if(str[n]!=null) {
				System.out.print(X+" "+str[n]+ " ");
			}
		}*/
		System.out.println();
		CLOSURE_B(str);
		for(int n=0;n<10;n++) {
			if(str[n]!=null) {
				System.out.print(X+" "+str[n]+ " ");
			}
		}
		System.out.println();
		int same=Get_Same(str);
		if(same==999) {//不存在这个新集合
			int locate=Get_In_X(I,X);
			N[I][locate]++;
			int locate1=Get_J(I,locate)+1;
		//	System.out.print("&"+locate1+" ");
			Copy(locate1,str);
			Goto[I][IsInTotal(X)]=locate1;
			return locate1;
			
		} else {//如果存在这个M中
			Goto[I][IsInTotal(X)]=same;
			return same;
		}
	}
	
	public void Items() {//求closure ,goto 的主例程
		int i,j;
		String temp;
		CLOSURE(0);
		for(i=0;i<22;i++) {
			if(Visited[i]==false) {//如果没有访问
				temp=Get_X(M,i);
				temp=Simply(temp);
				if(temp!=null) {
					for(j=0;j<temp.length();j++) {
						GOTO(i,temp.charAt(j));
					}
				}
			}
			Visited[i]=true;
		}
		
	}
	
	public int Get_Locate(String temp) {//返回要规约的位置
		int i;
		int locate=999;
		for(i=0;i<G.length;i++) {
			if(temp.equals(G[i])){
				locate=i;
			}
		}
		return locate;
	}
	
	public void Get_Action() {//获得Action表
		int i,j,k,n;
		for(i=0;i<22;i++) {
			for(j=0;j<22;j++) {
				if(M[i][j]!=null) {
					k=0;
					StringBuilder d=new StringBuilder();
					while(k<M[i][j].length()&&M[i][j].charAt(k)!='.') {
						d.append(M[i][j].charAt(k));
						k++;
					}
					k++;
					if(k<M[i][j].length()&&IsInVt(M[i][j].charAt(k))!=999) {//a是终结符
						if(Goto[i][IsInTotal(M[i][j].charAt(k))]!=0) {
							ACtion[i][IsInVt(M[i][j].charAt(k))]="s"+String.valueOf(Goto[i][IsInTotal(M[i][j].charAt(k))]);
						}
					} else {
						if(k==M[i][j].length()) {//如果是结尾
							if(M[i][j].charAt(0)!='S') {
								for(n=0;n<VT.length-1;n++) {
									ACtion[i][n]="r"+String.valueOf(Get_Locate(d.toString()));
								}
							} else {
								ACtion[i][VT.length-2]="acc";
							}
						}
					}
				}
			}
		}
	}
	
	public char Before_temp(String temp) {//返回.号前面的第一个字符
		int i=0;
		while(i<temp.length()&&temp.charAt(i)!='.') {
			i++;
		}
		i--;
		return temp.charAt(i);
	}
	
	
	public void From_M_To_M1() {
		int i,j,k;
		char c;
		for(i=1;i<22;i++) {
			for(j=0;j<22;j++) {
				if(M[i][j]!=null) {
					if(j==0) {
						M1[i][j]=M[i][j];
					} else {
						c=Before_temp(M[i][0]);
						k=0;
						while(M[i][j].charAt(k)!='.') {
							k++;
						}
						k--;
						if(c==M[i][j].charAt(k)) {
							M1[i][j]=M[i][j];
						}
					}
				}
			}
		}
	}
	
	public int Get_Number(int k) {//返回B中的个数
		int sum=G[k].length()-3;
		return sum;
	}
	
	
	//输出堆栈中的内容
	public String Print_Stack(Stack<Integer> stack) {
		return stack.toString();
	}
	
	
		//输出堆栈中的内容
				public String Print_Stack1(Stack<Character> stack) {
					String s=stack.toString();
					int i;
					StringBuilder t=new StringBuilder();
					for(i=0;i<s.length();i++) {
						if(s.charAt(i)!='['&&s.charAt(i)!=','&&s.charAt(i)!=']'&&s.charAt(i)!=' ') {
							t.append(s.charAt(i));//将其中的字符相加为所要求的字符串
						}
					}
					return t.toString();
				}
				
		//输出剩余字符串
		public String Print_Buffer(String s,int j) {
			String t=s.substring(j,s.length());
			return t;
		}
	
	public void Get_Run() {
		getstr = j5.getText();
		int i=0,j,k;
		int t;
		Stack<Integer> stack = new Stack<Integer>(); // 创建堆栈对象 
		Stack<Character> stack1 = new Stack<Character>();
		stack.push(0);
		while(true) {
			int s=stack.peek();
			if(ACtion[s][IsInVt(getstr.charAt(i))].charAt(0)=='s') {
				
				System.out.print(Print_Stack(stack));
				System.out.print("         ");
				System.out.print(Print_Stack1(stack1));
				System.out.print("         ");
				System.out.print(Print_Buffer(getstr,i));
				System.out.println();
				
        		data[h++]=new Object[]{h,Print_Stack(stack),Print_Stack1(stack1),Print_Buffer(getstr,i),"移入"};
        		
				stack1.push(getstr.charAt(i));
				stack.push(Integer.parseInt(ACtion[s][IsInVt(getstr.charAt(i))].substring(1,ACtion[s][IsInVt(getstr.charAt(i))].length())));
				i++;
			} else {
				if(ACtion[s][IsInVt(getstr.charAt(i))].charAt(0)=='r') {
					
					System.out.print(Print_Stack(stack));
					System.out.print("         ");
					System.out.print(Print_Stack1(stack1));
					System.out.print("         ");
					System.out.print(Print_Buffer(getstr,i));
					System.out.print("         ");
					
					j=Integer.parseInt(ACtion[s][IsInVt(getstr.charAt(i))].substring(1,ACtion[s][IsInVt(getstr.charAt(i))].length()));
					data[h++]=new Object[]{h,Print_Stack(stack),Print_Stack1(stack1),Print_Buffer(getstr,i),"根据"+G[j]+"归约"};
					k=Get_Number(j);
					while(k>0) {
						stack.pop();
						stack1.pop();
						k--;
					}
					stack1.push(G[j].charAt(0));
					t=stack.peek();
					stack.push(Goto[t][IsInTotal(G[j].charAt(0))]);
					System.out.print(G[j]);
					System.out.println();
				} else {
					if(ACtion[s][IsInVt(getstr.charAt(i))].equals("acc")) {
						System.out.print(Print_Stack(stack));
						System.out.print("         ");
						System.out.print(Print_Stack1(stack1));
						System.out.print("         ");
						System.out.print(Print_Buffer(getstr,i));
						System.out.print("         ");
						System.out.print(G[0]);
						System.out.println();
						data[h++]=new Object[]{h,Print_Stack(stack),Print_Stack1(stack1),Print_Buffer(getstr,i),"接受"};
						break;
					} else {
						System.out.println("ERROR");
					}
				}
				
			}
				
		}
		
	}
	
	public void Print1() {
		for(int i=0;i<22;i++) {
			for(int j=0;j<22;j++) {
				if(M[i][j]!=null){
					System.out.print(i+ " "+j+M[i][j]+" ");
			}
		}
			System.out.println();
	}
	}
	
	public void Print2() {
		for(int i=0;i<22;i++) {
			for(int j=0;j<Total.length;j++) {
				if(Goto[i][j]!=0)
					System.out.print(i+","+j+" "+Goto[i][j]+" ");
		}
			System.out.println();
	}
	}
	
	public void Print3() {
		for(int i=0;i<22;i++) {
			for(int j=0;j<VT.length-1;j++) {
				if(ACtion[i][j]!=null)
					System.out.print(i+","+j+" "+ACtion[i][j]+" ");
		}
			System.out.println();
	}
	}
	
	public void Print4() {
		for(int i=0;i<22;i++) {
			for(int j=0;j<22;j++) {
				if(M1[i][j]!=null){
					System.out.print(i+ " "+j+M1[i][j]+" ");
			}
		}
			System.out.println();
	}
	}
	
	LR0() {
		
		
		setTitle("LR(0)语法分析器");
		final JButton j4 = new JButton("浏览");
        j4.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();// 创建文件选择器
                FileFilter filter = new FileNameExtensionFilter(
                        "文件(txt/docx/doc/java/cpp/asm)", "txt","docx","doc","java","cpp","asm");// 创建过滤器
                fileChooser.setFileFilter(filter);// 设置过滤器
                int flag = fileChooser.showOpenDialog(null);// 显示打开对话框
                if (flag == JFileChooser.APPROVE_OPTION) {
                    imgFile = fileChooser.getSelectedFile(); // 获取选中文件的File对象
                }
                if (imgFile != null) {
                	j3.setText(imgFile.getAbsolutePath());// 文件完整路径
                }
            }
        });
        
        final JButton j1 = new JButton("显示"); 
        j1.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
            	try {
					in1=new BufferedReader(new FileReader
							(imgFile.getAbsoluteFile()));
				} catch (FileNotFoundException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}//获得绝对路径
            	String s;
            	
        		try {
					while((s=in1.readLine())!=null) {
						j5.append(s);
						j5.append("\n");
					}
					in1.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            }
        });
        
        final JButton j2 = new JButton("分析"); 
        j2.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
            	Get_Clear();
            	h=0;
            	Init();
        		Items();
        		From_M_To_M1();
        		//CLOSURE(0);
        		//Print();
        		Get_Action();
        		Get_Run();
        		Print1();
        		Print2();
        		Print3();
        		Print4();
            	jsPane.validate(); 
            	jsPane.repaint();
            	Get_Date();
            }
        });
        
		j3 = new JTextField();
		j5 = new JTextArea();
		//model = new DefaultTableModel(data, colname);
		//table = new JTable(model);
		table = new JTable(data,colname);
		//表头居中
		((DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);
		//表格内容居中
		DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();// 设置table内容居中
		renderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
		  table.setDefaultRenderer(Object.class, renderer);

		jsPan = new JScrollPane(j5);
	    jsPane = new JScrollPane(table);


	    layout = new GridBagLayout(); 
	    
	    j8=new JLabel("LR(0)",JLabel.CENTER);
	    j8.setBorder(BorderFactory.createEtchedBorder());
		j9=new JLabel(Get_Date(),JLabel.CENTER);
		j9.setBorder(BorderFactory.createEtchedBorder());
		j10=new JLabel("54",JLabel.CENTER);
		j10.setBorder(BorderFactory.createEtchedBorder());
		this.setLayout(layout); 
		this.add(j1);
		this.add(j2); 
		this.add(j3); 
		this.add(j4); 
		this.add(jsPan);
		this.add(jsPane);
		this.add(j8);
		this.add(j9);
		this.add(j10);

		s= new GridBagConstraints();//定义一个GridBagConstraints, 
		//是用来控制添加进的组件的显示位置 
		s.fill = GridBagConstraints.BOTH; 
		//该方法是为了设置如果组件所在的区域比组件本身要大时的显示情况 
		//NONE:不调整组件大小。 
		//HORIZONTAL:加宽组件,使它在水平方向上填满其显示区域,但是不改变高度。 
		//VERTICAL:加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度。 
		//BOTH:使组件完全填满其显示区域。 
		s.gridwidth=1;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个 
		s.weightx = 0;//该方法设置组件水平的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间 
		s.weighty=0;//该方法设置组件垂直的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间 
		layout.setConstraints(j1, s);//设置组件 
		s.gridwidth=1; 
		s.weightx = 0; 
		s.weighty=0; 
		layout.setConstraints(j2, s); 
		s.gridwidth=4; 
		s.weightx = 1; 
		s.weighty=0; 
		layout.setConstraints(j3, s); 
		s.gridwidth=0;//该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个 
		s.weightx = 0;//不能为1,j4是占了4个格,并且可以横向拉伸, 
		//但是如果为1,后面行的列的格也会跟着拉伸,导致j7所在的列也可以拉伸 
		//所以应该是跟着j6进行拉伸 
		s.weighty=0; 
		layout.setConstraints(j4, s);
		s.gridwidth=0; 
		s.weightx = 1; 
		s.weighty=1; 
		layout.setConstraints(jsPan, s); 
		s.gridwidth=0; 
		s.weightx = 1; 
		s.weighty=1; 
		layout.setConstraints(jsPane, s);
		
		s.gridwidth=2; 
		s.weightx = 1; 
		s.weighty=0; 
		layout.setConstraints(j8, s);
		
		s.gridwidth=1; 
		s.weightx = 1; 
		s.weighty=0; 
		layout.setConstraints(j9, s);
		
		s.gridwidth=0; 
		s.weightx = 1; 
		s.weighty=0; 
		layout.setConstraints(j10, s);
	}
	
	protected class JLabelTimerTask extends TimerTask{
		 SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
		 @Override
		 public void run() {
		  time = dateFormatter.format(Calendar.getInstance().getTime());
		  j10.setText(time);
		 }
		 }
	
public static void main(String args[]) {
		
	try {//使用默认窗口形式
        UIManager
                .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Throwable e) {
        e.printStackTrace();
    }
	
	EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
            	LR0 alr = new LR0();
        		alr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        		alr.setBounds(300,200,400,400);
        		alr.setVisible(true);
        		alr.Get_Time();//动态显示时间
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您好!lr(0)语法分析器是一种自下而上的语法分析器,它可以用于对文法进行自动分析和语法检查。在Java中,可以使用ANTLR框架来实现lr(0)语法分析器。ANTLR是一种高性能的语法分析器生成器,它可以根据语法文件自动生成语法分析器。以下是一个简单的lr(0)语法分析器Java代码示例: ``` import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.*; public class MyParser { public static void main(String[] args) throws Exception { String input = "1+2*3"; ANTLRInputStream inputStream = new ANTLRInputStream(input); MyLexer lexer = new MyLexer(inputStream); CommonTokenStream tokens = new CommonTokenStream(lexer); MyParser parser = new MyParser(tokens); ParseTree tree = parser.expr(); System.out.println(tree.toStringTree(parser)); } } class MyLexer extends Lexer { public static int PLUS = 1; public static int MULT = 2; public static int INT = 3; public MyLexer(CharStream input) { super(input); } public Token nextToken() { if (_input.LA(1) == '+') { consume(); return new CommonToken(PLUS, "+"); } else if (_input.LA(1) == '*') { consume(); return new CommonToken(MULT, "*"); } else if (_input.LA(1) >= '0' && _input.LA(1) <= '9') { int start = _input.index(); while (_input.LA(1) >= '0' && _input.LA(1) <= '9') { consume(); } return new CommonToken(INT, _input.getText(start, _input.index() - 1)); } else { throw new RuntimeException("Invalid character: " + (char)_input.LA(1)); } } } class MyParser extends Parser { public MyParser(TokenStream input) { super(input); } public ParseTree expr() { ParseTree left = term(); while (true) { if (match(MyLexer.PLUS)) { ParseTree right = term(); left = new PlusExpr(left, right); } else { break; } } return left; } public ParseTree term() { ParseTree left = factor(); while (true) { if (match(MyLexer.MULT)) { ParseTree right = factor(); left = new MultExpr(left, right); } else { break; } } return left; } public ParseTree factor() { Token token = match(MyLexer.INT); return new IntExpr(Integer.parseInt(token.getText())); } public Token match(int type) { Token token = _input.LT(1); if (token.getType() == type) { consume(); return token; } else { throw new RuntimeException("Expecting " + getTokenName(type) + "; found " + token.getText()); } } } abstract class Expr extends RuleContext { public abstract int eval(); } class PlusExpr extends Expr { private ParseTree left; private ParseTree right; public PlusExpr(ParseTree left, ParseTree right) { this.left = left; this.right = right; } public int eval() { return ((Expr)left).eval() + ((Expr)right).eval(); } public String toString() { return "(" + left.toString() + " + " + right.toString() + ")"; } } class MultExpr extends Expr { private ParseTree left; private ParseTree right; public MultExpr(ParseTree left, ParseTree right) { this.left = left; this.right = right; } public int eval() { return ((Expr)left).eval() * ((Expr)right).eval(); } public String toString() { return "(" + left.toString() + " * " + right.toString() + ")"; } } class IntExpr extends Expr { private int value; public IntExpr(int value) { this.value = value; } public int eval() { return value; } public String toString() { return Integer.toString(value); } } ``` 这段代码实现了一个简单的四则运算解析器,可以识别表达式中的加号、乘号和整数,并计算表达式的值。您可以根据自己的需求修改代码来实现自己的lr(0)语法分析器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值