You are on page 1of 10

圖一 : 編譯器 (Compiler) 的架構

表一 : Pascal 的簡化語法.
1. <prog> ::= program <pname> var <dec-list> begin <stmt-list> end.
2. <pname> ::=id
3. <dec-list> ::= <dec> | <dec-list>; <dec>
4. <dec> ::= <id-list>
5. <type> ::= integer
6. <id-list> ::= id | <id-list> , id
7. <stmt-list> ::= <stmt> | <stmt-list> ; <stmt>
8. <stmt> ::= <assign>
9. <assign> ::= id := <exp>
10. <exp> ::= <term> | <exp> + <term> | <exp> - <term>
11. <term> ::= <term> | <term> * <factor> | <term> DIV <factor>
12. <factor> ::= id | int

1
92 年上學期 資管科 日間部二年級 系統程式 期末考 出題者 : 陳鍾誠
1. 請說明圖一中的詞彙器 (Tokenizer:Q1) 之功能 (也就是詞彙分析在剖析器中的用途) ?
(10%)

2. 圖一中的剖析器會呼叫詞彙器去取得詞彙 (token)的,請依序列出詞彙的內容與與型態。
(說明 : 圖一中的型態有四種, id[變數], int[整數], keyword[關鍵字] 與 operator[符
號]) (10%)

3. 請說明圖一中的剖析器 (Parser: Q2) 之功能 (也就是剖析器在編譯器中的用途) ?


(10%)

4. 請將範例一之語法改成遞回下降剖析法可處理的語法 (消除左遞迴) (10%)


(說明 : 只要寫出有改變的規則,其改變後的結果即可)

5. 請畫出圖一中程式 D0 的剖析樹 D1,並對照表一標明每個節點所使用的規則編號。


(20%)

6. 請說明圖一中的程式產生器 (Q3) 之功能 (也就是程式產生器在編譯器中的用途)?


(10%)

7. 請寫出圖一中的程式產生器 (Q3) 的輸出 (D2) 之 SIC 程式碼. (20%)

8. 請將下列 C 語言的二維陣列存取程式碼轉換成四元組的組合語言中間碼,您可參考右半
部的參考中間碼. (10%)

C 語言 參考中間碼
int A[5][3], I=3, J=2; (1) * ? ? ?
A[I][J] = 10; (2) + ? ? ?
(3) := ? ? ?

2
以下演算法是一個編譯器的演算法
String[] compiler(String[] source) {
Tree tree = parse(source); // 剖析
String[] code = codeGenerate(tree); // 產生程式碼
}

Tree parse(String String[] source) { // 剖析


while (token = getNextToken()) { // 詞彙分析
parser.read(token);
}
return parser.tree;
}

String[] codeGenerate(Tree tree) { // 產生程式碼


String[] codes = new String[MAX_LINES];
int codeIdx = 0;
if (tree.type == “<assign>”)
id = child[0];
exp = child[2];
GETA(exp);
codes[codeIdx] = “STA“ +Symbol(id);
REGA = null;
if …
}

9.
10. 請寫出可用來剖析
<exp> ::= <term> | <exp> + <term> | <exp>-<term>
<term> ::= <factor> | <term>*<factor> | <term> div <factor>
<factor> ::= id | int | ( <exp> )

11. 請將下列程式翻譯成 SIC 組合語言 (10%)

int C[100], B[100], A[100];


for (int i=0; i<100; i++)
C[i] = A[i] + B[i];
12.
(a.)請說明何謂組譯器 (Assembler) (務必說明 Pass1 與 Pass2 的功能與目的各為何 ?)
(10%)
3
(b.) 請寫出 SIC 組譯器的 Pass 1 演算法。 (10%)
(c.) 請寫出 SIC 組譯器的 Pass 2 演算法。 (10%)
(d.) 請用上述演算法將第 2 題之組合語言組譯成目的檔 (Object Code),配合圖形說明你
的演算法運作流程 (若你寫不出第 2 題,可用第 1 題代替,但分數會打 8 折) 。 (10%)

13. 請說明何謂載入器 (Loader) ? (10%)


14.
(a.)請說明何謂巨集處理器 (Macro Processor) ? (10%)
(b.) 請寫出 SIC 巨集處理器 (Macro Processor) 的演算法。 (10%)
(c.) 請用上述演算法將下列組合語言展開。 (10%)

COPY MACRO &STR1, &STR2, &LENGTH


LDX ZERO
MOVECH LDCH &STR1, X
LDCH &STR2, X
TIX &LENGTH
JLT MOVECH
MEND
ZERO WORD 0
.
SWAP COPY S1, TEMP, 3
COPY TEMP, S2, 3
COPY S2, S1, 3
S1 BYTE C'John'
S2 BYTE C'Mary'
TEMP RESB 4
END SWAP

4
92 年上學期 資管科 日間部二年級 系統程式 期中考 出題者 : 陳鍾誠

1. 請寫出 C = A+B 的 SIC 程式 (10%)


解答
LDA A
STA B
LDA C
A RESW 1
B RESW 1
C RESW 1

2. 請將下列程式翻譯成 SIC 組合語言 (10%)


解答
int C[100], B[100], A[100];
for (int i=0; i<100; i++)
C[i] = A[i] + B[i];

LDX ZERO
LOOP LDA A, X
ADD B, X
STA C, X
TIX 100
JEQ LOOP
ZERO WORD 0
K100 WORD 100
A RESW 100
B RESW 100
C RESW 100

