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 + -
显示快捷键?