LL(1)实现

实验三LL(1)分析法实现(4学时)

一、题目:根据LL(1)分析法控制程序:

和文法:

所对应LL(1)分析表:

编程实现LL(1)分析程序,并输出符号串:a= bac #的分析过程。

二、源程序及运行结果截图

import java.util.*;

public class LL1 {
    public static void main(String[] args) {

        final int Z=0;
        final int A=1;
        final int a=0;
        final int b=1;
        final int c=2;
        final int d=3;
        final int E=4;//此处E代表#号
        Scanner scanner = new Scanner(System.in);
        String s = new String();
        s=scanner.nextLine();
        String[] []LLt = {{"","bAc","","dAZ",""},{"aA","","","",""}};//LL(1)分析表

        Stack<Character> stack = new Stack<Character>();

        stack.push('E');
        stack.push('Z');
        System.out.println();

        int j=0;
        String t;

        System.out.println("栈"+"\t"+"当前符号"+"\t"+"剩余序列"+"\t"+"栈操作");

        while (true){

            if (j==s.length())break;

            if (stack.peek() =='Z'){//若栈顶为终结符,出栈并进行归约
                for (char l://查看栈中当前元素
                        stack) {
                    System.out.print(l);

                }
                System.out.print("\t"+s.charAt(j)+"\t\t");
                for (int i=j+1;i<s.length();i++){
                    System.out.print(s.charAt(i));
                }


                if (s.charAt(j)=='a'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][a]);

                    t=stringReverse(LLt[Z][a]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                } else if (s.charAt(j) == 'b') {
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][b]);

                    t=stringReverse(LLt[Z][b]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                }else if (s.charAt(j)=='c'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][c]);

                    t=stringReverse(LLt[Z][c]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                }else if(s.charAt(j)=='d'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][d]);

                    t=stringReverse(LLt[Z][d]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                }else if (s.charAt(j)=='E'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[Z][E]);

                    t=stringReverse(LLt[Z][E]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;                }
            }else if(stack.peek()=='A'){//若栈顶为终结符,出栈并进行归约
                for (char l://查看栈中当前元素
                        stack) {
                    System.out.print(l);

                }
                System.out.print("\t"+s.charAt(j)+"\t\t");
                for (int i=j+1;i<s.length();i++){
                    System.out.print(s.charAt(i));
                }


                if (s.charAt(j)=='a'){//查表
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[A][a]);

                    t=stringReverse(LLt[A][a]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                } else if (s.charAt(j) == 'b') {
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");

                    stack.pop();

                    for (char l://查看栈中当前元素
                            stack) {
                        System.out.print(l);

                    }
                    continue;
                }else if (s.charAt(j)=='c'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");

                    stack.pop();

                    continue;
                }else if(s.charAt(j)=='d'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+"ε");

                    stack.pop();

                    continue;
                }else if (s.charAt(j)=='E'){
                    System.out.println("\t\t"+"选择"+stack.peek()+"->"+LLt[A][E]);

                    t=stringReverse(LLt[A][E]);//将数组逆序

                    stack.pop();
                    for (int i=0;i<t.length();i++){
                        stack.push(t.charAt(i));//入栈
                    }

                    continue;
                }
            }else if(stack.peek().equals(s.charAt(j))&&stack.peek()!='E'){//匹配成功栈顶元素出栈并读取下一个子符
                for (char l://查看栈中当前元素
                        stack) {
                    System.out.print(l);
                }
                if (stack.peek()=='c'){
                    System.out.print("\t"+s.charAt(j)+"\t\t");
                }
                else System.out.print(""+s.charAt(j)+"\t\t");
                for (int i=j+1;i<s.length();i++){
                    System.out.print(s.charAt(i));
                }
                System.out.println("\t\t"+"匹配"+ stack.peek());
                stack.pop();
                j++;
                continue;
            }else if (stack.peek()=='E'){
                for (char l://查看栈中当前元素
                        stack) {
                    System.out.print(l);
                }

                System.out.print("\t"+s.charAt(j)+"\t\t");
                for (int i=j+1;i<s.length();i++){
                    System.out.print(s.charAt(i));
                }
                System.out.println("\t\t"+"正确结束");
                stack.pop();
                j++;
                continue;
            }
            else {
                System.out.println("错误!");
                System.exit(0);
            }

        }



    }

    public static String stringReverse(String s) {// 字符串逆序输出方法
        String s1 = "";//接收新的逆序字符串
        for (int i = s.length() - 1; i >= 0; i--) {//从后往前
            String c = s.charAt(i) + "";//获取每个字符并转化为字符串
            s1 += c;
        }
        return s1;
    }

}

运行结果:

posted @ 2021-06-06 12:51  乐茶茶  阅读(276)  评论(0编辑  收藏  举报