⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wordanalysis.java

📁 该程序是汇编语言写的一个词法分析器
💻 JAVA
字号:
//---------------------------------------------------
//单位:华南农业大学信息学院2003级计算机科学与技术1班
//作者:魏 燕 怀
//学号:2003374126
//日期:2006年4月3日
//内容: C 语言词法分析器
//---------------------------------------------------

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

class WordAnalysis implements ActionListener
{
	JFrame f = null;//主窗口
	JTextArea textarea1 = null;//源代码窗口
	JTextArea textarea2 = null;//分析结果窗口
	JFileChooser filechooser = null;//文件对话框
	String str2="";//存放读入的文件内容
	
	public WordAnalysis()
	{   
		f = new JFrame("C 语言词法分析器");
		Container c = f.getContentPane();
		
		textarea1 = new JTextArea();//源代码窗口
		textarea1.setEditable(false);//设置为不可编辑
		textarea1.setBorder(BorderFactory.createLineBorder(Color.pink,2));
		textarea1.setBackground(Color.LIGHT_GRAY);
		textarea1.setForeground(Color.red);
		textarea2 = new JTextArea();//源代码窗口 
		textarea2.setEditable(false);//设置为不可编辑
		textarea2.setBorder(BorderFactory.createLineBorder(Color.pink,2));
		textarea2.setBackground(Color.LIGHT_GRAY);
		textarea2.setForeground(Color.blue);
		
		JScrollPane scrollpane1 = new JScrollPane(textarea1);//滚动模式
		scrollpane1.setPreferredSize(new Dimension(320,160));
		scrollpane1.setBorder(BorderFactory.createTitledBorder("源代码窗口"));
		JScrollPane scrollpane2 = new JScrollPane(textarea2);
		scrollpane2.setPreferredSize(new Dimension(320,160));
		scrollpane2.setBorder(BorderFactory.createTitledBorder("分析结果窗口"));
		
		JPanel panel = new JPanel();
		JButton b1 = new JButton("打开文件");//按纽
		b1.setIcon(new ImageIcon(".\\open.jpg"));
		b1.addActionListener(this);//注册时间监听
		
		JButton b2 = new JButton("词法分析");//按纽
		b2.setIcon(new ImageIcon(".\\glass.jpg"));
		b2.addActionListener(this);//注册时间监听
		
		JButton b3 = new JButton("保存结果");
		b3.setIcon(new ImageIcon(".\\save.jpg"));
		b3.addActionListener(this);
		
		panel.add(b1);//加入按纽
		panel.add(b2);//加入按纽
		panel.add(b3);
		
		filechooser = new JFileChooser("E:\\");//默认磁盘
		
		
		c.add(scrollpane1,BorderLayout.NORTH);//布局,代码窗口在上
		c.add(scrollpane2,BorderLayout.CENTER);//分析结果在中间
		c.add(panel,BorderLayout.SOUTH);//操作按纽在下面
		
		f.pack();
		f.setVisible(true);
		f.setLocation(200,100);//窗口在屏幕的位置
		f.setResizable(false);//设置窗口不能拉动
		f.addWindowListener(new WindowAdapter()//窗口关闭处理
		{
			public void windowClosing(WindowEvent e1)
			{
				System.exit(0);//退出
			}
		}
		);
	}
	
	public static void main(String[] args)//main()方法开始
	{
		new WordAnalysis();
	}
	