3.
(a.) 請說明何謂組譯器 (Assembler) (務必說明 Pass1 與 Pass2 的功能與目的各
為何 ?) (10%)
解答
組譯器是用來將組合語言組譯成為目的碼的一種軟體程式,其 Pass1 的功能為計算組合語
言中的符號之位址,並記錄到符號表中,Pass2 則利用該符號表的資訊,配合指令表將組合
語言翻譯成為目的碼。

5
(b.) 請寫出 SIC 組譯器的 Pass 1 演算法。 (10%)

解答
Algorithm Pass1(AssemblyProgram)
address = initial address // 設定初始位址
while not end of AssemblyProgram // 當輸入的組合語言還沒被讀完
read(line) // 讀取下一行組合語言
symbol = symbol(line) // 取得本行中的符號部分
SymbolTable.insert(symbol, address)// 將 (符號, 本行位址) 放入符號表
address = address + sizeof(line) // 計算下一行位址
end while
end

int sizeof(String line) // 函數 sizeof 開始


op = op_part(line) // 取得指令部分
opCode = OpTable.find(op) // 將指令部分轉成機器碼
if (opCode != null) // 若是一般指令,其大小為 3
return 3
if (op == RESW) // 若是 RESW ,其大小為 3*運算元
return 3*OPERAND
else if (op == RESB) // 若是 RESB ,其大小為 1*運算元
return 1*OPERAND
else if (op == WORD) // 若是 WORD ,其大小為 3
return 3
else if (op == BYTE) // 若是 BYTE ,其大小為 運算元之長度
return length(OPERAND)
else // 否則,傳回 0,該行不佔空間
return 0
end

6
(c.) 請寫出 SIC 組譯器的 Pass 2 演算法。 (10%)
解答
Algorithm Pass2(AssemblyProgram)
while not end of AssemblyProgram // 當輸入的組合語言還沒被讀完
read(line) // 讀下一行
binaryCode = translate(line) // 將該行翻譯為二進位
write(binaryCode) into objectFile // 將該二進位碼寫入目的檔
end
end

binary translate(line)
op = op_part(line) // 取得指令部分
opCode = OpTable.find(op) // 將指令部分轉成機器碼
symbol = symbol_part(line) // 取得符號部分
symbolAddress = SymbolTable.find(symbol) // 取得符號位址
if (opCode != null) // 若是一般指令,傳回 指令碼+位址
return opCode+symbolAddress
if (op == RESW) //若是 RESW,傳回
3*length(OPERAND)個 0 位元組
return binarySequence of 00 with length 3*OPERAND
else if (op == RESB) // 若是 RESB,傳回
length(OPERAND)個 0 位元組
return binarySequence of 00 with length 1*OPERAND
else if (op == WORD) // 若是 WORD ,傳回運算元的二進位碼
return binarySequence of OPERAND
else if (op == BYTE) // 若是 BYTE ,傳回運算元字串的二進位

return binarySequence of OPERAND_STRING
else // 否則,無傳回
return nothing
end

7
(d.) 請用上述演算法將第 2 題之組合語言組譯成目的檔 (Object Code),配合圖形
說明你的演算法運作流程 (若你寫不出第 2 題,可用第 1 題代替,但分數會打 8
折) 。 (10%)
解答

4. 請說明何謂載入器 (Loader) ? (10%)


解答
載入器是將目的檔載入到記憶體的一種軟體程式.

5.
(a.)請說明何謂巨集處理器 (Macro Processor) ? (10%)
解答
巨集處理器是將有巨集的組合語言展開成沒有巨集的組合語言的一種軟體程式

8
(b.) 請寫出 SIC 巨集處理器 (Macro Processor) 的演算法。 (10%)
解答
Algorithm MacroProcessor(Input AssemblyProgram, output ResultProgram)
while not end of AssemblyProgram
read(line)
if (isMacroCall(line))
expandText = ExpandMacro(line)
else
output line to ResultProgram
endif
End

function ExpandMacro(String line)


arguments = getMacroArgs(line)
macroText = getMacroText(line)
macroText = replaceArguments(macroText, arguments)
return macroText
end

9
(c.) 請用上述演算法將下列組合語言展開。 (10%)
COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH &STR1, X
LDCH &STR2, X
TIX &LENGTH
JLT MOVECH
MEND
ZERO WORD 0
.
SWAP COPY S1, TEMP, 3
COPY TEMP, S2, 3
COPY S2, S1, 3
S1 BYTE C'John'
S2 BYTE C'Mary'
TEMP RESB 4
END SWAP
解答
ZERO WORD 0
.SWAP COPY S1, TEMP, 3
.COPY MACRO &STR1, &STR2, &LENGTH
SWAP LDX ZERO
MOVECH LDCH S1, X
LDCH TEMP, X
TIX 3
JLT MOVECH
.COPY TEMP, S2, 3
.COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH TEMP, X
LDCH S2, X
TIX 3
JLT MOVECH
.COPY S2, S1, 3
.COPY MACRO &STR1, &STR2, &LENGTH
LDX ZERO
MOVECH LDCH S2, X
LDCH S1, X
TIX 3
JLT MOVECH
S1 BYTE C'John'
S2 BYTE C'Mary'
TEMP RESB 4
END SWAP

10

You might also like