📄 cifaanalysis.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 + -