📄 translate.java
字号:
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class Translate extends JFrame
{
//
protected final static JPanel sourcePane=new JPanel();
protected final static JPanel scanPane=new JPanel();
protected final static JPanel parsePane=new JPanel();
protected final static JPanel alizePane=new JPanel();
//文本区,设为全局静态变量,为词法分析,语法分析,语义分析提供输入输出
private JTextArea sourceArea=new JTextArea(20,40);
protected static StringBuffer sourceCode=new StringBuffer();
protected static JTextArea scanArea=new JTextArea(20,40);
protected static JTextArea parseArea=new JTextArea(20,40);
protected static JTextArea alizeArea=new JTextArea(20,40);
//菜单栏
private JMenuItem openFile;
private JMenuItem saveFile;
private JMenuItem exit;
private JMenuItem help;
protected static JMenuItem scanner; //词法分析选项
protected static JMenu parseL=new JMenu("语法分析");
protected static JMenuItem[] parse=new JMenuItem[2];//语法分析选项
protected static JMenuItem analyse;//语义分析阶段
private JMenuItem repeatItem=new JMenuItem();
//最小化图标
private static Image image;
//构造函数
public Translate()
{
sourcePane.add(sourceArea);
//sourcePane.setBorder(new LineBorder(new Color(255,0,0),10));
sourcePane.setBorder(new TitledBorder("源代码输入"));
sourceArea.setBorder(new LineBorder(Color.green,2));
sourceArea.setEditable(false);
scanPane.add(scanArea);
scanPane.setBorder(new TitledBorder("词法分析输出"));
//scanPane.setBorder(new LineBorder(Color.red,5));
scanArea.setEditable(false);
scanArea.setBorder(new LineBorder(Color.orange,2));
parsePane.setBorder(new TitledBorder("语法分析输出"));
parseArea.setBorder(new LineBorder(Color.BLUE,2));
parseArea.setEditable(false);
parsePane.add(parseArea);
alizePane.setBorder(new TitledBorder("语义分析输出"));
alizeArea.setBorder(new LineBorder(Color.gray,2));
alizeArea.setEditable(false);
alizePane.add(alizeArea);
Container container=super.getContentPane();
container.setLayout(new GridLayout(2,2));
//JScrollPane scrollPane=new JScrollPane();
//scrollPane.setRowHeaderView(sourcePane);
container.add(new JScrollPane(sourcePane));
container.add(new JScrollPane(scanPane));
container.add(new JScrollPane(parsePane));
container.add(new JScrollPane(alizePane));
//初始菜单栏
JMenuBar jmenubar=new JMenuBar();
setJMenuBar(jmenubar);
JMenu file=new JMenu("文件");
jmenubar.add(file);
file.add(openFile=new JMenuItem("打开文件"));
file.add(saveFile=new JMenuItem("保存文件"));
file.add(exit=new JMenuItem("退出"));
openFile.setAccelerator(KeyStroke.getKeyStroke('O',2));
saveFile.setAccelerator(KeyStroke.getKeyStroke('S',2));
exit.setAccelerator(KeyStroke.getKeyStroke('Q',2));
JMenu translate=new JMenu("编译");
jmenubar.add(translate);
translate.add(scanner=new JMenuItem("词法分析"));
translate.add(parseL);
parseL.add(parse[0]=new JMenuItem("递归下降法"));
parseL.add(parse[1]=new JMenuItem("LL1分析法"));
translate.add(analyse=new JMenuItem("语义分析"));
//先不进行词法语法语义分析
scanner.setEnabled(false);
parseL.setEnabled(false);
analyse.setEnabled(false);
//设置快捷键
scanner.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11,2));
parse[0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F10,2));
parse[1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9,2));
analyse.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F8,2));
JMenu helpMenu=new JMenu("帮助");
helpMenu.add(help=new JMenuItem("帮助"));
help.setAccelerator(KeyStroke.getKeyStroke('H',2));
jmenubar.add(helpMenu);
JMenu repeat=new JMenu("重置");
repeat.add(repeatItem=new JMenuItem("重置"));
repeatItem.setAccelerator(KeyStroke.getKeyStroke('R',2));
jmenubar.add(repeat);
//事件驱动
openFile.addActionListener(new OpenFile());
saveFile.addActionListener(new SaveFile());
exit.addActionListener(new Exit());
scanner.addActionListener(new Scanner());
parse[0].addActionListener(new ParseA());
parse[1].addActionListener(new ParseB());
analyse.addActionListener(new Analyse());
help.addActionListener(new Help());
repeatItem.addActionListener(new RepeatMenu());
URL url=this.getClass().getResource("image/孙艺珍.jpg");
image=new ImageIcon(url).getImage();
}
public static void main(String[] args)
{
Translate frame=new Translate();
frame.setTitle("编译器");
frame.setIconImage(image);
frame.pack();
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//打开文件并显示原文件
private class OpenFile implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
JFileChooser c=new JFileChooser();
int rVal=c.showOpenDialog(Translate.this);
if(rVal == JFileChooser.APPROVE_OPTION)
{
try
{
int i=1;
sourceArea.setText("");
BufferedReader in=new BufferedReader(new FileReader(c.getSelectedFile().getPath()));
String s;
while( (s=in.readLine()) != null)
{
sourceArea.append((i++)+" "+s+"\n");
sourceCode.append(s+"\n");
}
//sourceCode.deleteCharAt(sourceCode.length()-2);
//去掉文件结尾多余的空格以及换行符,方便词法分析处理
//sourceCode.deleteCharAt(sourceCode.length()-1);
char ch;
//int j=1;
while((ch=sourceCode.charAt(sourceCode.length()-1))==' '|| ch == '\n' || ch =='\t')
{
sourceCode.deleteCharAt(sourceCode.length()-1);
}
//sourceCode.setLength(sourceCode.length()-j+1);
//sourceCode.deleteCharAt(sourceCode.length()-1);
in.close();
}catch(IOException ex)
{
ex.printStackTrace();
}
}
scanner.setEnabled(true);
}
}
//保存经过编译后的代码
private class SaveFile implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JFileChooser c=new JFileChooser();
int rVal=c.showSaveDialog(Translate.this);
if(rVal == JFileChooser.APPROVE_OPTION)
{
try
{
PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(c.getSelectedFile().getPath())));
out.print(scanArea.getText());
out.close(); //一定要关闭文件,否者缓冲区的东西不会输出到文件中去
}catch(IOException ex)
{
ex.printStackTrace();
}
}
}
}
//退出
private class Exit implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
//帮助文档
private class Help implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null,"此编译器版本为V-1.0,为了为广大用户提供一个好的编译器,如有错误:\n请致电taoshui123@163.com,后期版本将尽量满足用户的要求");
}
}
//重置
private class RepeatMenu implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//清除源代码输入
sourceCode.append("");
//清除词法分析结果
sourceArea.setText("");
scanArea.setText("");
Scanner.list.clear();
Scanner.number=1;
Scanner.error.clear();
Scanner.isError=false;
//清除语法分析结果
parseArea.setText("");
ParseA.error.clear();
ParseA.isError=false;
scanner.setEnabled(false);
parseL.setEnabled(false);
analyse.setEnabled(false);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -