第十一回: 意味解析と中間表現・コード生成
2011 年 6 月 24 日
http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture11.html
© 2005-11 Martin J. Dürst 青山学院大学
正解例: 諸事情により削除されました
諸事情により削除されました
参考: Mastering Regular Expressions, Jeffrey E.F. Friedl, pp. 168,...
字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
(symbol table)
簡単なプログラム言語と簡単なマシーン・アーキテクチャの場合 (例えば Pascal からスタック・マシーン) には構文解析しながらコード生成を行う (構文木を生成しない) こともある
構文木の生成: 構文規則ごとの処理で生成。例:
expression: expression '+' term { $$ = $1 + $3; }
を次に変える:
expression: expression '+' term
{ $$ = newnode(PLUS, $1, $3); }
(YYSTYPE
も変更)
構文木は普通二分木が、関数の引数などに特別な措置が必要
(semantic analysis)
(type equivalence)
型が同じかどうか複数の定義がある:
C の例: type-equivalence.c (コンパイル可能か)
(assembly language)
;
後)命令 | 被演算子 | 説明 (コメント) |
LOAD | R1, a | メモリの変数 a の値をレジスタ R1 に代入 |
STORE | a, R1 | レジスタ R1 の値をメモリの変数 a に代入 |
CONST | R1, 5 | レジスタ R1 に 5 の定数を代入 |
JUMP | label | 無条件の label へジャンプ |
JUMP< | R1, label | レジスタ R1 が 0 より小さい時 label へジャンプ (同様に JUMP<=, JUMP==, JUMP!=, JUMP>= とJUMP> がある。) |
ADD | R1, R2, R3 | R2 と R3 を足して R1 に代入。同じレジスタを何回使ってもよい。同様に SUB、MUL、DIV がある。 |
入力のプログラムの一部:
sum += price * 25;
出力:
LOAD R1, price ; R1 (レジスタ1) に price というアドレスからロード CONST R2, 25 ; R2 (レジスタ2) に 25 の定数をロード MUL R1, R1, R2 ; R1 に R1 と R2 の掛け算の結果を入れる LOAD R2, sum ; R2 に sum というアドレスからロード ADD R2, R1, R2 ; R2 に R1 と R2 の合計を入れる STORE sum, R2 ; sum というアドレスに R2 を入れる
if
文などのコード生成if
文のコード生成の例文: if (a>10) { b = 15; }
生成されるコード:
LOAD R1, a CONST R2, 10 SUB R3, R1, R2 ; R3 = a-10 JUMP<= R3, endif ; jump over if part if a-10<=0 CONST R4, 15 STORE b, R4 endif:
関数呼び出しスタックの内容 (関数フレーム):
(提出不要)
if
-else
文&&
) や又は (||
)for
文や while
文のコード生成を考えて、例を作って提案する