?? executor.java
字號:
/*
* 呂淵 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 + -