编译原理实验-文法类型分析

public class Test1 {
    public static void main(String[] args) {
        /*Scanner scanner = new Scanner(System.in);  
        System.out.println("请输入文法产生式的个数:");  
        int  n = scanner.nextInt();  
        String inputCss;  
        CSS[] p = new CSS[n];  

        for (int k = 0; k < p.length; k++) {  
            inputCss = scanner.next();  
            String temp = inputCss.trim();  
            p[k] = new CSS();  
            p[k].left = inputCss.split("->")[0];  
            p[k].right = temp.split("->")[1];  
        }  
        scanner.close(); 
        pd(p);*/

        StringBuffer token=new StringBuffer();//存放形参的单词
        char[] s={'a','b','c'};
        for(int i=0;i<s.length;i++){
            token.append(s[i]);
        }
        System.out.println(token.toString());

    }
    //判断
    public static  void pd(CSS[] p){
        if(type0(p)){
            if(type1(p)){
                if(type2(p)){
                    if(type3(p)){
                        System.out.println("该文法属于3型文法");
                    }else{
                        System.out.println("该文法是2型文法");
                    }           
                }else{
                    System.out.println("该文法是1型文法");
                }       
            }else{
                System.out.println("该文法是0型文法"); 
            }
        }else{
            System.out.println("该文法不是0型文法");
        }

    }
    //左部不为空:左部至少含非终结符
     public static boolean type0(CSS[] p) {  
            int i, j;  
            for (i = 0; i < p.length; i++){  
                for (j = 0; j < p[i].left.length(); j++){ 
                    //不含有非终结符时  
                    if (p[i].left.charAt(j) >= 'A'&&p[i].left.charAt(j) <= 'Z') 
                        break;  
                }  
                //该产生式右部没有非终结符
                if (j == p[i].left.length()) {  
                    //System.out.println("该文法不是0型文法");  
                    return false;  
                }  
            } 
            // 如果每个产生时都能找到非终结符  
            if (i == p.length){
                   return true;
            }
            return false;  
        }  
        //右部大于左部
        public static boolean type1(CSS[] p) { 
                int i; 
                for (i = 0; i < p.length; i++) {  
                    //若右部不大于左部  
                    if ((p[i].left.length() > p[i].right.length())&& p[i].right.length() != 0) 
                        break;  
                }  
                if (i == p.length){
                    return true;  
                }else {  
                    //System.out.println("0型文法");  
                    return false;  
                }   
        }  
        //左部只能有一个非终结符
        public static boolean type2(CSS[] p) {  
                int i;
                for (i = 0; i < p.length; i++){  
                    if ((p[i].left.length() != 1)|| !(p[i].left.charAt(0) >= 'A' && p[i].left.charAt(0) <= 'Z'))  
                        break;  
                }  
                if (i == p.length)  
                    return true;  
                else {  
                 return false;  
                }  
        }  
        //右部含非终结符
        public static boolean type3(CSS[] p){  
                int i;    
                for (i = 0; i < p.length; i++){  
                    if ((p[i].right.length() == 0)|| (p[i].right.length() >= 3)|| (p[i].right.charAt(0) >= 'A' && p[i].right.charAt(0) <= 'Z')) // 判断产生式右部字符个数是否在12之间,判断右部第一个字符是否是非终结符  
                        break;  
                }  
                if (i == p.length) {  
                        for (i = 0; i < p.length; i++) {  
                            if (p[i].right.length() == 2) {  
                                if (!(p[i].right.charAt(1) >= 'A' && p[i].right.charAt(1) <= 'Z'))  
                                    break;  
                            }  
                        }  
                        if (i == p.length) {                       
                            return true;
                        } else {                         
                            return false;
                        }               
                } else{
                         return false;
                }       
         }

}
//产生式
class CSS {  
    String left;  
    String right;  
    CSS() {  
        left = new String();  
        right = new String();  
    }  
}  

/*
 * 请输入文法产生式的个数:
    1
    A->aA
    该文法属于3型文法
      
    请输入文法产生式的个数:
    1
    A->S
    该文法是2型文法

    请输入文法产生式的个数:
    1
    aAb->ayb
    该文法是1型文法

    请输入文法产生式的个数:
    1
    Aa->b
    该文法是0型文法

    请输入文法产生式的个数:
    1
     ->s
    该文法不是0型文法
*/

猜你喜欢

转载自blog.csdn.net/linkingfei/article/details/81569111