📄 scan.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 + -