java实现编辑器(一)

 昨天下半天的作品,不敢独享,发代码以抛砖引玉,望高手指点!!!


初步完成了四项基本功能:
1,提取文件。
2,删除注释。
3,关键字识别。
4,符号匹配。


源代码:

import java.io.File;				//用于创建文件
import java.io.IOException ;		//用来处理异常信息
import java.io.InputStream ;
import java.io.FileInputStream ;
public class Compiler {
	//功能1. 将注释删除掉 这里先将“//”的全部注释删除,暂没考虑“/*....*/”和“/*....**/”的情况
	public static void deleteAnnotation(String s){
		StringBuffer Sb=new StringBuffer(s);
		int annotationLocation=0;
		int lineFeedLocation=0;
//		
//		if(Sb.lastIndexOf("//")>Sb.lastIndexOf("\n")){		//消除最后一行没有回车的注释,不然影响后面程序的执行
//			annotationLocation=Sb.lastIndexOf("//");
//			Sb.delete(annotationLocation, Sb.length());
//			}
		while(-1!=Sb.indexOf("//")){
			annotationLocation=Sb.indexOf("//",0);						//记录注释“//”出现的位置
				lineFeedLocation=Sb.indexOf("\n",annotationLocation);		//记录离“//”最近的回车换行的位置	
			Sb.delete(annotationLocation, lineFeedLocation);				//将注释删除
		}

		System.out.println(Sb.toString());	//验证结果
	}


	// 功能2.  下面的方法完成找到指定关键字,并统计字符串中某关键字(key)的个数
	public static void keyCount(String s,String key){	
		short[] location=new short[256];	//记录key的位置
		StringBuffer Sb= new StringBuffer(s);
		int keyCount=0;				//暂存关键字的个数	
		int temp=0;					//暂存int位置的信息
		int locationBuffer=0;		//
		while(-1!=Sb.indexOf(key)){
			//此条件用来避免关键字(key)在含在普通字符中的情况,如int出现在“print”中。
			if(Sb.charAt(Sb.indexOf(key)-1)==' '&&Sb.charAt(Sb.indexOf(key)+key.length())==' '||Sb.charAt(Sb.indexOf(key)+key.length())=='['){	//此处还有bug!
				keyCount++;	
				location[locationBuffer]=(short)Sb.indexOf(key);
				locationBuffer++;
			}
			temp=Sb.indexOf(key);	
			Sb.delete(0,temp+key.length());		//将含有key前的所有字符均删除			
		}
		if(keyCount>0){
			System.out.println("关键字"+key+"在文件中有:"+ keyCount+"个。");
			System.out.print(key+"在该文件的所在位置(单位:字符):");
			for(int i=0;i<locationBuffer;i++){
				System.out.print(location[i]+"\t");	
			}
			System.out.println('\n');
		}
	}
	//功能3. 判断需要“互相匹配(matching)”的字符,如“大括号”、“小括号”等
	public static void matching(String s,char characterLeft,char characterRight){
		int CharacterCount=0;
		char c=' ';
		for(int i=0;i<s.length();i++){		//计数
			if(characterLeft==s.charAt(i)){CharacterCount++;	}
			if(characterRight==s.charAt(i)){CharacterCount--;	}
		}
		//输出验证
		if(CharacterCount!=0){
			System.out.print("(⊙_⊙!),编译出错: \" "+characterLeft+" \" 和"+"\" "+characterRight+" \" 不配对,");
			if(CharacterCount>0)
				System.out.println("少了"+CharacterCount+"个\" "+characterRight+" \"");
			else
				System.out.println("多出"+(-CharacterCount)+"个\" "+characterRight+" \"");
		}
	}
	public static void main(String args[])throws Exception{	//此处为了代码简洁,直接将异常交给JVM(java虚拟机)了
		//功能3 读入文件
		// 使用File类找到一个文件
		File f=new File("e:\\Hello.java");		//★★此处你可以在你的电脑上找一个文件(如*.java)进行验证,注:此处有2个反斜杠“\”。★★
		//读入E盘的“Hello.java”文件				
		// 通过子类实例化父类对象
		InputStream input = null ;	// 准备好一个输入的对象
		input = new FileInputStream(f)  ;	// 通过对象多态性,向上转型进行实例化(⊙o⊙)哦
		byte b[] = new byte[1024] ;		// 所有的内容都读到此数组之中
		input.read(b) ;		// 读取内容
		input.close() ;						// 关闭输出流
		
		String ss=new String(b ) ;		 //把byte数组变为字符串输出
		String s=" "+ss+"\n";			//加" "为了字符位置的匹配,
										//加"\n"为了消除注释在最后时没有回车符的情况
		Compiler.deleteAnnotation(s);
		Compiler.keyCount(s,"main");		//此处有bug!待解
		Compiler.keyCount(s,"class");
		Compiler.keyCount(s,"public");		//此处有bug!待解
		Compiler.keyCount(s,"static");

		Compiler.keyCount(s,"void");
		Compiler.keyCount(s,"int");
		Compiler.keyCount(s,"double");
		Compiler.keyCount(s,"float");
		Compiler.keyCount(s,"char");
		Compiler.matching(s, '{', '}');
		Compiler.matching(s, '[', ']');
		Compiler.matching(s, '(', ')');
	}
}
//执行结果:
//关键字class在文件中有:1个。
//class在该文件的所在位置(单位:字符):8	

//关键字public在文件中有:2个。
//public在该文件的所在位置(单位:字符):1	21	

//关键字static在文件中有:1个。
//static在该文件的所在位置(单位:字符):35	

//关键字void在文件中有:1个。
//void在该文件的所在位置(单位:字符):42	

//关键字int在文件中有:3个。
//int在该文件的所在位置(单位:字符):23	15	66	

//关键字double在文件中有:1个。
//double在该文件的所在位置(单位:字符):158	

//关键字float在文件中有:1个。
//float在该文件的所在位置(单位:字符):186	

//(⊙_⊙!),编译出错: " { " 和" } " 不配对,多出5个" } "



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值