	public void actionPerformed(ActionEvent e2)
	{
		File file = null;//文件对象
		int result;
		
		if(e2.getActionCommand().equals("打开文件"))//如果按下代开分析文件按纽
		{
			filechooser.setApproveButtonText("确定");
			filechooser.setDialogTitle("打开文件");
			result = filechooser.showOpenDialog(f);
			
			textarea1.setText("");
			
			if(result==JFileChooser.APPROVE_OPTION)//如果按下确定
			{
				file = filechooser.getSelectedFile();//获得选中的文件
				
			}
			else if(result==JFileChooser.CANCEL_OPTION)//否则撤消
			{
				return;
			}
			
			FileReader fr = null;
			BufferedReader br = null;
			
			if(file!=null)
			{
				try
				{
					fr = new FileReader(file);//文件
					br = new BufferedReader(fr);//读入缓冲
				}
				catch(FileNotFoundException e3)
				{
					return;
				}
				
				
				String str1;//存放读入文件的每一行
				
				try
				{
					while((str1=br.readLine())!=null)//读入文件
					{
						textarea1.append("\n\t"+str1);//在代码窗口显示
						str2 +=(str1+" ");//存进str2,以便分析
					}
				}
				catch(IOException e4)
				{
					return;
				}
				
				finally
				{
					try{
				       fr.close();//关闭文件读
				        br.close();//关闭缓冲
				      }
				      catch(IOException e5)
				      {
				      	
				      }
			   }
			}
			
		}
		
	
	if(e2.getActionCommand().equals("词法分析"))//如果按下词法分析按纽
	{   		
		FileInputStream fin=null;//字节流
        Properties pt = new Properties();//哈希表子类,用来读入关键字
    
    try
    {   
      fin = new FileInputStream("KeyWord.txt");//打开关键字文件
    }
    catch(FileNotFoundException e)
    {
    	System.out.println("文件打不开");
    }
    
    try
    {
    if(fin!=null)//文件存在
    {
    	pt.load(fin);//将关键字文件内容装进哈希表
    	fin.close();//关闭文件
    }
    }
    catch(IOException e)
    {
    	System.out.println("文件读入错误.");
    }
    
    
    char input_char[] = str2.toCharArray();//将文件读入的字符串转换为数组
    String strToken="";//存分析的字符
    
    for(int j=0;j<input_char.length;j++)//词法分析开始,把数组中的字符一一分析
	     { 
	       
	     
	     	if(Character.isLetter(input_char[j]))//如果是字母开头
	     	{
	     	strToken+=input_char[j];//将该字母存进符号串
	     	
	     	//如果字母后面是数字或者字母或者下划线,则把数字或者字母或者下划线追加在后面
	     	while(Character.isDigit(input_char[j+1])||Character.isLetter(input_char[j+1])||input_char[j+1]=='_')
	     	strToken+=input_char[++j];
	     	
	     
	     	
	     	if(!Character.isLetter(input_char[j+1]))//如果下一个字符不是字母
	     	{   
	     	   
	     		
	     		if(pt.get(strToken)!=null)//如果是关键字,则输出其关键字编码
	     		{
	     		textarea2.append("\n\t<"+(String)pt.get(strToken)+",->");
	     		strToken="";//将字符串重新设置为空
	     	    }
	     		else
	     		{
	     	   textarea2.append("\n\t<$标识符,"+strToken+">");//不是关键字则输出是标识符
	     	   strToken="";
	     	 }
	   
	        }
	        
	        if(Character.isWhitespace(input_char[j]))//如果是空格,则下标加1
	        j++;
	        
	        }
	        
	        
	      else if(Character.isDigit(input_char[j]))//如果是数字开头
	       {
	       	 strToken+=input_char[j];//将数字存进字符串
	       	 
	     //如果数字后面是小数点并且小数点后是数字,或者数字后面是数字则追加在后面
	    while(((input_char[j+1]=='.')&&Character.isDigit(input_char[j+2]))||Character.isDigit(input_char[j+1]))
	    strToken+=input_char[++j];
	       	 
	       	 
	       	 if(!Character.isDigit(input_char[j+1]))//如果数字后面不是数字
	       	 { 
	       	  if(Character.isLetter(input_char[j+1])||input_char[j+1]=='_')//向后搜索
	       	  {
	       	  while(Character.isLetter(input_char[j+1])||Character.isDigit(input_char[j+1])||input_char[j+1]=='_')
	        	   strToken+=input_char[++j];
	        	   textarea2.append("\n\t<$错误,不能识别>");//如果不能构成数值,出错
	          }
	       	   
	       	 else textarea2.append("\n\t<$数值,"+strToken+">");//否则输出数值
	       	 	strToken="";
	       	 }
	       	 
	       	 
	       	 	if(Character.isWhitespace(input_char[j]))//如果是空格,则下标加1
	            j++;
	       	 }
	       
	       
      else 
       switch(input_char[j])//处理分隔符和运算符
       {
       	case '('://处理圆括号
       	textarea2.append("\n\t<$左圆括号,->");
       	break;
       	
       	case ')'://处理圆括号
       	textarea2.append("\n\t<$右圆括号 ,->");
       	break;
       	
       	case '{'://处理花括号
       	textarea2.append("\n\t<$左花括号,->");
       	break;
       	
       	case '}'://处理花括号
       	textarea2.append("\n\t<$右花括号,->");
       	break;
       	
       	case '['://处理中括号
       	textarea2.append("\n\t<$左中括号,->");
       	break;
       	
       	case ']'://处理中括号
       	textarea2.append("\n\t<$右中括号,->");
       	break;
       	
       	case ',':
       	textarea2.append("\n\t<$逗号 ,->");
       	break;
       	
       	case ';'://处理分号
       	textarea2.append("\n\t<$分号 ,->");
       	break;
       	
       	case ':'://处理冒号
       	textarea2.append("\n\t<$冒号 ,->");
       	break;
       	
       	case '\"'://处理双引号
       	textarea2.append("\n\t<$双引号,->");
       	break;
       	
       	case '\''://处理单引号以及字符常量
       	int n=0;
       	String tempstr="";
       	if(Character.isLetter(input_char[j+1]))
       	{   j++;
       	    tempstr+=input_char[j];
       	    n++;
     
       		if(input_char[j+1]=='\'')
       		{
       			textarea2.append("\n\t<$字符常量,"+tempstr+">");
       			j++;
       		}
       		else
       		{   textarea2.append("\n\t<$单引号,->");
       			j=j-n;
       		}
       	}
       	else
       	textarea2.append("\n\t<$单引号,->");
       	break;
       	
       	case '\\':
       	if(input_char[j+1]=='n')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$换行,->");//处理换行
       	}
       	
       	else if(input_char[j+1]=='t')//处理制表
       	{
       		j=j+1;
       		textarea2.append("\n\t<$制表,->");
       		
       	}
       	
       	break;
       	
       	case '+'://处理加号
       	if(input_char[j+1]=='+')
       	{
       			textarea2.append("\n\t<$自加,->");
       			j++;
       	}
       
       	else
       	textarea2.append("\n\t<$加号 ,->");
       	break;
       	
       	case '-'://处理减号
       	if(input_char[j+1]=='-')
       	{
       		textarea2.append("\n\t<$自减,->");
       		j++;
       	}
       	else
       	textarea2.append("\n\t<$减号 ,->");
       	break;
       	
       	case '*'://处理乘号
       	textarea2.append("\n\t<$乘号 ,->");
       	break;
       	
       	case '/':
       	if(input_char[j+1]=='*')//处理注释
       	{
       	textarea2.append("\n\t<$注释,->");
       	j++;
       	while(!((input_char[j+1]=='*')&&(input_char[j+2]=='/')))//如果没有连续出现*/则循环
       	j++;
       	j=j+3;//下标移动到*/后面
        }
       	else
       	textarea2.append("\n\t<$斜杆或除号 ,->");//不是注释则输出为斜杆
       	break;
       	     
       	case '=':
       	textarea2.append("\n\t<$等号 ,->");
       	break;
       	
       	case '!'://处理逻辑非或者不等于号
       	if(input_char[j+1]=='=')
       	{
       	  j=j+2;
       	  textarea2.append("\n\t<$不等于号,->");	
       	}	
       	else 
       	textarea2.append("\n\t<$逻辑非,->");
       	break;
       	
       	case '>'://处理大于号或者大于等于号
       	if(input_char[j+1]=='=')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$大于等于号,->");
       	}
       	else if(input_char[j+1]=='>')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$右移位符,->");
       	}
       	else textarea2.append("\n\t<$大于号,->");
       	break;
       	
       	case '<'://处理小于号或者小于等于号
       	if(input_char[j+1]=='=')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$小于等于号,->");
       	}
       	else if(input_char[j+1]=='<')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$左移位符,->");
       	}
       	else textarea2.append("\n\t<$小于号,->");
       	break;
       	
       	case '|'://处理逻辑非
       	if(input_char[j+1]=='|')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$逻辑或,->");
       		
       	}
       	else textarea2.append("\n\t<$按位或,->");
       	break;
       	
       	case '&'://处理逻辑与
       	if(input_char[j+1]=='&')
       	{
       		j=j+1;
       		textarea2.append("\n\t<$逻辑与,->");
       	}
       	else textarea2.append("\n\t<$按位与,->");
       	break;
       	
       	case '?':
       	textarea2.append("\n\t<$条件运算符,->");
       	break;
       	
       	default:
       	if(Character.isWhitespace(input_char[j]))
       	;
       	else textarea2.append("\n\t<$错误,不能识别>");
       	break;
       }
    	
    }//end for
    
	}//end if
    
    if(e2.getActionCommand().equals("保存结果"))//保存分析结果
    {
    	result = filechooser.showSaveDialog(f);
    	file = null;
    	
    	if(result==JFileChooser.APPROVE_OPTION)//按下保存
    	{
    		file = filechooser.getSelectedFile();
    	}
    	else if(result==JFileChooser.CANCEL_OPTION)//那下撤消
    	{
    		return;
    	}
    	
    	FileWriter fw =null;//文件对象
    	
    	
    	if(file!=null)
    	{
    		try
    		{
    			fw = new FileWriter(file);
    			
    		}
    		catch(IOException e6)
    		{
    		   
    		}
    		
    		
    		String content = textarea2.getText();//将textarea2的内容获取出来
    		
    		try
    		{
    			fw.write(content);//写进文件
    		}
    		catch(IOException e7)
    		{
    			return;
    		}
    		
    		finally
    		{
    			try
    			{
    				fw.close();//关闭文件写操作
    				
    			}
    			catch(IOException e8)
    			{
    			}
    		}
    	}
    	
    }//end if
    	
	}//end performed
}//类体结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -