?? 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{
//圖標(biāo)
ImageIcon ExecuteIcon = new ImageIcon("Icon/Execute.png");
//菜單項(xiàng)
private JMenuItem jmiExecute = new JMenuItem("執(zhí)行代碼", ExecuteIcon);
private JMenuItem jmiExplain = new JMenuItem("更新及使用說明");
private JMenuItem jmiAboutExe = new JMenuItem("關(guān)于執(zhí)行代碼");
private ArrayList<Variable> intList = new ArrayList<Variable>();//當(dāng)前可用普通變量
private ArrayList<ArrayVariable> arrList = new ArrayList<ArrayVariable>();//當(dāng)前可用數(shù)組變量
public Executor() {
//菜單
jMenuExe.removeAll();
jMenuExe.add(lexicalAnalyzer);
jMenuExe.add(syntaxAnalyzer);
jMenuExe.add(jmiExecute);
jMenuExe.addSeparator();
jMenuExe.add(jMenuClean);
JMenu jmiAbout = new JMenu("關(guān)于(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));
/** 執(zhí)行*/
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());
//語法分析發(fā)現(xiàn)錯(cuò)誤
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, "詞法分析發(fā)現(xiàn)錯(cuò)誤!",
"Notice", JOptionPane.INFORMATION_MESSAGE);
tokenStart = syntax.tokenStart;
tokenEnd = syntax.tokenEnd;
}
else if (syntax.syntaxError == true) {
JOptionPane.showMessageDialog (null, "含有語法錯(cuò)誤!",
"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));
//關(guān)于執(zhí)行代碼
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);
}
/** 執(zhí)行代碼*/
public void Execute(SyntaxAnalyze syntax) {
//執(zhí)行代碼
try {
intList.clear();
arrList.clear();
tokenStart.clear();
tokenEnd.clear();
listModel.clear();
execute(purify(syntax.syntaxTree), syntax.deep, syntax.tokenRightStart, syntax.tokenRightEnd);
}
//執(zhí)行過程中發(fā)現(xiàn)錯(cuò)誤
catch (MyRuntimeException e) {
listModel.addElement("執(zhí)行過程發(fā)現(xiàn)錯(cuò)誤!");
tokenStart.add(e.start);
tokenEnd.add(e.end);
listModel.addElement(" " + e);
tokenStart.add(e.start);
tokenEnd.add(e.end);
JOptionPane.showMessageDialog (null, "執(zhí)行過程發(fā)現(xiàn)錯(cuò)誤!",
"Notice", JOptionPane.INFORMATION_MESSAGE);
}
}
/** 使用語法分析生成的tree圖形(syntaxTree屬性)生成程序可運(yùn)行代碼部分
*結(jié)合同時(shí)生成的代碼屬性即可執(zhí)行*/
private LinkedList<String> purify (DefaultMutableTreeNode tree) {
LinkedList<String> listT = new LinkedList<String>();
//遍歷語法樹,添加每個(gè)節(jié)點(diǎn)到listT中(除數(shù)組聲明時(shí)若指定長度則添加時(shí)保留":"外其他含有":"的全部只保留":"之后的部分)
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();//移除無用內(nèi)容:"Tree"
return listT;
}
/** 執(zhí)行語句塊(參數(shù)含義以下函數(shù)中相同)
* @param listT 經(jīng)過濾后的生成的本函數(shù)可識別的執(zhí)行語句
* @param deepT 語句的嵌套層次
* @param startIndex 輸入中的開始位置
* @param endIndex 輸入中的結(jié)束位置
* @throws MyRuntimeException
*/
private void execute(LinkedList<String> listT, LinkedList<Integer> deepT,
ArrayList<Integer> startIndex, ArrayList<Integer> endIndex)
throws MyRuntimeException{
//進(jìn)入block時(shí)將當(dāng)前可用變量的個(gè)數(shù)備份
int length1 = intList.size();
int length2 = arrList.size();
//進(jìn)行語句的順序執(zhí)行
matchingExecute(listT, deepT, startIndex, endIndex);
//block結(jié)束時(shí)將當(dāng)前可用變量的線性表還原
intList = new ArrayList<Variable>(intList.subList(0, length1));
arrList = new ArrayList<ArrayVariable>(arrList.subList(0, length2));
}
/** 語句的順序執(zhí)行*/
private void matchingExecute(LinkedList<String> listT, LinkedList<Integer> deepT,
ArrayList<Integer> startIndex, ArrayList<Integer> endIndex) throws MyRuntimeException{
//含有待執(zhí)行語句
while (listT.size()!=0) {
//第一個(gè)待執(zhí)行語句的嵌套層次
int startDeep = deepT.getFirst();
/** int型變量聲明*/
if (listT.getFirst().equals("int型變量聲明")) {
//錯(cuò)誤:變量已聲明
if (isDeclared(listT.get(1)))
throw new MyRuntimeException("變量 “" + listT.get(1) + "” 已聲明",
startIndex.get(1), endIndex.get(1));
//聲明int型變量而不初始化
if (listT.size()==2) {
//向當(dāng)前變量數(shù)據(jù)集添加變量
intList.add(new Variable(listT.get(1)));
//剩余待執(zhí)行語句
listT.clear();
}
//聲明int型變量而不初始化
else if (deepT.get(2) == startDeep) {
//向當(dāng)前變量數(shù)據(jù)集添加變量
intList.add(new Variable(listT.get(1)));
//剩余待執(zhí)行語句
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型變量并進(jìn)行初始化
else {
//向當(dāng)前變量數(shù)據(jù)集添加變量(含有變量值)
intList.add(new Variable(listT.get(1),
computeArithmetic(listT.get(2), startIndex.get(2), endIndex.get(2))));
//剩余待執(zhí)行語句
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型變量聲明")) {
//錯(cuò)誤:變量已聲明
if (isDeclared(listT.get(1)))
throw new MyRuntimeException("變量 “" + listT.get(1) + "” 已聲明",
startIndex.get(1), endIndex.get(1));
String value = listT.get(2);
//根據(jù)指定長度創(chuàng)建數(shù)組變量
if (value.charAt(0)==':') {
int length = computeArithmetic(value.substring(1).trim(),
startIndex.get(2), endIndex.get(2));
if (length <= 0) throw new MyRuntimeException("不能聲明長度為" + length + "的數(shù)組變量",
startIndex.get(2), endIndex.get(2));
arrList.add(new ArrayVariable(listT.get(1), length));
}
//根據(jù)指定值創(chuàng)建數(shù)組變量
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))) );
//其他:使用現(xiàn)有變量創(chuàng)建數(shù)組變量
//錯(cuò)誤:變量未聲明
else if (!isDeclared(value))
throw new MyRuntimeException("變量 “" + value + "” 使用前未聲明",
startIndex.get(2), endIndex.get(2));
//錯(cuò)誤:變量類型不同
else if (!isArrDeclared(value))
throw new MyRuntimeException("將int型變量 “" + value + "” 賦值給array型變量",
startIndex.get(2), endIndex.get(2));
//創(chuàng)建數(shù)組變量
else arrList.add(new ArrayVariable(listT.get(1), getArrVar(value)));
//剩余待執(zhí)行語句
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("賦值語句")) {
//執(zhí)行賦值語句
evaluateExe(new LinkedList<String>(listT.subList(0, 3)),
startIndex.get(1), endIndex.get(1), startIndex.get(2), endIndex.get(2));
//剩余待執(zhí)行語句
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("輸出")) {
//分別進(jìn)行數(shù)組的完整輸出與表達(dá)式的輸出
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);
//剩余待執(zhí)行語句
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("讀入")) {
//執(zhí)行讀入語句
readExe(new LinkedList<String>(listT.subList(0, 2)), startIndex.get(1), endIndex.get(1));
//剩余待執(zhí)行語句
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()));
}
}
/** 循環(huán)語句*/
else if (listT.getFirst().equals("循環(huán)語句")) {
//計(jì)算語句體結(jié)束位置
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));
//錯(cuò)誤:布爾值為true而無執(zhí)行語句,進(jìn)入死循環(huán)
if (end==2 && booleanT)
throw new MyRuntimeException("沒有執(zhí)行語句,循環(huán)無法結(jié)束",
startIndex.get(0), endIndex.get(0));
//錯(cuò)誤:布爾值為true而表達(dá)式不含有變量,進(jìn)入死循環(huán)
if (booleanT && !containVar(listT.get(1)))
throw new MyRuntimeException("不含有變量,布爾表達(dá)式的值永遠(yuǎn)為真,循環(huán)無法結(jié)束",
startIndex.get(0), endIndex.get(0));
//執(zhí)行循環(huán)語句
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)));
//剩余待執(zhí)行語句
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 {
//計(jì)算語句塊結(jié)束位置
int end = new LinkedList<Integer>(deepT.subList(1, deepT.size())).indexOf(startDeep);
if (end == -1) end = deepT.size();
else end += 1;
//執(zhí)行條件語句
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)));
//剩余待執(zhí)行語句
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()));
}
}
}
}
/** 檢查布爾表達(dá)式是否含有變量*/
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;
}
/** 條件語句的執(zhí)行*/
private void ifClauseExe (LinkedList<String> ifClause, LinkedList<Integer> deepT,
ArrayList<Integer> startIndex, ArrayList<Integer> endIndex) throws MyRuntimeException{
//第一個(gè)待執(zhí)行語句的嵌套層次
int startDeep = deepT.getFirst();
//一次遍歷布爾表達(dá)式
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -