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

📄 test.txt

📁 具有图形化界面的词法分析器
💻 TXT
字号:
//用Java写的词法分析器
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.StringTokenizer;

public class Test extends JFrame 
 {
  
  private MenuBar bar = new MenuBar();
  
  private Menu menuFile = new Menu("文件");
  private Menu menuEdit = new Menu("编辑");
  private Menu  menuHelp = new Menu("帮助");
  
  private MenuItem menuFileOpen = new MenuItem("打开");
  //private MenuItem menuFileSave = new MenuItem("保存");
  //private MenuItem menuFileSaveAs = new MenuItem("另存为");
  private MenuItem menuFileQuit = new MenuItem("退出");
  
 // private MenuItem menuEditRun = new MenuItem("运行");
 // private MenuItem menuEditStop = new MenuItem("停止");
  
  private MenuItem menuHelpCenter = new MenuItem("关于");
 // private MenuItem menuHelpAbout = new MenuItem("帮助中心");
  
  private JButton beginButton = new JButton("运行");
  private JButton cleanButton= new JButton("清空");
  private JButton keyButton = new JButton("关键字");
  
  private JLabel inLabel = new JLabel("输入代码");
  private JLabel beginButton6= new JLabel("分析结果");
  Font fon=new Font("Dialog",Font.PLAIN,18);
  private TextArea inTextArea = new TextArea(30,32);
  //inTextArea.setFont(BOLD);
 // inTextArea.setFont(BOLD);
  private TextArea outTextArea = new TextArea(30,32);
  
  private TextArea keyTextArea = new  TextArea(30,32);
  
  private JPanel pane = new JPanel();
  
  String[] keyWords = {"auto","break","case","char","const","continue",
  "default","do","double","else","enum","float","for","goto","if","int",
  "long","rebister","return","short","signed","sizeof","static","struct",
  "switch","typedef","union","unsigned","void","volatile","while","main"};
  
  String[] operator = {"+","-","*","/","%","=",".",">","<","?",","};
  
  String[] sepretor = {";",":","{","}","(",")","[","]"};
  
  /*
   *菜单栏
   */
  
  private void initconter()  
  {
   menuFile.add(menuFileOpen);
  // menuFile.add(menuFileSave);
  // menuFile.add(menuFileSaveAs);
   menuFile.addSeparator();
   menuFile.add(menuFileQuit);
   
//   menuEdit.add(menuEditRun);
   //menuEdit.add(menuEditStop);
    
   menuHelp.add(menuHelpCenter);
//   menuHelp.add(menuHelpAbout);
   
   
   
   bar.add(menuFile);
   //bar.add(menuEdit);
   bar.add(menuHelp);
   
      
  }
  
  
  /*
   *布局管理器
   */
   void buildConstraints(GridBagConstraints gbc, 
   int gx, int gy,int gw,int gh,int wx, int wy)
    {
   gbc.gridx = gx;
   gbc.gridy = gy;
   gbc.gridwidth = gw;
   gbc.gridheight = gh;
   gbc.weightx = wx;
   gbc.weighty = wy;
    }
 
   /*
    *布局键面
    */
  private void setMyPane()
  {
   
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
       
      pane.setLayout(gridbag);
      
      
      buildConstraints(constraints, 0,0,1,1,25,5);
      constraints.fill = GridBagConstraints.VERTICAL;
      gridbag.setConstraints(inLabel,constraints);
      pane.add(inLabel);
      
        
      buildConstraints(constraints, 1,0,1,1,25,0);
      gridbag.setConstraints(beginButton,constraints);
      pane.add(beginButton);
      
      
      
      buildConstraints(constraints, 0,1,2,3,25,90);
      gridbag.setConstraints(inTextArea,constraints);
      inTextArea.setFont(fon);
      pane.add(inTextArea);
      
      buildConstraints(constraints, 3,1,2,3,0,0);
      gridbag.setConstraints(keyTextArea,constraints);
      keyTextArea.setFont(fon);
      pane.add(keyTextArea);
     
       
      buildConstraints(constraints, 6,1,2,3,0,0);      
      gridbag.setConstraints(outTextArea,constraints);
      outTextArea.setFont(fon);
      pane.add(outTextArea);
      
     buildConstraints(constraints, 4,0,1,1,25,0);
      gridbag.setConstraints(keyButton,constraints);
      pane.add(keyButton);
      
      
      buildConstraints(constraints, 6,0,1,1,25,0);
      gridbag.setConstraints(cleanButton,constraints);
      pane.add(cleanButton);
      
      
      
      buildConstraints(constraints, 7,0,1,1,25,0);
      gridbag.setConstraints(beginButton6,constraints);
      pane.add(beginButton6);
        initconter();
      
      
     setMenuBar(bar);
   //setVisible(true);
   setLocation(200,80);
   setContentPane(pane);
  }
  /*
   *添加事件监听器
   */
   
  private void initListener()
   {
    ActListener actListener = new ActListener();
    
    menuFileOpen.addActionListener(actListener);
    menuFileQuit.addActionListener(actListener);
    
//    menuEditRun.addActionListener(actListener);
    
    menuHelpCenter.addActionListener(actListener);
    
    beginButton.addActionListener(actListener);
    cleanButton.addActionListener(actListener);
    keyButton.addActionListener(actListener);
   } 
    /*
     *构建事件监听器
     */
     class ActListener implements ActionListener
      {
      public void actionPerformed(ActionEvent e)
     {
     if(e.getSource() == menuFileOpen)
           {
          openFile(); 
               }
        if(e.getSource() == menuFileQuit)
        {
         System.exit(0);
        }
        if(e.getSource() == beginButton)
        {
         porRun();
        }
        if(e.getSource() == keyButton)
        {
         keyRun();
        }
//        if(e.getSource()==menuEditRun)
        //{
        // porRun();
        //}
        if(e.getSource() == menuHelpCenter)
        {
         JOptionPane.showMessageDialog(Test.this, "开发者:张勰柽,孙静,戴佳丽\n上海财经大学");
        }
        if(e.getSource()==cleanButton)
        {
         inTextArea.setText("");
         outTextArea.setText("");
         keyTextArea.setText("");
        }
        }
      } 
      
    //打开文件实现  
   // private String text; 
  private void openFile()
  {
    try{    
          JFileChooser jFileChooser = new JFileChooser();
           jFileChooser.showOpenDialog(pane);
        String fileName =null; 
        fileName =jFileChooser.getSelectedFile().getPath();
        File file = new File(fileName);
        int fLength;
        fLength = (int) file.length();
        int num = 0;
        FileReader fReader = new FileReader(file);
        char[] date = new char[fLength];
        while(fReader.ready())
          {
             num += fReader.read(date, num, fLength - num);
          }
       
        fReader.close();
        inTextArea.setText(new String(date, 0,num));
            
      }catch(IOException f){}
       
  }
  private void keyRun()
  {
       for(int i2=0;i2<keyWords.length;i2++)  //输出关键字
       {
        
         keyTextArea.append(keyWords[i2]+"-->"+(3+i2)+"\n");
       }
  }   //显示关键字
  private void porRun() //分析过程
  {
      String inText = inTextArea.getText();
      //String inText = ("main() int a= 1;");
  //String[] keyWords = {"main()","int"};
  
      StringTokenizer str1 = new StringTokenizer(inText," \n\t\r;+=-\"\')(}{][<>,*",true);
             //\n\t等为自定义的分隔符
      
      int n = str1.countTokens();//一共得到n个字符
     
      String[] intext = new String[str1.countTokens()];
      for(int a = 0;a<n;a++)
      {
    intext[a] = str1.nextToken();
  }
  outTextArea.append(" 常数-->1 标识符-->2"+"\n");
      outTextArea.append("====================================\n");
      for(int i1=0;i1<intext.length;i1++)
      {
       
    outer:    for(int i2=0;i2<keyWords.length;i2++)  //判断为保留字
         {
        
         if(intext[i1].equals(keyWords[i2]))
           {
        
          //System.out.println(intext[i1]+"    1");
          outTextArea.append(intext[i1]+" "+(i2+3)+"\n");//第一个关键字排号为3
          i1++;                 
        
          break outer; 
         }
       
        }
       for(int i3=0;i3<operator.length;i3++)    //判断为运算符
          {
          if(intext[i1].equals(operator[i3]))
         outTextArea.append(intext[i1]+" "+(i3+3+keyWords.length)+"\n");//第一个运算符排序前有关键字
         }
     for(int i4=0;i4<sepretor.length;i4++)
     {
         if(intext[i1].equals(sepretor[i4]))
         {//判断为分隔符
              
           outTextArea.append(intext[i1]+" "+(i4+3+keyWords.length+operator.length)+"\n");
         }//第一个分隔符排序前有关键字+运算符
     }
     char[] inChar=intext[i1].toCharArray();
     if(Character.isDigit(inChar[0]))
       outTextArea.append(intext[i1]+"  1"+"\n");
     if(Character.isLetter(inChar[0])) 
       outTextArea.append(intext[i1]+"  2"+"\n");
     
      }   
  }
 
  public Test()
  {    
   super("词法分析器");
   setSize(800,600);
   //getContentPane().setBackground(Color.RED);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
   initListener();
   setMyPane();
   show();
   porRun(); 
  } 
    public static void main(String[] args) 
     {
      Test t = new Test(); 
     }
}

⌨️ 快捷键说明

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