compiler.java
来自「编译原理上机实验」· Java 代码 · 共 120 行
JAVA
120 行
import java.io.*;
import sun.management.counter.Variability;
//程序中很多字符都以ASCⅡ CODES表示
public class compiler
{
static StringBuffer buf=new StringBuffer("");
public static void main(String args[])
{
int i=0,j=1,k=1,f=0;
String words[]=new String[1000];//记录单词树目
String keys[]=new String[1000];//记录保留字树目
try{
RandomAccessFile rf1=new RandomAccessFile("analyse.c","rw");//打开文件
long end1=rf1.length();//文件总长度rf.length()
do{//读取C文件
rf1.seek(i++);//移动读取文件的指针
int one=rf1.read();//读取一个字节
if((one>=65&&one<=90)||(one>=97&&one<=122)||(one>=48&&one<=57)||one==95||one==46)//判断标识符(字母数字下划线小数点)
{
buf.append((char)one);
int next=rf1.read();//由下一个字节断定标识符
if(next<46||next==47||(next>57&&next<65)||(next>90&&next<95)||next>122||next==96)//next为小数点下划线以外的全部字符
{ words[j++]=buf.toString();
buf.delete(0, buf.length());
}
}
else//判断界符
{
if(one==32||one==10||one==13) //预处理 清除 空格 和换行
{ if(buf.length()>0)
{ words[j++]=buf.toString();
buf.delete(0, buf.length()); //缓存内容清空
}
}
else
{ buf.append((char)one);
int next=rf1.read();//由下一个字节断定>=等运算符
if((one==37&&(next==100||next==102))||(one==43&&next==43)||(one==45&&next==45)||
(one==45&&next==62)||(one==38&&next==38)||(one==124&&next==124)||
(one==60&&next==60)||(one==62&&next==62))// %d%f++--<<>>->&&||
{ buf.append((char)next);i++;words[j++]=buf.toString();buf.delete(0, buf.length());}
else if(next!=61)
{ words[j++]=buf.toString();buf.delete(0, buf.length());}
}
}
}while(i<end1);
System.out.println("文件一共"+(j-1)+"个单词!");
rf1.close();//关闭
}catch (IOException e)
{ System.err.println(e);}
//打开保留字表文件keys.txt
try{
RandomAccessFile rf2=new RandomAccessFile("keys.txt","rw");//打开文件
long end2=rf2.length();
do{
rf2.seek(f++);
int one=rf2.read();
if(one==10) //预处理清除空格和换行
{ keys[k++]=buf.toString();
buf.delete(0, buf.length());
}
if(one!=10&&one!=13)
buf.append((char)one);
}while(f<end2);
System.out.println("一共"+(k-1)+"个保留字!");
rf2.close(); //关闭
}catch (IOException e)
{ System.err.println(e);}
//写入文件
try{
RandomAccessFile rf3=new RandomAccessFile("presult.txt","rw");//创建文件
for(int m=1;m<j;m++)//j-1个单词
{ System.out.println("m="+m+" "+words[m]);//取第一个单词输出
for(int n=1;n<=k;n++)//k-1个保留字
{ if(n==k)//不是保留字的情况
{ System.out.print("非保留字:");
char ch=words[m].charAt(0);//取第一个字符
if(ch>='0'&&ch<='9')
{ int index=0;
int flag=0;
for( index=1;index<words[m].length();index++)
{//判断是否全为数字或小数点
if(words[m].charAt(index)<46 ||words[m].charAt(index)>57 || words[m].charAt(index)==47)
{flag=1;}
}
if(flag==0)
{System.out.println("数字");
buf.append("("+100+","+words[m]+")"+"\r\n");}
else{System.out.println("非法符");
buf.append("(Error,"+words[m]+")"+"\r\n");}//保存数字
}
else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{ System.out.println("标识符");
buf.append("("+101+","+words[m]+")"+"\r\n");//保存标识符
}
else
{ System.out.println("非法符");
buf.append("(Error,"+words[m]+")"+"\r\n");//保存非法符
}
}
if(words[m].equals(keys[n]))
{ System.out.println("保留字n="+n+" "+keys[n]);
buf.append("("+n+","+"-"+")"+"\t"+" $ "+words[m]+" $"+"\r\n");//保存数字保留字
break;
}
}
}
String str=buf.toString();
rf3.writeBytes(str);//写入文件result.txt
}catch (IOException e)
{ System.err.println(e);}
System.out.print("ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp");
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?