編譯原理之解釋執行

2021-09-05 08:57:38 字數 3911 閱讀 5212

原始碼:

生成目標**後就可進行解釋執行了。

整體思路:

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 書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。就像外語翻譯中的 口譯 一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條 命令或語句,解釋...