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

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

?? executor.java

?? 一種CMM語言的詞法分析
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
/*
*  呂淵 200532580144
*  使用工具:eclipse
*  Java SE 6
*  
*  完成日期:2007-11-15
*  最后修改:2007-12-12
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Executor extends Analyzer{
	//圖標
	ImageIcon ExecuteIcon = new ImageIcon("Icon/Execute.png");
	
	//菜單項
	private JMenuItem jmiExecute = new JMenuItem("執行代碼", ExecuteIcon);
	private JMenuItem jmiExplain = new JMenuItem("更新及使用說明");
	private JMenuItem jmiAboutExe = new JMenuItem("關于執行代碼");
	
	private ArrayList<Variable> intList = new ArrayList<Variable>();//當前可用普通變量
	private ArrayList<ArrayVariable> arrList = new ArrayList<ArrayVariable>();//當前可用數組變量
	
	public Executor() {
		//菜單
		jMenuExe.removeAll();
		jMenuExe.add(lexicalAnalyzer);
		jMenuExe.add(syntaxAnalyzer);
		jMenuExe.add(jmiExecute);
		jMenuExe.addSeparator();
		jMenuExe.add(jMenuClean);
		
		JMenu jmiAbout = new JMenu("關于(A)");
		jmiAbout.setMnemonic('A');
		jmiAbout.add(jmiExplain);
		jmiAbout.addSeparator();
		jmiAbout.add(jmiAboutExe);
		
		jMenuBar.add(jmiAbout);
		
		//操作快捷鍵
		jmiExecute.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK));
		
		/** 執行*/
		jmiExecute.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				//輸入為空
				if (jta.getText().trim().equals(""))
					JOptionPane.showMessageDialog (null, "請輸入!", 
							"Notice", JOptionPane.INFORMATION_MESSAGE);
				else {
					SyntaxAnalyze syntax = new SyntaxAnalyze(jta.getText());
					
					//語法分析發現錯誤
					if (syntax.syntaxError == true) {
						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))));
						Execute(syntax);
					}
					change = false;
				}
			}
		});
		
		//更新及使用說明
		jmiExplain.addActionListener(new DialogAdapter(1));
		
		//關于執行代碼
		jmiAboutExe.addActionListener(new DialogAdapter(2));
	}	
	
	public static void main(String[] args) {
		Executor applet = new Executor();
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(3);
		frame.setTitle("CMM Executor Beta2");
		frame.getContentPane().add(applet, BorderLayout.CENTER);
		applet.init();
		applet.start();
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setSize(d.width*4/5,d.height*9/10);
		frame.setLocation(d.width / 10, d.height / 20);
		frame.setVisible(true);
	}
	
	/** 執行代碼*/
	public void Execute(SyntaxAnalyze syntax) {
		//執行代碼
		try {
			intList.clear();
			arrList.clear();
			tokenStart.clear();
			tokenEnd.clear();
			listModel.clear();
			execute(purify(syntax.syntaxTree), syntax.deep, syntax.tokenRightStart, syntax.tokenRightEnd);
		}
		//執行過程中發現錯誤
		catch (MyRuntimeException e) {
			listModel.addElement("執行過程發現錯誤!");
			tokenStart.add(e.start);
			tokenEnd.add(e.end);
			listModel.addElement("    " + e);
			tokenStart.add(e.start);
			tokenEnd.add(e.end);
			JOptionPane.showMessageDialog (null, "執行過程發現錯誤!", 
					"Notice", JOptionPane.INFORMATION_MESSAGE);
		}
	}
		
	/** 使用語法分析生成的tree圖形(syntaxTree屬性)生成程序可運行代碼部分
	 *結合同時生成的代碼屬性即可執行*/
	private LinkedList<String> purify (DefaultMutableTreeNode tree) {
		LinkedList<String> listT = new LinkedList<String>();
			
		//遍歷語法樹,添加每個節點到listT中(除數組聲明時若指定長度則添加時保留":"外其他含有":"的全部只保留":"之后的部分)
		Enumeration preorder = tree.preorderEnumeration();
		while(preorder.hasMoreElements()) {
			String str = preorder.nextElement().toString();
				
			if (str.indexOf(':')!=-1) {
				if (str.substring(0, str.indexOf(':')).endsWith("長度")) 
					str = str.substring(str.indexOf(':'));
				else 
					str = str.substring(str.indexOf(':')+1);
			}
				
			listT.add(str.trim());
		}
		
		listT.removeFirst();//移除無用內容:"Tree"
			
		return listT;
	}
	
	/** 執行語句塊(參數含義以下函數中相同)
	 * @param listT 經過濾后的生成的本函數可識別的執行語句
	 * @param deepT 語句的嵌套層次
	 * @param startIndex 輸入中的開始位置
	 * @param endIndex 輸入中的結束位置
	 * @throws MyRuntimeException
	 */
	private void execute(LinkedList<String> listT, LinkedList<Integer> deepT, 
			ArrayList<Integer> startIndex, ArrayList<Integer> endIndex) 
		throws MyRuntimeException{
		//進入block時將當前可用變量的個數備份
		int length1 = intList.size();
		int length2 = arrList.size();
		
		//進行語句的順序執行
		matchingExecute(listT, deepT, startIndex, endIndex);
			
		//block結束時將當前可用變量的線性表還原
		intList = new ArrayList<Variable>(intList.subList(0, length1));
		arrList = new ArrayList<ArrayVariable>(arrList.subList(0, length2));
	}
		
	/** 語句的順序執行*/
	private void matchingExecute(LinkedList<String> listT, LinkedList<Integer> deepT, 
		ArrayList<Integer> startIndex, ArrayList<Integer> endIndex) throws MyRuntimeException{
		//含有待執行語句
		while (listT.size()!=0) {
			//第一個待執行語句的嵌套層次
			int startDeep = deepT.getFirst();
			/** int型變量聲明*/
			if (listT.getFirst().equals("int型變量聲明")) {
				//錯誤:變量已聲明
				if (isDeclared(listT.get(1))) 
					throw new MyRuntimeException("變量 “" + listT.get(1) + "” 已聲明",
						startIndex.get(1), endIndex.get(1));
					
				//聲明int型變量而不初始化
				if (listT.size()==2) {
					//向當前變量數據集添加變量
					intList.add(new Variable(listT.get(1)));
						
					//剩余待執行語句
					listT.clear();
				}
				//聲明int型變量而不初始化
				else if (deepT.get(2) == startDeep) {
					//向當前變量數據集添加變量
					intList.add(new Variable(listT.get(1)));
						
					//剩余待執行語句
					listT.removeFirst();listT.removeFirst();
					deepT = new LinkedList<Integer>(deepT.subList(2, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(2, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(2, endIndex.size()));
				}
				//聲明int型變量并進行初始化
				else {
					//向當前變量數據集添加變量(含有變量值)
					intList.add(new Variable(listT.get(1), 
							computeArithmetic(listT.get(2), startIndex.get(2), endIndex.get(2))));
						
					//剩余待執行語句
					listT.removeFirst();listT.removeFirst();listT.removeFirst();
					if (deepT.size() != 3) {
						deepT = new LinkedList<Integer>(deepT.subList(3, deepT.size()));
						startIndex = new ArrayList<Integer>(startIndex.subList(3, startIndex.size()));
						endIndex = new ArrayList<Integer>(endIndex.subList(3, endIndex.size()));
					}
				}
			}
			/** array型變量聲明*/
			else if (listT.getFirst().equals("array型變量聲明")) {
				//錯誤:變量已聲明
				if (isDeclared(listT.get(1))) 
					throw new MyRuntimeException("變量 “" + listT.get(1) + "” 已聲明",
							startIndex.get(1), endIndex.get(1));
				
				String value = listT.get(2);
				//根據指定長度創建數組變量
				if (value.charAt(0)==':') {
					int length = computeArithmetic(value.substring(1).trim(), 
								startIndex.get(2), endIndex.get(2));
					if (length <= 0) throw new MyRuntimeException("不能聲明長度為" + length + "的數組變量",
								startIndex.get(2), endIndex.get(2));
					arrList.add(new ArrayVariable(listT.get(1), length));
				}
					
				//根據指定值創建數組變量
				else if (value.charAt(0)=='{') 
					arrList.add(new ArrayVariable(listT.get(1), computeArrayData("", 
								listT.get(2).substring(1, listT.get(2).length()-1), false, 
								startIndex.get(2), endIndex.get(2))) );
				//其他:使用現有變量創建數組變量
				//錯誤:變量未聲明
				else if (!isDeclared(value)) 
					throw new MyRuntimeException("變量 “" + value + "” 使用前未聲明", 
							startIndex.get(2), endIndex.get(2));
				//錯誤:變量類型不同
				else if (!isArrDeclared(value)) 
					throw new MyRuntimeException("將int型變量 “" + value + "” 賦值給array型變量", 
							startIndex.get(2), endIndex.get(2));
				//創建數組變量
				else arrList.add(new ArrayVariable(listT.get(1), getArrVar(value)));
				
				//剩余待執行語句
				
				listT.removeFirst();listT.removeFirst();listT.removeFirst();
				if (deepT.size() != 3) {
					deepT = new LinkedList<Integer>(deepT.subList(3, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(3, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(3, endIndex.size()));
				}
			}
			/** 賦值語句*/
			else if (listT.getFirst().equals("賦值語句")) {
				//執行賦值語句
				evaluateExe(new LinkedList<String>(listT.subList(0, 3)), 
						startIndex.get(1), endIndex.get(1), startIndex.get(2), endIndex.get(2));
				
				//剩余待執行語句
				listT.removeFirst();listT.removeFirst();listT.removeFirst();
				if (deepT.size() != 3) {
					deepT = new LinkedList<Integer>(deepT.subList(3, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(3, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(3, endIndex.size()));
				}
			}
			/** 輸出語句*/
			else if (listT.getFirst().equals("輸出")) {
				//分別進行數組的完整輸出與表達式的輸出
				String ouput = (isArrDeclared(listT.get(1))) ? 
						getArrVar(listT.get(1)).toString() : 
						computeArithmetic(listT.get(1), startIndex.get(1), endIndex.get(1)) + "";
				tokenStart.add(startIndex.get(1));
				tokenEnd.add(endIndex.get(1));
				listModel.addElement(ouput);
				//剩余待執行語句
				listT.removeFirst();listT.removeFirst();
				if (deepT.size() != 2) {
					deepT = new LinkedList<Integer>(deepT.subList(2, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(2, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(2, endIndex.size()));
				}
			}
			/** 讀入語句*/
			else if (listT.getFirst().equals("讀入")) {
				//執行讀入語句
				readExe(new LinkedList<String>(listT.subList(0, 2)), startIndex.get(1), endIndex.get(1));
				
				//剩余待執行語句
				listT.removeFirst();listT.removeFirst();
				if (deepT.size() != 2) {
					deepT = new LinkedList<Integer>(deepT.subList(2, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(2, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(2, endIndex.size()));
				}
			}
			/** 循環語句*/
			else if (listT.getFirst().equals("循環語句")) {
				//計算語句體結束位置
				int end = new LinkedList<Integer>(
						deepT.subList(1, deepT.size())).indexOf(startDeep);
				if (end == -1) end = deepT.size();
				else end += 1;
				
				boolean booleanT = computeRelation (listT.get(1), startIndex.get(1), endIndex.get(1));
				//錯誤:布爾值為true而無執行語句,進入死循環
				if (end==2 && booleanT) 
					throw new MyRuntimeException("沒有執行語句,循環無法結束",
							startIndex.get(0), endIndex.get(0));
				//錯誤:布爾值為true而表達式不含有變量,進入死循環
				if (booleanT && !containVar(listT.get(1))) 
					throw new MyRuntimeException("不含有變量,布爾表達式的值永遠為真,循環無法結束",
							startIndex.get(0), endIndex.get(0));
				
				//執行循環語句
				while(computeRelation (listT.get(1), startIndex.get(1), endIndex.get(1))) 
					execute(new LinkedList<String>(listT.subList(2, end)), 
							new LinkedList<Integer>(deepT.subList(2, end)),
							new ArrayList<Integer>(startIndex.subList(2, end)),
							new ArrayList<Integer>(endIndex.subList(2, end)));
				
				//剩余待執行語句
				if (end==deepT.size())	listT.clear();
				else {
					listT = new LinkedList<String>(listT.subList(end, listT.size()));
					deepT = new LinkedList<Integer>(deepT.subList(end, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(end, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(end, endIndex.size()));
				}
			}
			/** 條件語句*/
			else {
				//計算語句塊結束位置
				int end = new LinkedList<Integer>(deepT.subList(1, deepT.size())).indexOf(startDeep);
				if (end == -1) end = deepT.size();
				else end += 1;

				//執行條件語句
				ifClauseExe(new LinkedList<String>(listT.subList(1, end)), 
						new LinkedList<Integer>(deepT.subList(1, end)),
						new ArrayList<Integer>(startIndex.subList(1, end)),
						new ArrayList<Integer>(endIndex.subList(1, end)));
				
				//剩余待執行語句
				if (end==deepT.size())
					listT.clear();
				else {
					listT = new LinkedList<String>(listT.subList(end, listT.size()));
					deepT = new LinkedList<Integer>(deepT.subList(end, deepT.size()));
					startIndex = new ArrayList<Integer>(startIndex.subList(end, startIndex.size()));
					endIndex = new ArrayList<Integer>(endIndex.subList(end, endIndex.size()));
				}
			}
		}
	}
		
	/** 檢查布爾表達式是否含有變量*/
	private boolean containVar (String str) {
		for (Variable value:intList) if (str.contains(value.name)) return true;
		for (ArrayVariable value:arrList) if (str.contains(value.name)) return true;
			
		return false;
	}
		
		
	/** 條件語句的執行*/
	private void ifClauseExe (LinkedList<String> ifClause, LinkedList<Integer> deepT, 
			ArrayList<Integer> startIndex, ArrayList<Integer> endIndex) throws MyRuntimeException{
		//第一個待執行語句的嵌套層次
		int startDeep = deepT.getFirst();
			
		//一次遍歷布爾表達式

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品久久久久久| 日本一区二区视频在线观看| 亚洲一区二区三区视频在线 | 日本中文字幕不卡| 欧美伦理视频网站| 日本aⅴ亚洲精品中文乱码| 欧美一区二区三区不卡| 国产一区二区在线电影| 国产精品视频免费| 在线观看欧美精品| 久久精品国产精品亚洲红杏| 国产三级一区二区三区| 色婷婷激情综合| 日本最新不卡在线| 国产精品毛片高清在线完整版| 色综合久久六月婷婷中文字幕| 视频一区中文字幕| 久久九九全国免费| 色哟哟一区二区| 蓝色福利精品导航| 亚洲欧洲另类国产综合| 欧美精品在线一区二区三区| 国产盗摄一区二区| 亚洲三级在线看| 91精品国产综合久久香蕉的特点 | jlzzjlzz亚洲日本少妇| 亚洲一二三四在线观看| 精品国产亚洲一区二区三区在线观看| 国产成人午夜高潮毛片| 亚洲已满18点击进入久久| 日韩一区二区不卡| 99re热这里只有精品免费视频| 亚洲一区二区三区视频在线| 久久精品视频网| 欧美偷拍一区二区| 成人免费视频国产在线观看| 日本美女一区二区三区| 国产精品国产三级国产普通话蜜臀 | 久久精品一区八戒影视| 欧美日韩一区二区三区视频| 国产不卡一区视频| 青草国产精品久久久久久| 日韩理论电影院| 久久综合久久综合亚洲| 欧美三级电影网| 91视频在线看| 国产麻豆精品95视频| 亚洲1区2区3区4区| 成人免费一区二区三区在线观看| 日韩欧美123| 精品视频一区 二区 三区| 不卡的看片网站| 国产成人综合网站| 精品亚洲国内自在自线福利| 亚洲主播在线播放| 亚洲精品视频一区| 国产精品久久久久久亚洲毛片| 精品国产电影一区二区| 欧美一级高清片| 欧美日韩国产成人在线91| 91色九色蝌蚪| 91一区二区三区在线观看| 懂色av中文一区二区三区| 九九久久精品视频| 精油按摩中文字幕久久| 天天综合网天天综合色| 亚洲欧美国产77777| 国产精品婷婷午夜在线观看| 久久久青草青青国产亚洲免观| 精品国产一区二区亚洲人成毛片| 欧洲亚洲精品在线| 99久久99久久精品免费观看| 成人高清视频在线| 94-欧美-setu| 色综合色综合色综合| 一本久久综合亚洲鲁鲁五月天| 99riav久久精品riav| 99国内精品久久| av一区二区不卡| 色偷偷久久人人79超碰人人澡| 91蝌蚪porny成人天涯| 91香蕉视频mp4| 欧美在线观看视频一区二区三区| 日本乱人伦aⅴ精品| 在线观看日产精品| 这里只有精品99re| 日韩欧美的一区| 国产欧美一区二区精品久导航 | 欧美卡1卡2卡| 717成人午夜免费福利电影| 欧美一区二区三区视频在线观看| 日韩欧美高清在线| 中文在线一区二区| 亚洲人成网站在线| 偷拍一区二区三区| 韩国女主播一区二区三区| 成人动漫一区二区在线| 色屁屁一区二区| 这里只有精品99re| 欧美国产激情二区三区| 一区二区三区在线免费| 日韩黄色片在线观看| 国产成人av一区二区三区在线| 99re这里只有精品首页| 制服丝袜亚洲色图| 亚洲国产精品成人综合色在线婷婷| 亚洲人成伊人成综合网小说| 日韩电影免费在线| 成人亚洲一区二区一| 在线免费一区三区| 日韩免费性生活视频播放| 亚洲欧洲精品天堂一级| 午夜精品在线视频一区| 国产精品一色哟哟哟| 在线免费不卡视频| 欧美精品一区二区三区视频 | 亚洲制服丝袜av| 国内外成人在线| 日本韩国精品在线| 精品对白一区国产伦| 一区二区在线观看av| 精品在线你懂的| 色综合久久精品| 久久综合av免费| 亚洲一区在线观看免费观看电影高清| 精品一区二区三区的国产在线播放| 99久久精品免费看| 精品成人在线观看| 亚洲精品老司机| 国产一区二区免费看| 欧美在线观看视频一区二区三区| 国产婷婷一区二区| 免费一级片91| 欧美亚洲综合色| 国产精品传媒在线| 国产一区二区在线观看视频| 欧美日韩成人综合| 亚洲精品免费在线观看| 国产成人精品网址| 精品美女一区二区| 午夜视频在线观看一区二区| 99re视频精品| 国产精品国产精品国产专区不蜜| 久久97超碰国产精品超碰| 欧美精品 日韩| 亚洲精品国久久99热| 粉嫩绯色av一区二区在线观看| 欧美mv日韩mv国产网站app| 亚洲国产精品久久久男人的天堂 | 亚洲国产一区视频| 91蜜桃网址入口| 国产精品高潮久久久久无| 国产白丝网站精品污在线入口| 精品欧美乱码久久久久久1区2区| 天天综合天天综合色| 欧美日韩一级大片网址| 亚洲香肠在线观看| 欧美日韩一区二区三区视频| 亚洲精品精品亚洲| 在线视频国内自拍亚洲视频| 亚洲精品免费在线| 在线观看亚洲精品| 一区二区三区久久久| 一本一道久久a久久精品| 伊人一区二区三区| 91视视频在线观看入口直接观看www | 中文字幕亚洲在| 成人97人人超碰人人99| 国产精品理伦片| 99精品久久只有精品| 亚洲乱码中文字幕| 欧美亚洲综合久久| 日韩av网站免费在线| 欧美一区二区精品在线| 久久69国产一区二区蜜臀| 精品免费国产二区三区| 国产成人精品免费在线| 中文字幕一区二区三区蜜月| 91网站在线播放| 香蕉久久夜色精品国产使用方法 | 欧美一区二区视频在线观看2022| 日本视频免费一区| 久久综合九色综合97婷婷| 国产伦精品一区二区三区视频青涩| 久久人人爽爽爽人久久久| 成人av在线观| 亚洲一区二区视频在线观看| 欧美日韩一级片在线观看| 久久99国产精品麻豆| 欧美韩国日本综合| 欧美羞羞免费网站| 久久国产免费看| 专区另类欧美日韩| 91精品综合久久久久久| 国产麻豆精品一区二区| 亚洲六月丁香色婷婷综合久久 | 91精品国产综合久久久蜜臀粉嫩| 日本vs亚洲vs韩国一区三区| 久久久精品蜜桃| 一本色道久久综合狠狠躁的推荐|