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

📄 cmm.java

📁 使用JAVA写的CMM语言的解释器(词法分析部分)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * Cmm.java
 *
 * Created on 2007年10月4日, 下午6:39
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package cmm;
import java.awt.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.swing.*;
import java.io.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.Stack;
import java.util.LinkedList;
import java.util.TreeMap;
/**
 *
 * @author lx
 */
enum Attribute{
    ID,Value,
}




public class Cmm extends JFrame implements ActionListener{
    //定义变量
    private TextArea input = new TextArea();
    private JButton open = new JButton("打开文件");
    private JButton clean = new JButton("清空");
    private JButton analyse = new JButton("分析");
    private  JFileChooser fileChooser= new JFileChooser();
    TextArea output = new TextArea();
    private int start,done,note,bracket,error,num,id,keyWord;
    private int state1=0;
    private boolean goon=true;
    private int col=1;
    private int pos =0;
    private int inputSize=0;
    private String inPut;
    private boolean finish=false;
    private int begin ,end;
    private String currentToken;
    private boolean decimal=false;
    private boolean once=true;
    private boolean back=false;
    private String[] line;
    private boolean frist=true;
    private LinkedList tokens,ID;
    private boolean errorA =false;
    private TreeMap tree;
    private Analyse ana;
    /** Creates a new instance of Cmm */
    public Cmm() {
        tokens = new LinkedList();
        ID  = new LinkedList();
        initial();
        setLayout(null);
        setSize(600,500);
        setTitle("CMM");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-getSize().width)/2,(Toolkit.getDefaultToolkit().getScreenSize().height-getSize().height)/2);
        setVisible(true);
        
    }
    //初始化界面
    public void initial(){
        //输入文本框
        input.setEditable(true);
        input.setBounds(10,10,480,230);
        //打开文件按钮
        open.setBounds(490,50,100,30);
        open.addActionListener(this);
        open.setActionCommand("open");
        //清空按钮
        clean.setBounds(490,100,100,30);
        clean.setActionCommand("clean");
        clean.addActionListener(this);        
        //分析按钮
        analyse.setBounds(490,150,100,30);
        analyse.setActionCommand("analyse");
        analyse.addActionListener(this);
        //输出
        output.setBounds(10,260,500,130);
        output.setEditable(false);
        //文件读入
        BFileFilter   filter   =   new   BFileFilter();   
        filter.addExtension("cmm");
        fileChooser.setFileFilter(filter);
        fileChooser.setAcceptAllFileFilterUsed(false);
        //添加组键
        this.add(clean);
        this.add(open);
        this.add(input);
        this.add(output);
        this.add(analyse);
        inPut ="";
        start=0;
        done=1;
        note=2;
        bracket=3;
        error=4;
        num=5;
        id=6;
        keyWord=7;
    }  
    private Character getNext(){              
        try{
        if(col==1&&frist){
        output.setText("第"+col+ "行:"+line[0]);
        frist=false;
        }
    if(pos<inputSize-1){     
   return inPut.charAt(pos++);    
    }else if (pos==inputSize-1){
         finish=true;         
         return inPut.charAt(pos++);       
    }else{    
    return null;
    }      
        }catch(Exception e){
        return null;
        }
    }
   //分析方法
   private void read() {          
       
       ID.clear ();
       tokens.clear ();
       
   if(input.getText().equalsIgnoreCase("")){
   output.setText("输入为空");
   }else{
   inPut = input.getText();
   BufferedReader bufferedreader = new BufferedReader(new StringReader(inPut));   
  int i=1;
  try{  
      for (String s1 = bufferedreader.readLine(); s1 != null; s1 = bufferedreader.readLine()) { 
         
                        i++;
					}     
 BufferedReader bufferedreader2 = new BufferedReader(new StringReader(inPut));
        line= new String[i];
       
        int j=0;
          for (String s1 = bufferedreader2.readLine(); s1 != null; s1 = bufferedreader2.readLine()) {               
			line[j]=s1;                     
                        j++;
					}      
  }catch(Exception e){
  }
   inputSize =inPut.length();
   output.setText("");
   pos=0;
   finish=false;
   begin =0;
   end=0;
   decimal=false;
   col=1;
   once=true;
   frist=true;
   
   while(!finish){
       
   analyse();
   }
   if(!errorA){
       ana = new Analyse(tokens,ID,this);
       ana.an ();
       
   }
   
   } 
   }
   private void isKW(String to){
       if(to.equalsIgnoreCase("real")||to.equalsIgnoreCase("int")||to.equalsIgnoreCase("Write")||to.equalsIgnoreCase("If")||to.equalsIgnoreCase("Else")||to.equalsIgnoreCase("Read")||to.equalsIgnoreCase("while")){
           tokens.offer(currentToken);
           ID.offer("KW");
           
           output.append("\n"+"保留字:  "+currentToken);
       }else {
           tokens.offer (currentToken);
           ID.offer ("ID");
       output.append("\n"+"标示符:  "+currentToken);
       }
   } 
   private void backup(){
   pos--;
   finish=false;
   }
    private void analyse(){
        int state=start;
        begin=pos;
    while(state!=done){
                   char a =getNext();
                
           switch (state) {
               case 0:
                  if(a=='+'){
                      tokens.offer(a);
                      ID.offer("Com");
                  output.append("\n"+"特殊符号: +");
                  state=done;                   
                   }else if(a=='-'){
                      tokens.offer(a);
                      ID.offer("Com");
                  output.append("\n"+"特殊符号: -");
                  state=done;                  
                   }else if(a=='*'){
                      tokens.offer(a);
                      ID.offer("Com");
                  output.append("\n"+"特殊符号: *");
                  state=done;                   
                   }else if(a=='('){
                      tokens.offer(a);
                      ID.offer("Com");
                  output.append("\n"+"特殊符号: (");
                  state=done;                   
                   }else if(a==')'){
                      tokens.offer(a);
                      ID.offer("Com");
                  output.append("\n"+"特殊符号: )");
                  state=done;                   
                   }else if(a=='['){
                      tokens.offer(a);
                      ID.offer("FG");
                  output.append("\n"+"特殊符号: [");
                  state=done;                   
                   }else if(a=='{'){
                      tokens.offer(a);
                      ID.offer("FG");
                  output.append("\n"+"特殊符号: {");
                  state=done;                   
                   }else if(a=='}'){
                      tokens.offer(a);
                      ID.offer("FG");
                  output.append("\n"+"特殊符号: }");
                  state=done;                   
                   }else if(a==']'){
                      tokens.offer(a);
                      ID.offer("FG");
                  output.append("\n"+"特殊符号: ]");
                  state=done;                   
                   }else if(a=='\n'){   
                      tokens.offer(a);
                      ID.offer("NL");
                             col++;  
                               output.append("\n"+"第"+col+"行:"+line[col-1]);
                      state=done;
                   
                   }else if(a=='\r'){
                   state=done;
                   }else if(a==' '){
                   state=done;
                   }else if(a==';'){
                      tokens.offer(a);
                      ID.offer("FG");
                       output.append("\n"+"特殊符号: ;");
                   state=done;
                   }else if (a=='/'){
                     if(finish){
                         tokens.offer(a);

⌨️ 快捷键说明

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