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

📄 cifaanalysis.java

📁 编译原理的课程设计,含报告地方还行iushdfiuheohrg
💻 JAVA
字号:
import java.io.*;
class CifaAnalysis{
	static int i,j,line,sumKey;
	static boolean errorFlag=true;
	char[][] charBuf=new char[100][100];
	String keyWord[]={"int","float","if","then","while","do"};
	File SourceFile=new File("SourceFile.txt");
	File CifaTemp=new File("CifaTemp.txt");
	
	/////////////////////构造方法////////////////////////
	CifaAnalysis(){
		/*for(int k=1;k<129;k++)
			System.out.println(k+"  "+(char)k);*/
		readSourceFile();
		if(CifaTemp.exists())CifaTemp.delete();
		i=j=0;
		try{
			FileWriter fos=new FileWriter(CifaTemp,true);
			while((int)charBuf[i][j]!=0){
	/////识别保留字和标志符,并输出到指定临时文件,类型代号0和1			
	label:	if((charBuf[i][j]>='a'&&charBuf[i][j]<='z')||
				(charBuf[i][j]>='A'&&charBuf[i][j]<='Z')){
					StringBuffer strTemp=new StringBuffer();
					strTemp=strTemp.append(charBuf[i][j]);
					for(int k=1;k<5&&charBuf[i][j+k]!='\r';k++){
						strTemp=strTemp.append(charBuf[i][j+k]);
						for(int p=0;p<6;p++)
							if(new String(strTemp).equals(keyWord[p])){
								//System.out.println(keyWord[p]+" 0");
								if(p<2)fos.write(keyWord[p]+"\ta\t");
								if(p==2)fos.write(keyWord[p]+"\tb\t");
								if(p==3)fos.write(keyWord[p]+"\tc\t");
								if(p==4)fos.write(keyWord[p]+"\td\t");
								if(p==5)fos.write(keyWord[p]+"\te\t");
								j=j+k+1;
								sumKey++;
								break label;
							}
					}
					//System.out.println(charBuf[i][j]+" 1");
					fos.write(charBuf[i][j]+"\tf\t");
					sumKey++;
					j++;
					}
	/////识别数字,并输出到制指定临时文件,类型代号2				
			if(charBuf[i][j]>='0'&&charBuf[i][j]<='9'){
				int c=1;
				StringBuffer strBuf=new StringBuffer();
				strBuf=strBuf.append(charBuf[i][j]);
				while((charBuf[i][j+c]=='.'||
					(charBuf[i][j+c]>='0'&&charBuf[i][j+c]<='9'))&&
					charBuf[i][j+c]!='\r'){
						strBuf=strBuf.append(charBuf[i][j+c]);
						c++;
					}
					//System.out.println(new String(strBuf)+" 2");
					fos.write(new String(strBuf)+"\tg\t");
					j=j+c;
					sumKey++;
				}
	//////识别算术运算符,并输出到指定临时文件,类型代号3			
			if(charBuf[i][j]>='*'&&
				charBuf[i][j]<='/'&&
				charBuf[i][j]!='.'){
					//System.out.println(charBuf[i][j]+" 3");
					fos.write(charBuf[i][j]+"\th\t");
					j++;
					sumKey++;
				}
	//////识别比较运算符,并输出到指定临时文件,类型代号4			
			if((charBuf[i][j]=='='||charBuf[i][j]=='!')&&charBuf[i][j+1]=='='){
				//System.out.println(charBuf[i][j]+"= 4");
				fos.write(charBuf[i][j]+"=\ti\t");
				j+=2;
				sumKey++;
			}
			if((charBuf[i][j]=='!'&&charBuf[i][j+1]!='=')){
				System.out.println("源程序词法错误:第"+(i+1)+"行,第"+(j+1)+"个字符处\'!\'后面缺少\'=\'号!\n请改正后再次编译!");
				errorFlag=false;
				break;
			}	
			if(charBuf[i][j]=='>'||charBuf[i][j]=='<'){
				//System.out.println(charBuf[i][j]+" 4");
				fos.write(charBuf[i][j]+"\ti\t");
				j++;
				sumKey++;
			}
	//////识别赋值运算符,并输出到指定临时文件,类型代号5		
			if(charBuf[i][j]=='='&&charBuf[i][j+1]!='='){
				//System.out.println("= 5");
				fos.write("=\tj\t");
				j++;
				sumKey++;
			}
			if(charBuf[i][j]=='\r'){
				i++;
				j=0;
				line++;
				//System.out.println();
				fos.write("#\t#\t");///////////重要////////
			}
		}
		fos.close();
		}catch(Exception e){
			System.out.println(e.toString());
		}
		line++;
		sumKey--;
		if(errorFlag)System.out.println("源程序共:"+line+"行, "+sumKey+"个有效字符串。(注:\"==\"或\"!=\"视一个有效字符串对待!)");
		sumKey=sumKey+line;
	}
	
	//////////////读源文件//////////////////////////////
	void readSourceFile(){
		int b;
		try{
			FileInputStream fis=new FileInputStream(SourceFile);
			if(!SourceFile.exists())
				System.out.println("源文件未找到!");
				else{
					while((b=fis.read())!=-1){
						if((char)b!=' '&&
						   (char)b!='\n'){
							charBuf[i][j]=(char)b;
							//System.out.println("chrBuf["+i+"]["+j+"]=  "+charBuf[i][j]);
							j++;
						}
						if((char)b=='\n'){
							i++;
							j=0;
							//System.out.println();
						}
					}
				}
		}catch(Exception e){
			System.out.println(e.toString());
		}
	}
}

⌨️ 快捷键说明

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