亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? analyzer.java

?? 一種CMM語言的詞法分析
?? JAVA
字號:
/*
*  呂淵 200532580144
*  使用工具:eclipse
*  Java SE 6
*/
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.*;

public class Analyzer extends JApplet {
	//圖標
	ImageIcon openIcon = new ImageIcon("Icon/Open.png"),
		saveIcon = new ImageIcon("Icon/Save.png"),
		undoIcon = new ImageIcon("Icon/Undo.png"),
		redoIcon = new ImageIcon("Icon/Redo.png"),
		colorIcon = new ImageIcon("Icon/Color.png"),
		deleteAllIcon = new ImageIcon("Icon/Delete.png"),
		lexicalIcon = new ImageIcon("Icon/Lexical.png"),
		syntaxIcon = new ImageIcon("Icon/Syntax.png");
	
	//菜單項
	private JMenuItem jmiOpen = new JMenuItem("打開文件", openIcon);
	private JMenuItem jmiSaveInput = new JMenuItem("輸入內容另存為...", saveIcon);
	private JMenuItem jmiSaveResult = new JMenuItem("分析結果另存為...", saveIcon);
	private JMenuItem jmiExit = new JMenuItem("退出");
	private JMenuItem jmiUndo = new JMenuItem("撤消", undoIcon);
	private JMenuItem jmiRedo = new JMenuItem("重復", redoIcon);
	private JMenuItem jmiForeground = new JMenuItem("前景色", colorIcon);
	private JMenuItem jmiBackground = new JMenuItem("背景色", colorIcon);
	protected JMenuItem lexicalAnalyzer = new JMenuItem("詞法分析", lexicalIcon);
	protected JMenuItem syntaxAnalyzer= new JMenuItem("語法分析", syntaxIcon);
	protected JMenuItem jMenuClean = new JMenuItem("清空", deleteAllIcon);
	protected JMenu jMenuExe = new JMenu("運行(D)");//菜單項
	protected JMenuBar jMenuBar = new JMenuBar();//菜單
	
	private JLabel jlblStatus = new JLabel();//信息欄
	private JFileChooser jFileChooser = new JFileChooser(new File("."));//文件對話框
	private JTextArea lineNoArea = new JTextArea();//顯示行號
	protected JTextArea jta = new JTextArea();//輸入區域
	protected DefaultListModel listModel = new DefaultListModel();
	protected JList jlst = new JList(listModel);//輸出區域
	JSplitPane center = new JSplitPane();//中央區域
	
	public ArrayList<Integer> tokenStart = new ArrayList<Integer>();//對應輸出位置
	public ArrayList<Integer> tokenEnd = new ArrayList<Integer>();//對應輸出位置
	boolean change = true;//輸入文本改變
	int clickCount = 1;//雙擊JList次數
	
	LinkedList<String> buffer = new LinkedList<String>();//輸入內容緩沖
	final int maxSize = 100;//緩沖存儲上限
	int index = 0;//當前顯示內容在緩沖中的索引
	boolean flag = false;//是否使用快捷鍵控制索引顯示
	
