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

📄 scan.java

📁 用java写的词法分析器
💻 JAVA
字号:
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import  java.io.*;

public class Scan extends JFrame {

 private static final long serialVersionUID = 1L;

 

 private JPanel jContentPane = null;

 private JMenuBar jJMenuBar = null;

 private JMenu jMenuFile = null;

 private JMenu jMenuAbout = null;

 private JLabel jLabelIn = null;

 private JLabel jLabelOut = null;

 private JTextArea jTextAreaIn = null;

 private JTextArea jTextAreaOut = null;

 private JButton jButtonClear = null;

 private JButton jButtonScan = null;

 private JButton jButtonSave = null;

 private JButton jButtonExit = null;


 private JMenuItem jMenuItemAbout = null;

 private JMenuItem jMenuItemAboutAuthor = null;

 private JLabel jLabelStatus = null;

 private String jTextAreaStr = "";

 
 private JMenuBar getJJMenuBar() {
  if (jJMenuBar == null) {
   jJMenuBar = new JMenuBar();
  // jJMenuBar.add(getJMenuFile());
   jJMenuBar.add(getJMenuAbout());
  }
  return jJMenuBar;
 }

 

 

 private JMenu getJMenuAbout() {
  if (jMenuAbout == null) {
   jMenuAbout = new JMenu();
   jMenuAbout.setText("帮助");
   jMenuAbout.add(getJMenuItemAbout());
   jMenuAbout.add(getJMenuItemAboutAuthor());
  }
  return jMenuAbout;
 }

 

 private JTextArea getJTextAreaIn() {
  if (jTextAreaIn == null) {
   jTextAreaIn = new JTextArea();
   jTextAreaIn.setBounds(new Rectangle(122, 4, 412, 150));
  }
  return jTextAreaIn;
 }


   //这里设置输出区
 private JTextArea getJTextAreaOut() {
  if (jTextAreaOut == null) {
   jTextAreaOut = new JTextArea();
   jTextAreaOut.setEditable(false);
   jTextAreaOut.setBounds(new Rectangle(122, 160, 412, 150));
  }
  return jTextAreaOut;
 }


  //这里清空文本区的设置
 private JButton getJButtonClear() {
  if (jButtonClear == null) {
   jButtonClear = new JButton();
   jButtonClear.setBounds(new Rectangle(67, 315, 80, 20));
   jButtonClear.setText("清空");
   jButtonClear.addActionListener(new java.awt.event.ActionListener(){
   public void actionPerformed(java.awt.event.ActionEvent e){

jTextAreaIn.replaceRange("", 0 , jTextAreaIn.getText().length()) ;
jTextAreaOut.replaceRange("", 0 , jTextAreaOut.getText().length()) ;//清空文本区的内容

jTextAreaStr = "";//文件名清空
}

});
  }
  return jButtonClear;
 }

 // ////////////////////////////////////////////////////////////////////////////////////////////////
 // 标识符 字母|字母 数字
 // 关键字 else if int return void while main
 // 符号 +-*/
 // 数字 0123456789
 // private String exp;
 // ///////////////////////////////////////////////////////////////////////////////////////////////
 private int expIdx;

 private boolean isDigit;

 private String token = "";

 private void getToken(String exp) {

  if (expIdx == exp.length()) {
   System.out.println("扫描结束");
  }

  while (expIdx < exp.length() && exp.charAt(expIdx) == '\n')
   ++expIdx;

  if (expIdx == exp.length()) {
   System.out.println("扫描结束");
  }

  if (isDelim(exp.charAt(expIdx))) {

   token += exp.charAt(expIdx);

   switch (token.toCharArray()[0]) {
   case '\n':
    break;
   case '<':
    out("小于号", token);
    break;
   case '>':
    out("大于号", token);
    break;
   case '=':
    out("等于号", token);
    break;
   case '+':
    out("加号", token);
    break;
   case '-':
    out("减号", token);
    break;
   case '*':
    out("乘号", token);
    break;
   case '/':
    out("除号", token);
    break;
   case '(':
    out("左小括号", token);
    break;
   case ')':
    out("右小括号", token);
    break;
   case '[':
    out("左中括号", token);
    break;
   case ']':
    out("右中括号", token);
    break;
   case '{':
    out("左大括号", token);
    break;
   case '}':
    out("右大括号", token);
    break;
   case ',':
    out("逗号", token);
    break;
   case ';':
    out("分号", token);
    break;
   case ' ':
    break;
   default:
    out("不是c语言允许的符号!", token);
    break;
   }
   expIdx++;
   // ///////////////////////////////////
   token = "";
  }
  else if (Character.isLetter(exp.charAt(expIdx))) {
   while (!isDelim(exp.charAt(expIdx)) && exp.charAt(expIdx) != '\n') {
    token += exp.charAt(expIdx);
    expIdx++;

    if (expIdx >= exp.length())
     break;
   }
   if (check(token))
    out("关键字", token);
   else
    out("标识符", token);
   // ///////////////////////////////////
   token = "";

  }

  else if (Character.isDigit(exp.charAt(expIdx))) {

   while (!isDelim(exp.charAt(expIdx)) && exp.charAt(expIdx) != '\n') {
    isDigit = true;
    if (Character.isLetter(exp.charAt(expIdx))) {
     isDigit = false;
    }
    token += exp.charAt(expIdx);
    expIdx++;
    if (expIdx >= exp.length())
     break;
   }
   if (isDigit == true)
    out("数字" ,token);
   else
    out("非法字符"  , token);
   // ///////////////////////////////////
   token = "";
  } else {
   JOptionPane.showMessageDialog(jContentPane, "出现了本系统无法识别字符,请重新输入……",
     "出错", JOptionPane.ERROR_MESSAGE);
   expIdx = jTextAreaStr.length();
  }
 }

