2014 年 6 月 27 日
http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture12.html
© 2005-14 Martin J. Dürst 青山学院大学
bison
では error
トークンを含む規則でエラーに対応可能YYSTYPE
は日付、日数、整数を収納可能な構造体
(.lex
と .y
両方)YYSTYPE
は日付、日数、整数を収納・区別可能な構造体
(.lex
と .y
両方)makefile
内も)字句解析 (lexical analysis)
構文解析 (parsing; syntax analysis)
意味解析 (semantic analysis)
最適化 (optimization)
コード生成 (code generation)
(symbol table)
構文木の生成: 書換規則ごとの処理で生成。例:
expression: expression '+' term { $$ = $1 + $3; }
を次に変える:
expression: expression '+' term
{ $$ = newnode(PLUS, $1, $3); }
(YYSTYPE
も変更)
構文木では二分木が多いが、関数の引数などに特別な措置が必要
(簡単なプログラム言語 (例: Pascal)と簡単な計算機構造
(例: スタック・マシーン)
の場合、構文解析しながらのコード生成
(構文木を生成しない) が可能)
(semantic analysis)
(type equivalence)
型が同じかどうか複数の定義がある:
C の例: type-equivalence.c (コンパイル可能か)
f
の型: (a, Char) ->
(a, [Char])
a
と Char
の二次組から
a
と Char
のリストの二次組への関数)g
の型: (Int, [b]) ->
Int
Int
と b
のリストの二次組から Int
への関数)h(x) := g(f(x)
の型は?命令 | 被演算子 | 説明 (コメント) |
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!= などは同様) |
ADD | R1, R2, R3 | R2 と R3 を足して R1 に代入。同じレジスタを何回使ってもよい。同様に SUB、MUL、DIV がある。 |