You are on page 1of 4

96 學年下學期 金門技術學院 資管系日四技三年級 編譯器 期末考 出題者 : 陳鍾誠

學號 : 姓名 : 分數 :
語法一: 1. ASSIGN => id = EXP ;
2. EXP => EXP + EXP | EXP – EXP | id (EXP => EXP { (+|-) EXP } | id)
1. 請說明何謂編譯器 (Compiler),何謂解譯器 2. 請說明何謂虛擬碼 (P-Code),何謂組合語言
(Interpreter),並比較編譯器與解譯器之異同 ? (Assembly Language),並比較虛擬碼與組合
(10%) 語言之異同? (10%)

編譯器是用來將高階語言轉換為組合語言或機器碼的 虛擬碼 P-Code 可以說是一種假想或抽像的組合語


一種程式。 言,用來作為編譯器產生組合語言前的中間格式,
但 P-Code 中沒有暫存器的概念,因此、編譯器產生
解譯器則是直接用來執行某程式語言的程式。 P-Code 時不用考慮暫存器使用與分配的問題,而組
合語言則是機器語言的助憶符號所形成的程式,因
編譯器與解譯器的相同點是都採用語法剖析方式,以 此、會有暫存器存取的概念,語法多樣而複雜。
將指令或程式轉換為剖析樹,而不同點是編譯器會將
該剖析樹再度轉換為組合語言或機器碼,但解譯器則
會直接以解譯的方式執行該剖析樹。

3. 請使用語法一建立 A = B+C-D 的剖析樹 (10%) 4. 請寫出一個可以剖析語法一的遞迴下降演算法 ?


(10%)
void parseAssign(tokens) {
next(id);
next(=);
parseExp();
next(;);
}
void parseExp(tokens) {
if (isNext(+) or isNext(-))
while (isNext(+) or isNext(-))
parseExp();
else
next(id);
}

1
學號 : 姓名 :

5. 請寫出一個可以用來解譯語法一的解譯器之演算 6. 請寫出一個可以用來將語法一轉換為 P-Code 的


法 (10%) 程式產生演算法 (假設已剖析完成並已建成剖析
樹,以剖析樹為輸入) ? (10%)
object run(tree)
if (tree.nodeType = ASSIGN) object generate(tree)

id = tree.node(0); if (tree.nodeType = ASSIGN)

exp = tree.node(2); id = tree.node(0);

expValue = run(exp); exp = tree.node(2);

symbolTable[id] = expValue; expSymbol = generate(exp);

else if (tree.nodeType =EXP) writePCode(=, expSymbol, , id)

if (tree.childs.count = 1) else if (tree.nodeType =EXP)

return symbolTable(node(0).value); if (tree.childs.count = 1)

else else

exp1 = tree.node(0); exp1 = tree.node(0);

op = tree.node(1); op = tree.node(1);

exp2 = tree.node(2); exp2 = tree.node(2);

exp1value = run(exp1); exp1symbol = generate(exp1);

exp2value = run(exp2); exp2 symbol = generate(exp2);

case op writePCode(op.value, exp1symbol,

+ : return exp1value + exp2value; exp2symbol,

- : return exp1value - exp2value; newTempSymbol());

end case end if

end if end if

end if

7. 請詳細說明在 Interpreter1.cs 中,下列程式的功能為何 ? (10%)


Regexp.matches(text, "\".*?\"" + @"|(\d+)|([a-zA-Z]\w*)|([\+\-\*/<=>!]+)|([^\s])", 0);

該程式乃是用 regular expression 進行語彙分析 (Lexical Analysis)的程式,可將輸入的程式切割成基本


的語彙,例如:假設 text 是 if (a1 = 1) then b=c; 則該程式會輸出
[if, (, a1, =, 1, ), then, b, =, c]
這個陣列,該程式扮演了語彙分析中 Scanner 的角色。

2
8. 請詳細說明在 Interpreter1.cs 中,下列程式的功能為何 ? (10%)

該程式對 for 迴圈的語法進行剖析,然後可以建立一個以 FOR 為根節點型態的剖析樹。

3
學號 : 姓名 :

9. 請詳細說明在 Interpreter1.cs 中,下列程式的功能為何 ? (10%)

該程式用來解譯 for 迴圈的剖析樹,並利用 while 迴圈模擬 for 迴圈的功能,以達成解譯的模擬功能。

10. 請詳細說明在 Compiler1.cs 中,下列程式的功能為何 ? (10%)

該程式會在剖析 for 迴圈的程式碼時,順便進行程式碼的產生動作,其中的 put 與 putOp 等函數就


是在進行 P-Code 程式的產生。

You might also like