	public Analyzer() {
		buffer.add("");
		
		//菜單
		JMenu jMenuFile = new JMenu("文件(F)");
		jMenuFile.setMnemonic('F');
		jMenuFile.add(jmiOpen);
		jMenuFile.addSeparator();
		jMenuFile.add(jmiSaveInput);
		jMenuFile.add(jmiSaveResult);
		jMenuFile.addSeparator();
		jMenuFile.add(jmiExit);

		JMenu jMenuEdit = new JMenu("編輯(E)");
		jMenuEdit.setMnemonic('E');
		jMenuEdit.add(jmiUndo);
		jMenuEdit.add(jmiRedo);
		
		JMenu jMenuShow = new JMenu("顯示(S)");
		jMenuShow.setMnemonic('S');
		jMenuShow.add(jmiForeground);
		jMenuShow.add(jmiBackground);
		
		jMenuExe.setMnemonic('D');
		jMenuExe.add(lexicalAnalyzer);
		jMenuExe.addSeparator();
		jMenuExe.add(syntaxAnalyzer);
		jMenuExe.addSeparator();
		jMenuExe.add(jMenuClean);
		
		jMenuBar.add(jMenuFile);
		jMenuBar.add(jMenuEdit);
		jMenuBar.add(jMenuShow);
		jMenuBar.add(jMenuExe);

		setJMenuBar(jMenuBar);
		
		//輸入文本區及行號顯示區域屬性及滾動
		jta.setEditable(true);
		jta.setFont(new Font(Font.SERIF, Font.PLAIN, 15));
		jta.setForeground(Color.BLUE);
		jta.setTabSize(1);
		lineNoArea.setFont(new Font(Font.SERIF, Font.PLAIN, 15));
		lineNoArea.setEditable(false);
		lineNoArea.setText("1");
		lineNoArea.setBackground(Color.LIGHT_GRAY);
		JPanel jplInput = new JPanel(new BorderLayout());
		jplInput.add(lineNoArea, BorderLayout.WEST);
		jplInput.add(jta, BorderLayout.CENTER);
		JScrollPane inputScrollPane = new JScrollPane(jplInput);
		inputScrollPane.setBorder(new TitledBorder("   請輸入   "));
		
		//JList輸出區域及滾動
		jlst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jlst.setFocusable(false);
		JScrollPane outputScrollPane = new JScrollPane(jlst);
		outputScrollPane.setBorder(new TitledBorder("   分析結果   "));
		
		JPanel jplRight = new JPanel(new GridLayout(2,1));
		jplRight.add(inputScrollPane);
		jplRight.add(outputScrollPane);
		
		center = new JSplitPane(1, 
				new JScrollPane(new JTree(new DefaultMutableTreeNode("Syntax Tree"))), jplRight);
		center.setContinuousLayout(true);
		center.setOneTouchExpandable(true);
		
		//添加信息欄及中央區域
		getContentPane().add(jlblStatus, BorderLayout.SOUTH);
		getContentPane().add(center, BorderLayout.CENTER);
		
		
		//操作快捷鍵
		lexicalAnalyzer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, ActionEvent.ALT_MASK));
		jmiOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
		jMenuClean.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.CTRL_MASK));
		syntaxAnalyzer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, ActionEvent.CTRL_MASK));
		jmiUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
		jmiRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.CTRL_MASK));
		
		//以下為監聽器注冊及實現
		/** 輸入文本區內容變化響應事件*/
		jta.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {}
			/** 刪除操作*/
			public void removeUpdate(DocumentEvent e) {
				clickCount = 0;
				change = true;
				showLineNo();//顯示行號
				if (flag == false) {
					if (index < buffer.size()-1) 
						buffer = new LinkedList<String>(buffer.subList(0, index+1));
					buffer.add(jta.getText());
					if (buffer.size() > maxSize) buffer.removeFirst();
					else index++;
				}
			}
			/** 輸入操作*/
			public void insertUpdate(DocumentEvent e) {
				clickCount = 0;
				change = true;
				showLineNo();//顯示行號
				if (flag == false) {
					if (index < buffer.size()-1) 
						buffer = new LinkedList<String>(buffer.subList(0, index+1));
					buffer.add(jta.getText());
					if (buffer.size() > maxSize) buffer.removeFirst();
					else index++;
				}
			}
		});
		

		/** 對JList進行雙擊的響應事件*/
		jlst.addMouseListener(new MouseAdapter() {
		    public void mouseClicked(MouseEvent e) {
				if (!change) { 
					try {
						int select = jlst.getSelectedIndex();
						int start = tokenStart.get(select);
						int end = tokenEnd.get(select);
						if (start >=0 ) jta.select(start, end);
						else if (start == -2) {
							int endT = tokenStart.size();
							for (int i = select+1; i < endT; i++)
								if (tokenStart.get(i) == -2) {
									endT = i;
									break;
								}
							clickCount++;
							if (clickCount == endT - select) clickCount = 1;
							start = tokenStart.get(select + clickCount);
							end = tokenEnd.get(select + clickCount);
							if (start != -3) jta.select(start, end);
						}
					}
					catch (Exception ex) {}
				}
		     }
		});
		
		/** JList改變選中的響應事件*/
		jlst.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent lse) {
				clickCount =0;
			}
		});
		
		/** 讀入文件*/
		jmiOpen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				open();
				showLineNo();
			}
		});
		
		/** 保存輸入*/
		jmiSaveInput.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				save(1);
			}
		});
		
		/** 保存結果*/
		jmiSaveResult.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				save(2);
			}
		});

		/** 結束程序*/
		jmiExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				System.exit(0);
			}
		});
		
		/** 撤消輸入*/
		jmiUndo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				if (index > 0) {
					flag = true;
					index--;
					jta.setText(buffer.get(index));
					flag = false;
				}
			}
		});
		
		/** 重復輸入*/
		jmiRedo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				if (index < buffer.size()-1) {
					flag = true;
					index++;
					jta.setText(buffer.get(index));
					flag = false;
				}
			}
		});
		
		/** 設置前景色*/
		jmiForeground.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Color selectedColor =
					JColorChooser.showDialog(null, "選擇前景色",
							jta.getForeground());

				if (selectedColor != null)
					jta.setForeground(selectedColor);
			}
		});

		/** 設置背景色*/
		jmiBackground.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Color selectedColor =
					JColorChooser.showDialog(null, "選擇背景色",
							jta.getForeground());

				if (selectedColor != null)
					jta.setBackground(selectedColor);
			}
		});
		
		/** 詞法分析*/
		lexicalAnalyzer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				center.setLeftComponent(new JScrollPane(
						new JTree(new DefaultMutableTreeNode("Syntax Tree"))));
				
				LexicalAnalyze lexical = new LexicalAnalyze(jta.getText());
				if (lexical.toArrayList().isEmpty()) 
					JOptionPane.showMessageDialog (null, "請輸入!", 
							"Notice", JOptionPane.INFORMATION_MESSAGE);
				else {
					tokenStart = lexical.tokenStart;
					tokenEnd = lexical.tokenEnd;
					listModel.clear();
					for(String value: lexical.toArrayList())
						listModel.addElement(value);
					change = false;
				}
			}
		});
		
		/** 語法分析*/
		syntaxAnalyzer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (jta.getText().trim().equals("")){
					JOptionPane.showMessageDialog (null, "請輸入!", 
							"Notice", JOptionPane.INFORMATION_MESSAGE);
				}
				else {
					SyntaxAnalyze syntax = new SyntaxAnalyze(jta.getText());
					listModel.clear();
					center.setLeftComponent(new JScrollPane(
							new JTree(new DefaultMutableTreeNode("Syntax Tree"))));
					for(String value: syntax.toArrayList())
						listModel.addElement(value);
					change = false;
					if (syntax.lexicalError == true) {
						JOptionPane.showMessageDialog (null, "詞法分析發現錯誤!", 
								"Notice", JOptionPane.INFORMATION_MESSAGE);
						tokenStart = syntax.tokenStart;
						tokenEnd = syntax.tokenEnd;
					}
					else if (syntax.syntaxError == true) {
						JOptionPane.showMessageDialog (null, "含有語法錯誤!", 
								"Notice", JOptionPane.INFORMATION_MESSAGE);
						tokenStart = syntax.tokenErrorStart;
						tokenEnd = syntax.tokenErrorEnd;
					}
					else {
						center.setLeftComponent(new JScrollPane(
								new JTree(new DefaultTreeModel(syntax.syntaxTree))));
						tokenStart = syntax.tokenRightStart;
						tokenEnd = syntax.tokenRightEnd;
					}
				}
			}
		});
		
		/** 清空*/
		jMenuClean.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				change = true;
				lineNoArea.setText("1");
				jta.setText(null);
				center.setLeftComponent(new JScrollPane(
						new JTree(new DefaultMutableTreeNode("Syntax Tree"))));
			}
		});
	}
	
	/** 顯示行號*/
	private void showLineNo() {
		String lineNo = "";
		for (int i = 1; i <= jta.getLineCount(); i++)
			if (i == 1)lineNo += "" + 1;
			else lineNo += "\n" + i;
		lineNoArea.setText(lineNo);
	}
	
	/** 打開文件*/
	private void open() {
		if (jFileChooser.showOpenDialog(this) ==
			JFileChooser.APPROVE_OPTION)
			open(jFileChooser.getSelectedFile());
	}
	
	private void open(File file) {
		try {
			jta.setText(null);
			BufferedReader input = new BufferedReader(
					new FileReader(file));
			String line;
			while ((line = input.readLine()) != null) {
				jta.append(line + "\n");
			}
			jta.setText(jta.getText().trim());
			input.close();

			jlblStatus.setText(file.getName() + " 已打開");
		}
		catch (IOException ex) {
			jlblStatus.setText(file.getName() + " 打開失敗!");
		}
	}

	/** 保存*/
	private void save(int x) {
		if (jFileChooser.showSaveDialog(this) ==
			JFileChooser.APPROVE_OPTION) {
			save(jFileChooser.getSelectedFile(), x);
		}
	}
	
	private void save(File file, int x) {
		try {
			BufferedWriter output =
			      new BufferedWriter(new FileWriter(file));
			if (x == 1) output.write(jta.getText());
			else {
				String result = "";
				for(int i = 0; i < jlst.getModel().getSize(); i++) 
					result += jlst.getModel().getElementAt(i) + "\n";
				output.write(result);
			}
			output.close();

			jlblStatus.setText(file.getName()  + " 已保存 ");
		}
		catch (IOException ex) {
			jlblStatus.setText(file.getName()  + " 保存失敗! ");
		}
	}
	
	public static void main(String[] args) {
		Analyzer applet = new Analyzer();
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(3);
		frame.setTitle("CMM Analyzer Beta4");
		frame.getContentPane().add(applet, BorderLayout.CENTER);
		applet.init();
		applet.start();
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setSize(d.width*4/5,d.height*4/5);
		frame.setLocation(d.width / 10, d.height / 10);
		frame.setVisible(true);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
又紧又大又爽精品一区二区| 亚洲美女电影在线| 自拍偷在线精品自拍偷无码专区| 在线中文字幕一区| 国产精品视频看| 亚洲一区二区五区| 国产一区二区三区不卡在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲国产人成综合网站| 国产一区二区免费视频| 欧美精品亚洲一区二区在线播放| 欧美激情一区二区三区在线| 麻豆精品视频在线| 欧美日韩精品福利| 悠悠色在线精品| 成人aa视频在线观看| 精品久久久久久久久久久久久久久| 一区二区三区在线免费观看| 亚洲6080在线| 欧美亚洲一区二区在线| 国产三级精品视频| 精品一区二区免费在线观看| 欧美三级中文字幕在线观看| 亚洲丝袜另类动漫二区| 粉嫩13p一区二区三区| 欧美精品一区二区在线播放| 亚洲国产aⅴ天堂久久| 色先锋久久av资源部| 亚洲视频电影在线| 91在线精品秘密一区二区| 国产精品网曝门| www.在线成人| 国产精品理论片在线观看| 成人综合在线观看| 国产欧美一区二区三区网站| 国产99一区视频免费| 久久久高清一区二区三区| 国产在线国偷精品免费看| 亚洲精品一区二区三区在线观看| 久久精品国产亚洲一区二区三区| 日韩精品中文字幕一区 | www.一区二区| 亚洲男女一区二区三区| 一本一道久久a久久精品 | 91视频精品在这里| 国产欧美中文在线| 不卡大黄网站免费看| 国产精品热久久久久夜色精品三区| 国产成人在线影院| 亚洲日本一区二区三区| 欧美在线视频日韩| 美女免费视频一区二区| 精品福利在线导航| www.亚洲免费av| 亚洲在线免费播放| 日韩小视频在线观看专区| 成人av在线一区二区| 亚洲最色的网站| 日韩一区二区免费高清| 国产成人精品aa毛片| 亚洲天堂网中文字| 欧美人xxxx| 国产伦精一区二区三区| 亚洲女人小视频在线观看| 欧美日韩视频一区二区| 国产一区二区三区四| 亚洲天堂网中文字| 久久精品国产网站| 久久亚洲免费视频| 成人av网址在线观看| 亚洲国产视频在线| 精品国产百合女同互慰| 91免费观看视频在线| 日本亚洲天堂网| 国产精品麻豆一区二区 | 国产精品资源在线观看| 亚洲欧美日韩系列| 久久午夜老司机| 欧美色视频一区| 国产成人av影院| 三级欧美在线一区| 中文字幕在线不卡国产视频| 日韩一级黄色片| 91免费国产在线观看| 国产麻豆视频精品| 午夜视频在线观看一区二区 | 欧美色视频在线| 成人激情视频网站| 美女精品一区二区| 亚洲国产一区二区视频| 欧美国产1区2区| 日韩天堂在线观看| 欧美日韩成人在线| 91免费精品国自产拍在线不卡| 国产麻豆精品在线观看| 日本系列欧美系列| 午夜视频在线观看一区二区三区| 亚洲欧美一区二区在线观看| 精品国产免费一区二区三区四区| 欧美日韩第一区日日骚| 在线观看视频一区二区欧美日韩| 国产aⅴ综合色| 国产成人免费在线观看不卡| 另类专区欧美蜜桃臀第一页| 亚洲成人av免费| 一区二区三区美女视频| 中文字幕综合网| 国产精品网曝门| 中文字幕成人在线观看| 久久精品视频网| 精品国产免费一区二区三区四区| 6080国产精品一区二区| 欧美日韩性生活| 欧美日韩aaaaa| 91精品国产高清一区二区三区蜜臀| 欧美日韩国产小视频| 欧美日韩国产不卡| 91精品国模一区二区三区| 欧美福利电影网| 日韩一级片网址| 精品毛片乱码1区2区3区| 精品欧美久久久| 久久久久久久久一| 欧美韩国日本综合| 亚洲天堂2014| 亚洲一二三区在线观看| 亚洲成av人片一区二区梦乃| 亚洲国产成人porn| 日韩av电影天堂| 激情综合色播激情啊| 国产福利不卡视频| k8久久久一区二区三区| 欧亚洲嫩模精品一区三区| 欧美女孩性生活视频| 欧美一区二区美女| 久久久噜噜噜久噜久久综合| 亚洲成人动漫av| 看电影不卡的网站| 高清av一区二区| 欧美性猛交一区二区三区精品| 欧美精品一二三四| 久久久青草青青国产亚洲免观| 国产精品欧美一级免费| 一区二区三区四区不卡在线| 日韩1区2区3区| 国产成人精品免费网站| 欧美在线啊v一区| 精品精品国产高清a毛片牛牛| 国产精品美女久久福利网站| 亚洲国产一区在线观看| 国产伦理精品不卡| 在线亚洲一区观看| 欧美精品一区二区三区很污很色的| 日本一区二区不卡视频| 亚洲h在线观看| 国产成人免费视频网站| 欧美影片第一页| 国产区在线观看成人精品| 亚洲国产aⅴ天堂久久| 国产一区二区美女诱惑| 欧美无乱码久久久免费午夜一区 | 免费观看在线综合色| 不卡的电视剧免费网站有什么| 欧美高清一级片在线| 国产精品女主播av| 免费观看成人鲁鲁鲁鲁鲁视频| 99国产精品久| www欧美成人18+| 日日摸夜夜添夜夜添精品视频| 成人91在线观看| 久久免费偷拍视频| 日本系列欧美系列| 色综合久久久网| 日本一区二区三区在线观看| 五月婷婷久久综合| 色呦呦国产精品| 欧美激情一区二区三区不卡| 麻豆精品精品国产自在97香蕉| 91精品福利视频| 亚洲欧洲韩国日本视频| 国产综合久久久久久鬼色| 欧美人妖巨大在线| 一区二区三区欧美| 色婷婷综合久色| 中文字幕日韩欧美一区二区三区| 国产精品资源在线看| 精品国产一区久久| 日本v片在线高清不卡在线观看| 在线亚洲+欧美+日本专区| 国产精品传媒入口麻豆| 国产成人精品免费视频网站| 欧美videofree性高清杂交| 偷拍日韩校园综合在线| 日本韩国一区二区| 一区二区三区久久| 日本精品免费观看高清观看| 亚洲欧美日韩国产一区二区三区| av在线一区二区| 亚洲视频精选在线| 91麻豆国产福利在线观看|