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

📄 analyze.java

📁 cmm词法分析器
💻 JAVA
字号:
/*
 *author@weiβ    mail:feather1190@yahoo.com.cn
 */ 
package complier;

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


class Analyze extends JFrame implements ActionListener
{  
 //设置主界面
   MenuBar mbar ;                                                           
   Menu fileMenu,helpMenu;
   MenuItem newItem,openItem,saveItem,exitItem,helpfileItem,aboutItem,analyItem;
   JTextArea progarmArea, resultArea;
   JFileChooser fc ;
   JToolBar toolbar;
   public Analyze(String s)
   { 
     super("词法分析器" );
    
     
     this.setSize(800,600);
     this.getContentPane().setLayout(new BorderLayout());
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     Container c = getContentPane();
     c.setBackground(Color.CYAN);
     Container toolc = getContentPane();
     
     this.addWindowListener(new WindowAdapter(){
             public void WindowClosing(WindowEvent e){System.exit(0);}
        });
    
     
     mbar = new MenuBar();                                           
     this.setMenuBar(mbar);
    //定义fileMenu菜单
     fileMenu = new Menu("文件");
     fileMenu.addActionListener(this);
     mbar.add(fileMenu);

     newItem = new MenuItem("新建");
     newItem.addActionListener(this);
     fileMenu.add(newItem);

     openItem = new MenuItem("打开");
     openItem.addActionListener(this);
     fileMenu.add(openItem); 
    
     saveItem = new MenuItem("保存");
     saveItem.addActionListener(this);
     fileMenu.add(saveItem);

     fileMenu.addSeparator();

     analyItem = new MenuItem("分析");
     analyItem.addActionListener(this);
     fileMenu.add(analyItem);

     exitItem = new MenuItem("退出");
     exitItem.addActionListener(this);
     fileMenu.add(exitItem);
     
     //定义helpMenu菜单
     helpMenu = new Menu("帮助");
     helpMenu.addActionListener(this);
     mbar.add(helpMenu);
     
     helpfileItem = new MenuItem("帮助主题");
     helpfileItem.addActionListener(this);
     helpMenu.add(helpfileItem); 

     helpMenu.addSeparator();
     aboutItem = new MenuItem("关于");
     aboutItem.addActionListener(this);
     helpMenu.add(aboutItem); 
    
     
     //定义文本域
     //输入域
     progarmArea = new JTextArea("program",10,46);
     progarmArea.setBackground(Color.white);
     progarmArea.setLineWrap(true);
     progarmArea.setVisible(true);
    //输出域
     resultArea = new JTextArea(10,46);
     resultArea.setBackground(Color.white);
     resultArea.setEditable(false);
     resultArea.setVisible(true);
     JScrollPane p1 = new JScrollPane( progarmArea );//滚动块
     p1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
     p1.setVisible(true);
     JScrollPane p2 = new JScrollPane(resultArea );
     p2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
     p2.setVisible(true);
     c.add(p2,"East");
     c.add(p1,"West");
     
     this.pack();
     this.show();

 
     
     //文件选择
     fc = new JFileChooser();
     fc.setSelectedFile(new File(""));
     fc.setCurrentDirectory(new File(""));
     
     //定义工具栏
     toolbar= new JToolBar();
     toolbar.setOrientation(toolbar.HORIZONTAL);
      toolc.add(toolbar,"North");
   
     //button(新建)
     JButton newButton = new JButton("新建");
     newButton.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e){
              progarmArea.setText(" ");
     }
     }); 
     
     
     //button(打开)
     JButton openButton = new JButton("打开");
     openButton.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e){
                     int returnval=fc.showOpenDialog(Analyze.this);
            try{
                     if(returnval==JFileChooser.APPROVE_OPTION)
              {
                 String inLine;
                 File openfile = fc.getSelectedFile();
                 FileReader openfr=new FileReader(openfile);
                 BufferedReader openbr = new BufferedReader(openfr);
                  while((inLine=openbr.readLine())!=null)
                    {
                     progarmArea.append("\n"+inLine);
                    }
                     openbr.close();
                }
             }
             
             catch(IOException exp){}
             }
             });
    //button(分析)
     JButton runButton = new JButton("分析");
     runButton.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e){
         resultArea.setText("分析结果\n"); 
         String s1 = progarmArea.getText();
         String s2 = analyzefile(s1);
         resultArea.setText(s2);
             }
     });
         toolbar.add(newButton);
         toolbar.add(openButton);
         toolbar.add(runButton);
         this.add(toolbar,"North");
     } 
  
   
   
   
    public void actionPerformed(ActionEvent e) {
	   if(e.getSource() == newItem){
		   progarmArea.setBackground(Color.white);
		   progarmArea.setText(" ");
     } 
	   		else if(e.getSource() == openItem){
	   				try{
	   						int  returnval=fc.showOpenDialog(Analyze.this);
	   						if(returnval==JFileChooser.APPROVE_OPTION){
	   							progarmArea.setBackground(Color.white);
	   							String inLine;
	   							File openfile = fc.getSelectedFile();
	   							FileReader openfr=new FileReader(openfile);
	   							BufferedReader openbr = new BufferedReader(openfr);
	   							while((inLine=openbr.readLine())!=null){
                    	   	progarmArea.append("\n"+inLine);
                          }
                    openbr.close();
                   }
               }
            catch(IOException exp){}
          }
	   		else if(e.getSource() == saveItem)
                {
                  
	   			int  returnval=fc.showSaveDialog(Analyze.this);
	   				if(returnval==JFileChooser.APPROVE_OPTION){ 
	   					String inLine;
	   					File savefile = fc.getSelectedFile();
                   
                    }
                 
                }
	   
	   		else if(e.getSource() == exitItem)
	   				System.exit(0);
	   			else if(e.getSource() == analyItem){
                     resultArea.setText("分析结果\n"); 
                     String s1 = progarmArea.getText();
                     String s2 = analyzefile(s1);
                     resultArea.setText(s2);
                        }
                            else if( e.getSource() == helpfileItem)
                                 resultArea.setText("这是一个词法编译器,可以分析简单的cmm语言程序");
                                 else if(e.getSource() == aboutItem)
                                    JOptionPane.showMessageDialog(null,"weiβ 制作,mail:feather1190@yahoo.com.cn","关于", JOptionPane.INFORMATION_MESSAGE);
}
    public static  String  analyzefile(String sfile){
 								String oneword=" ";
 								char nextchar;
 								int i,numchars;
 								String lastresult=" ";
 								
 								numchars=sfile.length();
               
 							for(i =1;i<numchars;i++){
 								nextchar = sfile.charAt(i-1);
                             
 								
 								
 								//读入的是空格
                                if(Character.isSpace(nextchar));
                    			
                                //读入的是字母
                    				 else if(Character.isLetter(nextchar)){       
                    				oneword = oneword +nextchar;
                    				i++;
                    				nextchar = sfile.charAt(i-1);
                           
                    						while(Character.isDigit(nextchar)||Character.isLetter(nextchar)){ 
                    							oneword = oneword +nextchar;
                    							i++;
                    							nextchar = sfile.charAt(i-1);  
                    							}
                    						i--;
                    						oneword = oneword.trim();//返回字符串的副本,忽略前导空白和尾部空白.
                    					
                    						if(iskeyword(oneword))
                    								lastresult=lastresult+"   ("+oneword+",1)       关键字\n";
                    							else
                    									lastresult=lastresult+"     ("+oneword+",2)       标识符\n";
                    							oneword=" ";
                           }
                                		//读入的是数字
                    					else  if(Character.isDigit(nextchar)){
                    							oneword = oneword +nextchar;
                    							i++;
                    							nextchar = sfile.charAt(i-1);
                    							while(Character.isDigit(nextchar)){ 
                    								oneword = oneword +nextchar;
                    								i++;
                    								nextchar = sfile.charAt(i-1);  
                    							}
                    							i--;
                    							oneword=oneword.trim();
                    							lastresult=lastresult+"   ("+oneword+",3)         数字\n";
                                          oneword=" ";
                             }
                                
                    					
                                //读入的是符号
                    						else{ 
                    							int	signaltype;
                    							signaltype = signal(sfile.charAt(i-1),sfile.charAt(i));
                    							switch(signaltype){
                    								case 1://"++,--"单目运算符
                    									lastresult=lastresult+"   ("+nextchar+sfile.charAt(i)+",4)      单目运算符\n";
                    									i++;
                    									break;
                    								case 2://"+,_,*,/"双目运算符
                    									lastresult=lastresult+"   ("+nextchar+",5)     双目运算符\n";
                    									break;
                    								case 3://"(,),{,},;,,"分隔符
                    									lastresult=lastresult+"   ("+nextchar+",6)      分隔符\n";
                    									break;
                    								case 4://“//”,“/*”,和“*/”
                    									lastresult=lastresult+"   ("+nextchar+sfile.charAt(i)+",7)      注释符\n";
                    									i++;
                    									break;
                    								case 5://"<>,==,<=,>=,!="判断符
                    									lastresult=lastresult+"   ("+nextchar+sfile.charAt(i)+",8)       判断符\n";
                    									i++;
                    									break;
                    								case 6://"<,>"判断符
                    									lastresult=lastresult+"   ("+nextchar+",8)       判断符\n";
                    									i++;
                    									break;
                    								case 0://错误字符
                    									lastresult=lastresult+"   ("+nextchar+",9)    错误字符\n";
                    									break;
                    							}//end of switch
                    						}
                                
 							}
                    			
 							return lastresult;
                    			
 				} 
         
 		
 		
 		//在比较两个字符是否相等时,用equals函数,等号只判断指向相同地址的
 			public static boolean iskeyword(String s1){
 				if(s1.equals("int") )
 					      return true;
 				else if(s1.equals("if"))
 					      return true;
                else if(s1.equals("while") )
                          return true;
                else if(s1.equals("read"))
                          return true;
                else if(s1.equals("return"))
                          return true;
                else if(s1.equals("write"))
                          return true;
                else if (s1.equals("else"))
                         return true;
                else if (s1.equals("real"))
                    return true;
                else return false;
           }

 			public static int signal( char c1,char c2 ){
 				switch(c1){
 					case '+': 
                      if(c2=='+')  
                              return 1; //单目运算符
                      else 
                    	  return 2 ;//双目运算符
              
 					case '-':        
                      if(c2=='-')  
                             return 1; 
                      else   
                    	  return 2 ;
 					case '*': if(c2=='/') return 3; //分隔符
                        else 
                        	return 2;
 					case '/': if(c2=='/'||c2=='*') return 4;//注释符
                        else 
                        	return 2;
 					case '=': if(c2=='=') return 5;//判断符1
                        else 
                        	return 2;
 					case '!':if(c2=='=')return 5; 
 					
 					case ';': return 3;
 					case '(': return 3;
 					case ')': return 3;
 					case '{': return 3;
 					case '}': return 3;
 					case '[': return 3;
 					case ']': return 3;
 					case ',': return 3;
 				
 					case '<': if((c2=='=')||(c2=='>')) return 5;//判断符1
 						else 
 							 return 6;//判断符2
 		            case '>': if(c2=='=') return 5;//判断符1
 				     		return 6;//判断符2
 				    	
 				}
 				return 0;

 			}

}













⌨️ 快捷键说明

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