编译原理LR文法,可直接运行!

这里是代码部分,可直接运行!下面还有运行代码

package jlesson;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.util.List;

public class LR1_Synax {
    public static String pu = "";
    protected ArrayList<node> analy = new ArrayList<>();
    protected ArrayList<node1> FirstSet = new ArrayList<>();
    protected ArrayList<node2> CLOSURE = new ArrayList<>(); 
    protected List<Character> ter_copy = new ArrayList<>();
    protected List<Character> ter_colt = new ArrayList<>(); 
    protected List<Character> non_colt = new ArrayList<>(); 
    protected Vector<Character> char_stack = new Vector<>();  
    protected Vector<Character> sur_str = new Vector<>(); 
    protected Vector<Integer>   int_stack = new Vector<>(); 
    protected List<Character> colt = new ArrayList<>();   
    protected char[][] Go;    //关系矩阵
    protected String[][] PTable; //分析表
    public static void main(String []arg) throws IOException{
 /*   FilereadUtil fr = new FilereadUtil();
    List<String> list = new ArrayList<>();
    List<Character> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();
    list = fr.Read("D:\\ProgramCode\\Java\\LR1_Synax\\test2.txt");
    SyntaxUtil util = new SyntaxUtil();
    util.Util(list);
    list1 = util.GetNon();
    if(util.Judge(list)){
        list2=util.Remove(list,list1);
        util.Util(list2);
        util.Con_First();
        util.Huifu();
        util.Util(list);
        util.Get_colt();
        util.Relation();
        util.Construc();
        util.Parser_Table();
        util.show();
        String s = "i+i#";
        util.AnalyStack(s);
    }else {
        util.Con_First();
        util.Get_colt();
        util.Relation();
        util.Construc();
        util.Parser_Table();
        util.show();
        String s = "aabab#";
        util.AnalyStack(s);
    }*/
        MyFrame my =new MyFrame("LR(1)分析器");
}
}
//结构体
class node{          //用于方便查找产生式的左部与右部
    public char left;
    public String right;
    public node(char left,String right){
        this.left=left;
        this.right=right;
    }
}
class node1{         //用于存放First集
    public List<Character> Se = new ArrayList<>();
   // public  node1(){}
    public void add(char ch){
        this.Se.add(ch);
    }
}
class node2{         //用于存放每个项目集
    public List<String> St = new ArrayList<>();
    public void add(String str){this.St.add(str);}
}
//文法处理类
class SyntaxUtil extends LR1_Synax {
    //确定非终结符
    public boolean IsNotsymbols(char ch) {
        if (ch >= 'A' && ch <= 'Z') return true;
        else return false;
    }
    //获取字符在非终结符表的下标
    public int Get_nindex(char temp) {
        for (int i = 0; i < non_colt.size(); i++) {
            if (temp == non_colt.get(i)) return i;
        }
        return -1;
    }
    //获取所有的文法符号集合,便于写GO函数
    public void Get_colt(){

        for(int i = 0;i<non_colt.size();i++){
            colt.add(non_colt.get(i));
        }
        for(int i = 0;i<ter_copy.size();i++){
            colt.add(ter_copy.get(i));
        }

    }
    //初始化关系关系矩阵
    public void Relation(){
        Go = new char[100][100];
        for(int i=0;i<100;i++)
            for(int j=0;j<100;j++){
            Go[i][j] = '!';
            }
    }
    //获取每个非终结符的First集
    public void Get_first(char temp) {
        int tag = 0;
        int flag = 0;
        for (int i = 0; i < analy.size(); i++) {
            if (analy.get(i).left == temp) {   //匹配产生式左部
                if (!IsNotsymbols(analy.get(i).right.charAt(0)))   //如果右部第一个字符是终结符,直接加入first集
                    FirstSet.get(Get_nindex(temp)).add(analy.get(i).right.charAt(0));
                else {
                    for (int j = 0; j < analy.get(i).right.length(); j++) {
                        if (!IsNotsymbols(analy.get(i).right.charAt(j)))  //直到寻找到终结符为止
                        {
                            FirstSet.get(Get_nindex(temp)).add(analy.get(i).right.charAt(j));
                            break;
                        }
                        Get_first(analy.get(i).right.charAt(j));  //右部递归寻找
                        Iterator it2 = FirstSet.get(Get_nindex(analy.get(i).right.charAt(j))).Se.iterator();
                        while (it2.hasNext()) {
                            char next = (char) it2.next();
                            if (next == '$') flag = 1;
                            else {
                                FirstSet.get(Get_nindex(temp)).add(next);  //将FIRST(Y)中的非$就加入FIRST(X)
                            }
                        }
                        if (flag == 0) break;
                        else {
                            tag = tag + flag;
                            flag = 0;
                        }
                    }
                    if (tag == analy.get(i).right.length())
                        FirstSet.get(Get_nindex(temp)).add('$');  //所有右部first(Y)都有$,将$加入FIRST(X)中
                }
            }
        }
    }
    //判定左递归
    public boolean Judge(List<String> list){
         ArrayList<node> analy = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            node aa = new node(list.get(i).charAt(0),list.get(i).substring(3));
            analy.add(aa);
        }
        for(int i=0;i<analy.size();i++){
            if(analy.get(i).left == analy.get(i).right.charAt(0)){   //当产生式的左部等于右部第一个符号,则具有左递归
                return true;
            }
        }
        return false;
    }
    //消除左递归
    public List<String> Remove(List<String> list1,List<Character> list2){
        List<String> temp1 = new ArrayList<>();  //保存消除了左递归的新的List
        ArrayList<node> analy = new ArrayList<>();
        List<Character> ch = new ArrayList<>();  //保存已经使用了的字母
        List<Character> List2 = list2;          //继承参数的内容(非终结符集)
        for (int i = 0; i < list1.size(); i++) {
            node aa = new node(list1.get(i).charAt(0),list1.get(i).substring(3));
            analy.add(aa);
        }
        for(int i=0;i<analy.size();i++){   //遍历所有产生式
            if(analy.get(i).left == analy.get(i).right.charAt(0)){   //当发现左部等于右部第一个符号
                ch.add(analy.get(i).left);                           //对该左部字母进行保存
                for(int j=0;j<analy.size();j++){                     //寻找该字母的另一个产生式,以便寻找P->βP'的β
                    if((analy.get(j).left == analy.get(i).left)){
                        if (analy.get(j).left != analy.get(j).right.charAt(0)){
                        for(char k='A';k<='Z';k++){                 //遍历字母集,寻找可以替代的字母
                            int flag =0;
                            Iterator it = List2.iterator();
                            while (it.hasNext()){
                                char t =(char)it.next();
                                if(k == t){
                                    flag = 1;                       //当该字母在原来的非终结符集有了,置flag=1
                                }
                            }
                            if(flag == 0) {                       //如果该字母没有使用过,就按照消除左递归的方法设定新的产生式
                                String str1 = analy.get(i).left + "->" + analy.get(j).right.charAt(0) + k;
                                String str2 = k + "->" + analy.get(i).right.substring(1) + k;
                                String str3 = k + "->" + '$';
                                List2.add(k);          //将该字母加入非终结符集合
                                temp1.add(str1);
                                temp1.add(str2);
                                temp1.add(str3);
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
        for (int i =0;i<analy.size();i++){     //对于原来的产生式,将没有左递归的产生式加入新的List
            int flag =0;
            Iterator it = ch.iterator();
            while (it.hasNext()){                //如果原来产生式的左部在ch链表中,则证明该符号具有左递归,置flag=1
                char t =(char)it.next();
                if(analy.get(i).left == t){
                    flag = 1;
                }
            }
            if(flag == 0){                      //如果没有出现,加入新链表
                String str1 = analy.get(i).left+"->"+analy.get(i).right;
                temp1.add(str1);
            }
        }
        return temp1;
    }
    //对输入文法进行解析,获取全部终结符,非终结符
    public void Util(List<String> list) {
        analy.clear();      //当具有左递归时,所有的集合要进行清除
        non_colt.clear();
        ter_colt.clear();
        ter_copy.clear();
        for (int i = 0; i < list.size(); i++) {
            node aa = new node(list.get(i).charAt(0),list.get(i).substring(3));
            analy.add(aa);
        }
        for (int index = 0; index < list.size(); index++) {
            String temp = analy.get(index).left + analy.get(index).right;
            for (int i = 0; i < temp.length(); i++) {
                if (IsNotsymbols(temp.charAt(i))) { //如果是非终结符
                    int flag = 0;
                    for (int j = 0; j < non_colt.size(); j++) {   //遍历非终结符链表
                        if (non_colt.get(j) == temp.charAt(i))  //如果已经存在,将flag置为1
                        {
                            flag = 1;
                            break;
                        }
                    }
                    if (flag == 0) non_colt.add(temp.charAt(i)); //如果不存在,添加
                } else {                            //如果是终结符
                    int flag = 0;
                    for (int j = 0; j < ter_colt.size(); j++) {
                        if (ter_colt.get(j) == temp.charAt(i)) {
                            flag = 1;
                            break;
                        }
                    }
                    if (flag == 0) ter_colt.add(temp.charAt(i));
                }
            }
        }
        ter_colt.add('#'); //终结符表最后添加“#”
        for (int i = 0; i<ter_colt.size(); i++)  //构造去$终结符集合
        {
            if (ter_colt.get(i) != '$')
                ter_copy.add(ter_colt.get(i));
        }
    }
    //构造当前文法的First集
    public void Con_First() {
        for (int i = 0; i<non_colt.size(); i++)    //根据非终结符数量确定First集合链表的长度
        {   node1 bb =new node1();
            FirstSet.add(bb);
        }
        for (int i=0;i<non_colt.size();i++){      //对于每一个非终结符求First集合
            Get_first(non_colt.get(i));
        }
        for (int i = 0; i < non_colt.size(); i++) {      //由于存放每个非终结符的First的是List链表,会有重复,所以采用Set容器,进行一个过滤
            Set<Character> s1 = new TreeSet<>();
            Iterator it = FirstSet.get(i).Se.iterator();
            while (it.hasNext()) {
                s1.add((char) it.next());
            }
            FirstSet.get(i).Se.clear();
            Iterator it1 = s1.iterator();
            while (it1.hasNext()) {
                char t = (char) it1.next();
                FirstSet.get(i).Se.add(t);
            }
        }
    }
    //供外部获取非终结符集合
    public List<Character> GetNon(){
        return non_colt;
    }
    //求CLOSURE函数
    public void Closure(String str) {
        Iterator it = CLOSURE.get(CLOSURE.size() - 1).St.iterator();
        int flag = 0;
        while (it.hasNext()) {                         //对于送进来的产生式进行检测,是否在当前项目集
            String s = String.valueOf(it.next());
            if (s.equals(str)) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) {        //如果不在,添加
                CLOSURE.get(CLOSURE.size() - 1).add(str);   //添加该产生式,并且寻找是否需要根据该产生式对当前项目集进行扩充
                int temp2 = CLOSURE.get(CLOSURE.size() - 1).St.get(CLOSURE.get(CLOSURE.size() - 1).St.size() - 1).indexOf('.');   //确定'.'的位置
                int temp3 = CLOSURE.get(CLOSURE.size() - 1).St.get(CLOSURE.get(CLOSURE.size() - 1).St.size() - 1).indexOf(',');   //确定','的位置
                char ch1 = CLOSURE.get(CLOSURE.size() - 1).St.get(CLOSURE.get(CLOSURE.size() - 1).St.size() - 1).charAt(temp2 + 1); //记录'.’后面的字符
                char ch2 = CLOSURE.get(CLOSURE.size() - 1).St.get(CLOSURE.get(CLOSURE.size() - 1).St.size() - 1).charAt(temp2 + 2); //记录'.'后面第二个的字符
                String temp4 = CLOSURE.get(CLOSURE.size() - 1).St.get(CLOSURE.get(CLOSURE.size() - 1).St.size() - 1).substring(temp3+1); //保存当前产生式的展望符
                if (IsNotsymbols(ch1)) {      //当点后面的是非终结符
                    if (ch2 == ',') {          //如果非终结符后面没有字符
                        for (int i = 0; i < analy.size(); i++) {
                            if (analy.get(i).left == ch1) {
                                String s1 = analy.get(i).left + "->" + '.' + analy.get(i).right + ',' + temp4;  //新的产生式的展望符为原产生式的展望符
                                Closure(s1);
                            }
                        }
                    } else if (IsNotsymbols(ch2)) {      //当非终结符后面为非终结符A
                        int flag1 = 0;
                        Iterator it1 = FirstSet.get(Get_nindex(ch2)).Se.iterator();  //先检测A的First集有没有$
                        while (it1.hasNext()) {
                            char c = (char) it1.next();
                            if (c == '$') {
                                flag1 = 1;
                                break;
                            }
                        }
                        if (flag1 == 0) {            //如果没有$,对于每一个新发现产生式的展望符设定为first集
                            for (int i = 0; i < analy.size(); i++) {
                                if (analy.get(i).left == ch1) {
                                    Iterator it2 = FirstSet.get(Get_nindex(ch2)).Se.iterator();
                                    while (it2.hasNext()) {
                                        char c = (char) it2.next();
                                        String s1 = analy.get(i).left + "->" + '.' + analy.get(i).right + ',' + c;
                                        Closure(s1);
                                    }
                                }
                            }
                        }
                    }else if(!IsNotsymbols(ch2)){   //当非终结符后面是终结符
                        for (node node : analy) {
                            if (node.left == ch1) {
                                String s1 = node.left + "->" + '.' + node.right + ',' + ch2;
                                Closure(s1);
                            }
                        }
                      }
                }
            }
        }
//GO函数
 public void GO(node2 no,char X){
      Iterator it = no.St.iterator();
      while (it.hasNext()){//检测是否存在A->α.Xβ
            String te = String.valueOf(it.next());
            if(te.charAt(te.indexOf('.')+1) == X){    //如果存在
                  int flag = 0;
                  char[] cha = te.toCharArray();  //交换点的位置
                  char c =cha[te.indexOf('.')];
                  cha[te.indexOf('.')] = cha[te.indexOf('.')+1];
                  cha[te.indexOf('.')+1] = c;
                  String s1 = te.valueOf(cha);
                  for(int j=CLOSURE.size()-1;j>=0;j--){
                      Iterator it1=CLOSURE.get(j).St.iterator();
                      while (it1.hasNext()){
                          String te1 = String.valueOf(it1.next());
                          if(s1.equals(te1)){       //对于新的产生式,检测是否在其它项目集中已经存在
                              flag = 1;
                              Go[CLOSURE.indexOf(no)][j] = X;  //如果存在,则将当前项目集至含有该产生式的项目集的关系矩阵置为对应的X
                              break;
                          }
                      }
                      if(flag == 1) break;       //停止遍历
                  }
                  if(flag == 0){                //如果没有在其它项目集中存在
                          String s2 = te.substring(0,te.indexOf(','));
                          node2 aa = new node2();
                          CLOSURE.add(aa);
                          int in2 = CLOSURE.size()-1;
                          Go[CLOSURE.indexOf(no)][in2] = X;
                          Iterator tt = no.St.iterator();
                          while (tt.hasNext()){               //对该项目集中所有.后面字符为X的产生式
                              String s = String.valueOf(tt.next());
                              if(s2.charAt(s2.indexOf('.')+1) == s.charAt(s.indexOf('.')+1)) {
                                  char[] cha1 = s.toCharArray();  //交换点的位置
                                  char c1 =cha1[s.indexOf('.')];
                                  cha1[s.indexOf('.')] = cha1[s.indexOf('.')+1];
                                  cha1[s.indexOf('.')+1] = c1;
                                  String sss = s.valueOf(cha1);
                                  Closure(sss);
                              }
                          }
                  }
            }
      }
 }
//构造项目集
    public void Construc(){
     node2 bb =new node2();    //添加初始的初态产生式
     CLOSURE.add(bb);
     String st = 'Z'+"->"+'.'+non_colt.get(0)+','+'#';
     Closure(st);
       for(int i=0;i<CLOSURE.size();i++){    //CLOSURE.size()是动态变大的,当遍历到最后一个,则所有的项目集构造完毕//
         for(int j=0;j<colt.size();j++){
            // System.out.println(i+" "+j+" 00");
             GO(CLOSURE.get(i),colt.get(j));
         }
       }
    }
    //构造分析表
    public void Parser_Table(){
        PTable =new String[100][100];
        for(int i=0;i<100;i++){
            for(int j=0;j<100;j++){
                PTable[i][j] = "!";               //初始化分析表
            }
        }
        for(int k =0;k<CLOSURE.size();k++){
            for(int h=0;h<colt.size();h++){
                if(IsNotsymbols(colt.get(h))){         //对于非终结符
                    Iterator it = CLOSURE.get(k).St.iterator();
                    while (it.hasNext()){
                        String str = String.valueOf(it.next());
                        char ch = str.charAt(str.indexOf('.')+1);     //记录每个项目集的每个产生式.后面的字符
                        if(colt.get(h) == ch){                            //当.后面的而字符等于该字符
                            for(int j=0;j<CLOSURE.size();j++){        //遍历Go关系矩阵中以该项目集为起点的元素
                                if(Go[k][j] == ch){                   //当发现终点
                                    PTable[k][h] = String.valueOf(j); //令Goto = 终点
                                    break;
                                }
                            }
                            break;   //停止该项目集的产生式遍历
                        }
                    }
                }else{                                                   //当检测符号是非终结符
                    Iterator it = CLOSURE.get(k).St.iterator();
                    while (it.hasNext()){
                        String str = String.valueOf(it.next());
                        char ch1 = str.charAt(str.indexOf('.')+1);      //记录.后面的字符
                        char ch2 = str.charAt(str.indexOf('.')-1);      //记录.前面的字符
                        char ch3 = str.charAt(str.indexOf(',')+1);      //记录,后面的展望符
                        if((ch2 == colt.get(0)) && (colt.get(h) == '#') && (str.charAt(0) == 'Z')){       //当产生式为S'->S.,#,分析结束,令相应位置为Acc
                                String s ="Acc";
                                PTable[k][h] = s;
                                break;
                        }else {
                            if((ch1 == ',') && (ch3 == colt.get(h))){      //当产生式为A->α.,a,采用规约动作
                                for(int i=0;i<analy.size();i++){
                                    String s = str.substring(str.indexOf('>')+1,str.indexOf('.'));
                                    if((str.charAt(0) == analy.get(i).left) && (s.equals(analy.get(i).right))){   //对产生式进行遍历,寻找对应规约产生式
                                        String st = 'r'+String.valueOf(i+1);
                                        PTable[k][h] = st;
                                        break;
                                    }
                                }
                            }else {                                             //当产生式为A->α.aβ,b
                                if(ch1 == colt.get(h)){
                                    for(int j=0;j<CLOSURE.size();j++){
                                        if(Go[k][j] == ch1){                    //对关系矩阵遍历,寻找转化的状态
                                            String st = 's'+String.valueOf(j);
                                            PTable[k][h] = st;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    //格式化输出函数
    public String format(String s){
        String out = s;
        int i = s.length();
        while(i<=10){
            out += " ";
            i++;
        }
        return out;
    }
    //分析字符串函数
    public void AnalyStack(String s){
        int in = 0;
        int in1 = 0;
        int in2 =0;
        int in3 =0;
        for(int i=s.length()-1;i>=0;i--){
            sur_str.add(s.charAt(i));
        }
        char_stack.add('#');
        int_stack.add(0);
        System.out.print("步骤      状态栈    符号栈    剩余输入串    动作"+"\n");
        pu += "步骤      状态栈    符号栈    剩余输入串    动作"+"\n";   //
        while (sur_str.size() > 0){
            System.out.print(format(String.valueOf(in)));
            pu += format(String.valueOf(in));//
            String temp = "";
             for(int j=0;j<int_stack.size();j++){
                temp =temp+String.valueOf(int_stack.get(j))+"|";
            }
            System.out.print(format(temp));
            pu += format(temp);//
            temp = "";
            for(int j=0;j<char_stack.size();j++){
                temp += char_stack.get(j);
            }
            System.out.print(format(temp));
            pu += format(temp);
            temp = "";
            for(int j=sur_str.size()-1;j>=0;j--){
                temp += sur_str.get(j);
            }
            System.out.print(format(temp));
            pu += format(temp);
            int in4 = int_stack.get(int_stack.size()-1);
            char ch = sur_str.get(sur_str.size()-1);
            for (int i=0;i<colt.size();i++){
                if(ch == colt.get(i)) in1 =i;
            }
            String st = PTable[in4][in1];
            if(st.charAt(0) == 's'){
                String tt = String.valueOf(st.charAt(1));
                int_stack.add(Integer.parseInt(tt));
                char_stack.add(sur_str.get(sur_str.size()-1));
                sur_str.remove(sur_str.size()-1);
                System.out.print(format("状态"+int_stack.get(int_stack.size()-1)+"入栈"));
                pu += format("状态"+int_stack.get(int_stack.size()-1)+"入栈");
            }
            if(st.charAt(0) == 'r'){
                String tt = String.valueOf(st.charAt(1));
               int in5 = Integer.parseInt(tt)-1;
               for(int i=0;i<analy.get(in5).right.length();i++){
                   char_stack.remove(char_stack.size()-1);
                   int_stack.remove(int_stack.size()-1);
               }
                char_stack.add(analy.get(in5).left);
                for (int i=0;i<colt.size();i++){
                    if(char_stack.get(char_stack.size()-1) == colt.get(i)){
                        in2 = i;
                    }
                }
                int_stack.add(Integer.parseInt(PTable[int_stack.get(int_stack.size()-1)][in2]));
                System.out.print(format(analy.get(in5).left+"->"+analy.get(in5).right+"规约"));
                pu += format(analy.get(in5).left+"->"+analy.get(in5).right+"规约");
            }
            if(st.equals("!")) {
                System.out.print(format("Error!!!"));
                pu += format("Error!!!");
                break;
            }
            for(int i=0;i<colt.size();i++){
                if(colt.get(i) == '#') in3 = i;
            }
            char cc = char_stack.get(char_stack.size()-1);
            char ss = sur_str.get(sur_str.size()-1);
            if(PTable[int_stack.get(int_stack.size()-1)][in3].equals("Acc") && (cc == non_colt.get(0)) && (ss == '#')){
                System.out.println();
                System.out.print(format(String.valueOf(in+1)));
                pu += "\n"+format(String.valueOf(in+1));
                String temp1 = "";
                for(int j=0;j<int_stack.size();j++){
                    temp1 =temp1+String.valueOf(int_stack.get(j))+"|";
                }
                System.out.print(format(temp1));
                pu += format(temp1);//
                temp1 = "";
                for(int j=0;j<char_stack.size();j++){
                    temp1 += char_stack.get(j);
                }
                System.out.print(format(temp1));
                pu += format(temp1);//
                temp1 = "";
                for(int j=sur_str.size()-1;j>=0;j--){
                    temp1 += sur_str.get(j);
                }
                System.out.print(format(temp1)+format("Success"));
                pu += format(temp1)+format("Success");
                break;
            }
            in +=1;
            System.out.println();
            pu += "\n";
        }
    }
    public void Huifu(){
        ArrayList<node1> temp = new ArrayList<>();
        for(int i=0;i<FirstSet.size();i++){
            int flag = 0;
            Iterator it = FirstSet.get(i).Se.iterator();
            while (it.hasNext()){
                char ch = (char)it.next();
                if(ch == '$'){
                    flag = 1;
                    break;
                }
            }
            if(flag == 0){
                node1 aa = new node1();
                temp.add(aa);
                Iterator it1 = FirstSet.get(i).Se.iterator();
                while (it1.hasNext()){
                    char ch = (char)it1.next();
                    temp.get(temp.size()-1).add(ch);
                }
            }
        }
        FirstSet.clear();
        System.out.println(temp.size());
        for (int i=0;i<temp.size();i++){
            node1 bb =new node1();
            FirstSet.add(bb);
            Iterator it = temp.get(i).Se.iterator();
            while (it.hasNext()){
                char ch1 =(char)it.next();
                FirstSet.get(FirstSet.size()-1).Se.add(ch1);
            }
        }
    }
    //显示函数
    public void show(){
        //显示项目集
       for(int i=0;i<CLOSURE.size();i++){
           Iterator it = CLOSURE.get(i).St.iterator();
           while (it.hasNext()){
               String ss = String.valueOf(it.next());
               System.out.println(ss);
               pu += ss+"\n";
           }
           System.out.println();
           pu += "\n";
       }
       //显示分析表
        System.out.println("\t"+"\t"+"Goto"+"\t"+"Action");
        System.out.print("状态"+"\t");
        pu += "\t"+"\t"+"Goto"+"\t"+"Action"+"\n";
        pu += "状态"+"\t";
        for(int i=0;i<colt.size();i++){
            System.out.print(colt.get(i)+"\t");
            pu += colt.get(i)+"\t";
        }
        pu += "\n";
        System.out.println();
        for(int i=0;i<CLOSURE.size();i++){
            System.out.print(i+":"+"\t");
            pu += i+":"+"\t";
            for(int j=0;j<colt.size();j++){
                System.out.print("\t"+PTable[i][j]);
                pu += "\t"+PTable[i][j];
            }
            System.out.println();
            pu += "\n";
        }
    }
}
//文件读取类
class FilereadUtil {
    public List<String> Read(String filename) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        String s;
        List<String> list = new ArrayList<>();
        while ((s = in.readLine()) != null) list.add(s);
        in.close();
        return list;
    }
}
//界面化
class MyFrame extends JFrame {
    JLabel lable;
    JButton button1, button2;
    JTextField tf1;
    JTextArea ta;

    MyFrame(String s) {//构造函数
        super(s);
        lable = new JLabel("请输入分析字符串:");
        lable.setBounds(15, 5, 100, 30);
        tf1 = new JTextField(15);
        tf1.setBounds(85, 45, 260, 30);
        button1 = new JButton("语法分析");
        button1.setBounds(370, 45, 100, 30);
        ButtonListener b1 = new ButtonListener();
        button1.addActionListener(b1);//设置监听器
        ta = new JTextArea();
        ta.setFont(new Font("宋体",Font.PLAIN,20));
        JScrollPane jsp = new JScrollPane(ta);//滚动条设置
        jsp.setBounds(15, 105, 650, 350);
        button2 = new JButton("退出");
        button2.setBounds(370, 500, 100, 30);
        ButtonListener b2 = new ButtonListener();
        button2.addActionListener(b2);
        Container window1 = this.getContentPane();
        window1.setLayout(null);//不进行布局设置
        window1.add(lable);
        window1.add(tf1);
        window1.add(button1);
        window1.add(button2);
        window1.add(jsp);
        this.setSize(800, 600);//设置大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//可关闭
        this.setVisible(true);//设置可见
    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == button1) {
                FilereadUtil fr = new FilereadUtil();
                List<String> list = new ArrayList<>();
                List<Character> list1 = new ArrayList<>();
                List<String> list2 = new ArrayList<>();
                try {
                    list = fr.Read("D:\\新建文件夹\\test1.txt");
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                SyntaxUtil util = new SyntaxUtil();
                util.Util(list);
                list1 = util.GetNon();
                if (util.Judge(list)) {
                    list2 = util.Remove(list, list1);
                    util.Util(list2);
                    util.Con_First();
                    util.Huifu();
                    util.Util(list);
                    util.Get_colt();
                    util.Relation();
                    util.Construc();
                    util.Parser_Table();
                    util.show();
                   // String s = "i+i#";
                    util.AnalyStack(tf1.getText());
                    ta.append(util.pu);
                } else {
                    util.Con_First();
                    util.Get_colt();
                    util.Relation();
                    util.Construc();
                    util.Parser_Table();
                    util.show();
                   // String s = "aabab#";
                    util.AnalyStack(tf1.getText());
                    ta.append(util.pu);
                }
            }
                if (e.getSource() == button2) {
                    System.exit(0);
                }
        }
    }
}

这里是运行的代码 

E->E+T
E->T
T->T*F
T->F
F->(E)
F->i

可直接运行!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值