⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grammeranalysis.java

📁 编译原理的课程设计,含报告地方还行iushdfiuheohrg
💻 JAVA
字号:
import java.io.*;
class GrammerAnalysis{
	String STR[][]=new String[CifaAnalysis.sumKey][2];
	String Table[][]=new String[130][130];
	String style[]=new String[CifaAnalysis.line+1];
	char stack[]=new char[20];
	static int sp=0;

	File CifaTemp=new File("CifaTemp.txt");
	///////////////////构造方法/////////////////////////////////
	GrammerAnalysis(){
		char a,X;
		int lastLine;
		int count=0;
		/////构造预测分析表////////////////
		Table[(int)'S'][(int)'a']="A";
		Table[(int)'S'][(int)'b']="B";
		Table[(int)'S'][(int)'d']="C";
		Table[(int)'S'][(int)'f']="D";
		Table[(int)'A'][(int)'a']="af";
		Table[(int)'B'][(int)'b']="bGcD";
		Table[(int)'C'][(int)'d']="dGeD";
		Table[(int)'D'][(int)'f']="fjE";
		Table[(int)'E'][(int)'f']="FH";
		Table[(int)'E'][(int)'g']="FH";
		Table[(int)'F'][(int)'f']="f";
		Table[(int)'F'][(int)'g']="g";
		Table[(int)'G'][(int)'f']="fiE";
		Table[(int)'H'][(int)'h']="hF";
		Table[(int)'H'][(int)'#']="k";
		/////////读CifaTemp.txt临时文件////////////////
		readCifaTemp();
		for(int m=0;m<CifaAnalysis.line+1;m++)
			style[m]="Evaluate";
		/////////进行每行代码的语法分析////////////////
		for(int l=1,i=0;l<=CifaAnalysis.line&&i<CifaAnalysis.sumKey;l++){
			lastLine=i;
			System.out.println("\n@@第"+l+"行开始:@@");
			stack[0]='#';
			stack[1]='S';
			sp=1;
			while(true){
				a=STR[i][1].charAt(0);
				X=stack[sp];
				System.out.print("\n分析栈: ");
				for(int j=0;j<20;j++){
					System.out.print(stack[j]);
					if(stack[j]=='\0'){
						System.out.print("\t");
						break;
					}
				}
					
				int q=i;
				System.out.print("剩余输入串:");
				while(q<CifaAnalysis.sumKey){
					System.out.print(STR[q][1]);
					if(STR[q][1].equals("#"))break;
					if(l==5&&q==CifaAnalysis.sumKey-1)System.out.print('#');
					q++;
				}	
				//System.out.println();
				//System.out.print("i= "+i+"\t");
				
				System.out.print("\nsp="+sp+";");
				System.out.print("a= "+a+";");
				System.out.println("X= "+X);
				if(X=='H'&&a!='h'){
					System.out.println("使用产生式:H->k");
					stack[sp]='\0';
					sp--;
					continue;
				}	
				if(X>='a'&&a!='#'&&X<='k')
					if(X==a){
						i++;
						stack[sp]='\0';
						sp--;
						System.out.println("\""+a+"\"匹配");
						if(sp==0){
							i++;
							stack[sp]='\0';
							System.out.println("\n分析栈: #\t剩余输入串:#");
							//System.out.print("i= "+i);
							
								
							System.out.print("sp="+sp+";");
							System.out.print("a= #;");
							System.out.println("X= #");
							System.out.println("接受\n\n$$第"+l+"行语法正确!$$");
							count++;
							break;
						}
						
						
						continue;
						}
						else {
							System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了!");
							while(!STR[i-1][1].equals("#"))i++;
							break;
							}
					else if(X=='#')
							if(X==a){
								System.out.println("接受\n\n$$第"+l+"行语法正确了!$$");
								i++;
								count++;
								break;
								}
								else {
									System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了吧!");
									while(!STR[i-1][1].equals("#"))i++;
									break;
									}
							else if(Table[(int)X][(int)a]==null){
								System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了哈哈!");
								while(!STR[i-1][1].equals("#"))i++;
								break;
								}
									else{
										sp--;
										System.out.println("使用产生式:"+X+"->"+Table[(int)X][(int)a]);
										if(Table[(int)X][(int)a].equals("af"))
											style[l-1]="Define";
											else if(Table[(int)X][(int)a].equals("bGcD"))
												style[l-1]="Condition";
													else if(Table[(int)X][(int)a].equals("dGeD"))
														style[l-1]="Circle";
										for(int c=0;c<Table[(int)X][(int)a].length();c++){
											//System.out.println(Table[(int)X][(int)a].length());
											sp++;
											stack[sp]=Table[(int)X][(int)a].charAt(Table[(int)X][(int)a].length()-c-1);
										}
											
									}
				if(Table[(int)X][(int)a].equals("k")){
					stack[sp]='\0';
					sp--;
					continue;
				}
								
				if(a=='#'){
					i++;
					break;
				}		
			}
		}
		if(count==CifaAnalysis.line){
			System.out.println("\n《源程序已通过语法分析验证!》\n");
			new CodeBuild();////调用代码生成程序
			for(int m=0;m<CifaAnalysis.line;m++)
				System.out.println("style["+m+"]= "+style[m]);
			}
			else System.out.println("\n《程序有错,请改正!》\n");
	}
	//////读词法分析的临时文件
	void readCifaTemp(){
		try{
			int b,k=0;
			StringBuffer strBuf=new StringBuffer();
			String str[]=new String[200];
			FileInputStream fis=new FileInputStream(CifaTemp);
			while((b=fis.read())!=-1)
				strBuf=strBuf.append((char)b);
			str=new String(strBuf).split("\t");
			for(int i=0;i<CifaAnalysis.sumKey;i++)
				for(int j=0;j<2;j++,k++){
					STR[i][j]=str[k];
					//System.out.print(STR[i][j]+"\t");
					//if(j==1)System.out.println();
				}
		}catch(Exception e){
			System.out.println(e.toString());
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -