编译原理_词法分析(源程序)

  设计一个词法分析器,使其能对输入的字符串进行词法分析,并输出单词、类别所组成的二元组序列。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.LinkedList;

public class Test1 {
	static String[] keyword = {"if","int","for","while","do","return","break","continue"};
	static String[] operqtor = {"+","-","*","/","=","<",">","<=",">=","!="};
	static String[] separator= {",",";","{","}","(",")"};
	
	public static String txt(File file){
	        StringBuilder result = new StringBuilder();
	        try{
	            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
	            String s = null;
	            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
	                result.append(s+System.lineSeparator());
	            }
	            br.close();    
	        }catch(Exception e){
	            e.printStackTrace();
	        }
	        return result.toString();
	    }
	 
	 
	 public static String read(File file){ 	   
		 try{
			 String string;
			 int f;
			 FileReader fi = new FileReader(file);
			 LinkedList<String> list = new LinkedList<String>();
		        while((f=fi.read())!=-1){
		            list.add(""+(char)f);
		        }
		     int i=0;
			 string = "";
			 while(i<list.size()){
				 if(list.get(i).charAt(0)<='z'&&list.get(i).charAt(0)>='a'|| list.get(i).charAt(0)<='Z'&& list.get(i).charAt(0)>='a'){
					 while(list.get(i).charAt(0)<='z'&&list.get(i).charAt(0)>='a'|| list.get(i).charAt(0)<='Z'&& list.get(i).charAt(0)>='a'||list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0'){
						 string = string + list.get(i);
						 i++;
					 }
					if(string.length()!=0){
						if(searh_key(string)==0)
							 System.out.println("("+2+","+string+")");
					}
				 }
				 else if(list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0')
				 {
					 while(list.get(i).charAt(0)<='9'&& list.get(i).charAt(0)>='0'){
						 string = string + list.get(i);
						 i++;
					 }
					 System.out.println("("+3+","+string+")");
				 }
				 else if(searh_separator(list.get(i))==1) i++;
				 else if(searh_operqtor(list.get(i)+list.get(i+1))==1) i=i+2;
				 else if(searh_operqtor(list.get(i))==1) i++;
				 else i++;
				string="";	 
			 }	
		 }catch (Exception e) {	System.out.println("\n我去打不开。。好坑。。→_→!\n");}
		return null;
	 }
	    

	    public static void main(String[] args){
	        File file = new File("./xxx.txt");                   //要打开的文件名,里面是需要分析的源代码
	        System.out.println("文件内容:\n"+txt(file)+"分析:");
	        read(file);
	    }


           public static int searh_key(String s){
	    	for( int i=0;i<keyword.length;i++){
	    		if(keyword[i].equals(s)) {
	    			System.out.println("("+1+","+keyword[i]+")");
	    			return 1;
	    		}
	    	}
			return 0;
	    }
	   public static int searh_separator(String s){
			for( int i=0;i<separator.length;i++){
	    		if(separator[i].equals(s)) {
	    			System.out.println("("+4+","+separator[i]+")");
	    			return 1;
	    		}
	    	}
		   return 0;
	   }
	   public static int searh_operqtor(String s){
			for( int i=0;i<operqtor.length;i++){
	    		if(operqtor[i].equals(s)) {
	    			System.out.println("("+5+","+operqtor[i]+")");
	    			return 1;
	    		}
	    	}
		return 0;
	   }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值