编译原理)判断文法的类型

实验内容

从文件中读取数据,判断其为0型文法、1型文法、2型文法还是3型文法,并指出其非终结集符、终结符集和开始符号。
编译原理)判断文法的类型_第1张图片

java实现

package com.wang;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
	public static void main(String[] args) {
		BufferedReader br = null;
		try{
			br = new BufferedReader(new FileReader("D://大三下//编译原理//实验一//a.txt"));//根据路径获取文本
			StringBuffer sb = new StringBuffer();
			String str = null;
			while((str = br.readLine()) != null) {//读入文本行及其内容
				sb.append(str+"\n");//添加字符串到缓冲字符串流sb中
			}
			String str1 = "::=";
			Pattern pattern = Pattern.compile(str1);//str1为用于匹配的字符串
			Matcher matcher = pattern.matcher(sb);//将整个区域与模式匹配。匹配成功返回true
			int num = 0;
			while(matcher.find()) {
				num++;
			}//统计匹配的个数
			System.out.println("(1)有 " + num+"个表达式");
			System.out.println("(2)判断文法类型:");
			Pattern p0=Pattern.compile("::=|\n");
			String[] st=p0.split(sb);
			int a=0,b=1;
			while(a<=st.length){
				while(b<=st.length){	
				    if(st[a].length()==1&&st[b].length()==2){
				    	char[] c=st[b].toCharArray();
				    	String st0=String.valueOf(c[1]);
				    	char[] c0=st0.toCharArray();
				    	for(int q=0;q='A'&&c0[q]<='Z'){
				    			System.out.println("\t"+st[a]+"::="+st[b]+" 为3型文法");
				    		}
				    		else{
				    			System.out.println("\t"+st[a]+"::="+st[b]+" 为0型文法");
				    		}
				    	}
				    	
				    	break;
				    	
				    }
				    if(st[a].length()==1&&st[b].length()==1){
				    	
				    	System.out.println("\t"+st[a]+"::="+st[b]+" 为3型文法");
				    	break;
				    }
				   
				    if(st[a].length()==1&&st[a].length()<=st[b].length()){
				    	System.out.println("\t"+st[a]+"::="+st[b]+" 为2型文法");
				    	break;
				    }
				    
				    if(st[a].length()>=1&&st[a].length()<=st[b].length()){
				    	System.out.println("\t"+st[a]+"::="+st[b]+" 为1型文法");
				    	break;
				    }
				    
				}
				a+=2;
				b+=2;
			}
			
			char[] array=new char[500];       //定义最大的数组用来存放文件中的字符
			int i=0,t,n,k;
			FileReader file=new FileReader(new File("D://大三下//编译原理//实验一//a.txt"));
			while((t=file.read())!=-1)
			{
				array[i]=(char)t;
				i++;	
			}
			n=i;
			boolean frag;
			int count1=0;
			System.out.print("(3)文法的非终结符集:");
			for(i=0;i='A'&&frag)
				{
					count1++;
					System.out.print(array[k]+" ");
				}
				
			}
			System.out.print(",共"+count1+"个");
			System.out.println();
			int count2=0;
			System.out.print("(4)文法的终结符集:");
			for(i=0;i='a'&&frag)
				{
					count2++;
					System.out.print(array[k]+" ");
				}
			}
			System.out.print(",共"+count2+"个");
			System.out.println();
			System.out.print("(5)文法的开始符号:");
			Pattern p=Pattern.compile("::=");
			String[] s=p.split(sb);
			System.out.println(s[0]);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		
		} finally {
			try {
				if(null != br) {
					//关闭资源
					br.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}	
}

实验结果

编译原理)判断文法的类型_第2张图片

你可能感兴趣的:(编译原理)判断文法的类型)