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

📄 translate.java

📁 编译原理实验
💻 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 + -