原始碼:
生成目標**後就可進行解釋執行了。
整體思路:
1.具體實現:
掃瞄目標**表,根據每條**在的作用進行相應的實現。在這個實驗中,我用了乙個int陣列來記錄活動,用了乙個棧來進行計算。有著指向**的指標sp,當sp的值指向最後一條**時則結束。
每條**的具體實現:
1.1 jmp:
直接將**指標更改為a域裡的值,如果此時**指標為0,則把主過程的動態鏈,返回位址和靜態鏈填到活動記錄陣列裡。
1.2 opr
根據a域裡的值進行相應的計算,例如如果為1,則將棧頂和次棧頂的數相加,然後將其結果儲存到棧頂。如果為0,表示退出此過程,則將其活動記錄陣列的指標指向前乙個過程的動態鏈,然後修改當前的返回位址和靜態鏈。
1.3 lit
將其a域的值放到棧頂。
1.4 lod
先根據層差找到其變數所在的動態鏈,如果層差為0,則為當前過程的動態鏈,如果不為0,則先取出靜態鏈的中位址,找到上一層的動態鏈,並在迴圈中多次進行層差次數次,再根據a域的相對位址將對應的值放到棧頂。
1.5 sto
跟lod類似,不過是修改這個變數的值為棧頂的值。
1.6 cal
根據過程的層差填寫要呼叫過程的動態鏈,返回位址和靜態鏈。動態鏈的內容即為當前活動記錄指標的值,而返回位址為當前**指標的下一位,如果層差為0,則將上乙個動態鏈的內容填到新的靜態鏈中,否則將上乙個靜態鏈中的內容填入。
1.7 jpc
如果棧頂的值為0即表示非真就將**指標修改為a域的值,如果為真則不管。
1.8 int
根據a域的值,在活動記錄表中初始化幾個變數的值。
int action1[200];
int moveid = 0;
int backid = 0;
int staticid = 0;
int actid = 0;
void explaintoperfrom()//目標**的解釋執行
vartableid++;
} stackcom;//運算棧
stackactstack;//活動記錄棧
int temp = 0;//使用者輸入
int cid = 0;//**陣列下標
int tempcount = 0;//暫時儲存
int tempcode = 0;
int tempbackid = 0;
int tempmoveid = 0;
int tempstaticid = 0;
int lev = 0;//當前層數
while (cid != codeid-1)
cid = code[cid].displacement;
}else if (code[cid].funccode == "opr")//運算語句
case 1://加法運算
tempcount = com.top();
com.pop();
tempcount = tempcount + com.top();
com.pop();
com.push(tempcount);
break;
case 2://減法運算
tempcount = com.top();
com.pop();
tempcount = com.top()-tempcount;
com.pop();
com.push(tempcount);
break;
case 3://乘法運算
tempcount = com.top();
com.pop();
tempcount = com.top()*tempcount;
com.pop();
com.push(tempcount);
break;
case 4://除法運算
tempcount = com.top();
com.pop();
tempcount = com.top()/tempcount;
com.pop();
com.push(tempcount);
break;
case 5://等於判斷
tempcount = com.top();
com.pop();
if (tempcount == com.top())
tempcount = 1;
else
tempcount = 0;
com.pop();
com.push(tempcount);
break;
case 6://不等號運算
tempcount = com.top();
com.pop();
if (tempcount == com.top())
tempcount = 0;
else
tempcount = 1;
com.pop();
com.push(tempcount);
break;
case 7://小於
tempcount = com.top();
com.pop();
if (com.top() < tempcount)
tempcount = 1;
else
tempcount = 0;
com.pop();
com.push(tempcount);
break;
case 22://判斷是否為奇數
if (com.top() % 2 == 1)
tempcount = 1;
else
tempcount = 0;
com.pop();
com.push(tempcount);
break;
case 28://輸入
cout << "請輸入:";
cin >> temp;
//vartable[vartableid].
com.push(temp);
break;
case 29://輸出
cout << com.top()<<"\n";
break;
}cid++;
}else if (code[cid].funccode == "lit")//常量宣告
else if (code[cid].funccode == "lod")//載入變數
}com.push(action1[tempid + code[cid].displacement]);
cid++;
}else if (code[cid].funccode == "sto")//將棧頂結果送給變數
}action1[tempid + code[cid].displacement] = com.top();
cid++;
}else if (code[cid].funccode == "cal")//過程呼叫語句
if (code[cid].leveldiff == 1)//層差為1
cid = code[cid].displacement;
}else if (code[cid].funccode == "jpc")//非真跳轉語句
else if (code[cid].funccode == "int")//開闢空間
cid++;
}}}
上面就是解釋執行的**,只需要呼叫explaintoperform()這個函式就行,不過前提是你有目標**,前面的**也在我之前的部落格中。到此為止,其他文法的**已經能跑起來了。
編譯執行和解釋執行的區別
a 解釋程式 所謂解釋程式是高階語言翻譯程式的一種,它將源語言 如basic 書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。就像外語翻譯中的 口譯 一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條命令或語句,解釋程...
編譯執行和解釋執行的區別
a 解釋程式 所謂解釋程式是高階語言翻譯程式的一種,它將源語言 如basic 書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。就像外語翻譯中的 口譯 一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條命令或語句,解釋程...
編譯執行和解釋執行的區別
a 解釋程式 所謂解釋程式是高階語言翻譯程式的一種,它將源語言 如basic 書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。就像外語翻譯中的 口譯 一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條 命令或語句,解釋...