 private boolean isDelim(char c) {
  if ((" +-*/;><=,()[]{}".indexOf(c) != -1)) {
   return true;
  }
  return false;
 }

 String[] keyword = { "else", "if", "int","else if", "return", "void", "while", "main","char" };

 private boolean check(String s) {
  int i = 0;
  while (i < keyword.length) {
   if (s.equals(keyword[i])) {
    return true;
   }
   i++;
  }
  return false;
 }

 private void out(String s, String s1) {
  jTextAreaOut.append("(" + s + "," + s1 + ")" + '\n');
 }

 

 private JButton getJButtonScan() {
  if (jButtonScan == null) {
   jButtonScan = new JButton();
   jButtonScan.setBounds(new Rectangle(182, 315, 80, 20));
   jButtonScan.setText("扫描");
   // //////////////////////////////////////////////////////////////////////
 
   // ///////////////////////////////////////////////////////////////////////
   jButtonScan.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
     jTextAreaOut.setText("");
     jTextAreaStr = "";
     // jTextAreaStr=new String();
     jTextAreaStr = jTextAreaIn.getText();
     // //////////////////////////////////////////////////////////////////
     expIdx = 0;// 初始化
     // //////////////////////////////////////////////////////////////////
     while (expIdx <= jTextAreaStr.length()) {
      getToken(jTextAreaStr);
     }
     jTextAreaStr = "";
    }
   });
   // //////////////////////////////////////////////////////////////////////
  }
  return jButtonScan;
 }


 private JButton getJButtonSave() {
  if (jButtonSave == null) {
   jButtonSave = new JButton();
   jButtonSave.setBounds(new Rectangle(67, 347, 80, 20));
   jButtonSave.setText("保存");
   jButtonSave.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent e)
{
try
{
FileOutputStream fos=new FileOutputStream(new File("分析的结果.txt"));
OutputStreamWriter osw=new OutputStreamWriter(fos);
String saveString=jTextAreaOut.getText().replaceAll("\n","\r\n");
osw.write(saveString);
osw.flush();
osw.close();
}catch(Exception ee)
{
ee.printStackTrace();
}
}
}
);
setVisible(true);
}
  return jButtonSave;
 }


 private JButton getJButtonExit() {
  if (jButtonExit == null) {
   jButtonExit = new JButton();
   jButtonExit.setBounds(new Rectangle(182, 347, 80, 20));
   jButtonExit.setText("退出");
   jButtonExit.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
     System.exit(0);
    }
   });
  }
  return jButtonExit;
 }
 private JMenuItem getJMenuItemAbout() {
  if (jMenuItemAbout == null) {
   jMenuItemAbout = new JMenuItem();
   jMenuItemAbout.setText("关于系统");
   jMenuItemAbout
     .addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
       JOptionPane.showMessageDialog(jContentPane,
         "你好!这是一个C语言的词法分析器", "关于系统",
         JOptionPane.INFORMATION_MESSAGE);
      }
     });
  }
  return jMenuItemAbout;
 }


 private JMenuItem getJMenuItemAboutAuthor() {
  if (jMenuItemAboutAuthor == null) {
   jMenuItemAboutAuthor = new JMenuItem();
   jMenuItemAboutAuthor.setText("作者信息");
   jMenuItemAboutAuthor
     .addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
       JOptionPane
         .showMessageDialog(
           jContentPane,
           "///////////////////////////////",
           "作者信息",
           JOptionPane.INFORMATION_MESSAGE);
      }
     });
  }
  return jMenuItemAboutAuthor;
 }


 public static void main(String[] args) {

  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    Scan thisClass = new Scan();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setVisible(true);
   }
  });
 }


 public Scan() {
  super();
  initialize();
 }


 private void initialize() {
  this.setSize(550, 440);
  this.setLocation(150, 150);
  this.setJMenuBar(getJJMenuBar());
  this.setContentPane(getJContentPane());
  this.setTitle("*****欢迎使用本系统!*****" );
 }
 private JPanel getJContentPane() {
  if (jContentPane == null) {
   jLabelStatus = new JLabel();
   jLabelStatus.setBounds(new Rectangle(303, 319, 184, 55));
 //  jLabelStatus.setText("loading");
   jLabelOut = new JLabel();
   jLabelOut.setBounds(new Rectangle(18, 200, 90, 50));
   jLabelOut.setText("扫描结果:");
 jLabelIn = new JLabel();

   jLabelIn.setBounds(new Rectangle(18, 2, 90, 50));
   jLabelIn.setText("在这输入:");
   jContentPane = new JPanel();
   jContentPane.setLayout(null);
   jContentPane.add(jLabelIn, null);
   jContentPane.add(jLabelOut, null);
   jContentPane.add(getJTextAreaIn(), null);//输入区
   jContentPane.add(getJTextAreaOut(), null);//输出区
   jContentPane.add(getJButtonClear(), null);
   jContentPane.add(getJButtonScan(), null);
   jContentPane.add(getJButtonSave(), null);
   jContentPane.add(getJButtonExit(), null);
   jContentPane.add(jLabelStatus, null);
  }
  return jContentPane;
 }

}

⌨️ 快捷键说明

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