言語処理系(8) 金子敬一
6 構文主導型翻訳 6.1 構文主導型翻訳方式 6.2 構文主導型翻訳系の実現 6.3 中間コード 6.4 後置記法 6.5 解析木と構文木 6 構文主導型翻訳 6.1 構文主導型翻訳方式 6.2 構文主導型翻訳系の実現 6.3 中間コード 6.4 後置記法 6.5 解析木と構文木 6.6 3番地コード,4つ組および3つ組 6.7 代入文の翻訳 6.8 論理式 6.9 制御の流れを変える文
6.1 構文主導型翻訳方式 意味動作 生成規則にプログラムを付加 構文解析しながら中間コードを生成 このプログラムを 出力動作 意味規則 6.1 構文主導型翻訳方式 意味動作 生成規則にプログラムを付加 構文解析しながら中間コードを生成 このプログラムを 出力動作 意味規則 などと呼ぶ
6.1 構文主導型翻訳方式 翻訳属性 プログラムの扱うデータ 文法記号に付随させる E → E(1) + E(2) 6.1 構文主導型翻訳方式 翻訳属性 プログラムの扱うデータ 文法記号に付随させる E → E(1) + E(2) {E.VAL:=E(1).VAL+E(2).VAL} 上昇型構文解析を想定 葉に近い方が結びつきが強い 翻訳属性
6.1 構文主導型翻訳方式 解析木上の翻訳属性 意味動作で翻訳属性を計算可能 6.1 構文主導型翻訳方式 解析木上の翻訳属性 意味動作で翻訳属性を計算可能 E→E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL} E→digit {E.VAL:=digit} 解析木を構成しない場合は,スタックを利用
6.1 構文主導型翻訳方式 解析木上の翻訳属性 E→E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL} 6.1 構文主導型翻訳方式 解析木上の翻訳属性 E→E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL} E→digit {E.VAL:=digit} 6 E 3 1 E 2 3 E E E 1 + 2 + 3
6.2 構文主導型翻訳系の実現 スタックによる実現 A → X Y Z {A.VAL:= f (X.VAL, Y.VAL, Z.VAL)} 6.2 構文主導型翻訳系の実現 スタックによる実現 A → X Y Z {A.VAL:= f (X.VAL, Y.VAL, Z.VAL)} 状態 値 Z Z.VAL Y Y.VAL X X.VAL 状態 値 A A.VAL
6.2 構文主導型翻訳系の実現 意味動作 電卓の実現 S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I 6.2 構文主導型翻訳系の実現 電卓の実現 意味動作 S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I I→I(1) digit I→digit {print E.VAL} {E.VAL:=E(1).VAL+E(2).VAL} {E.VAL:=E(1).VAL*E(2).VAL} {E.VAL:=E(1) .VAL} {E.VAL:=I.VAL} {I.VAL:=10*I(1).VAL+LEXVAL} {I.VAL:=LEXVAL}
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ 3 - 2 I I 23 - 2 電卓の実現 S→E$ E→E(1)+E(2) 6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * 5 + 4 $ S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I I→I(1) digit I→digit 3 - 2 I I 23 - 2
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ E 5 I - 5 * - E I 115 23 電卓の実現 S→E$ 6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * 5 + 4 $ S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I I→I(1) digit I→digit E 5 I - 5 * - E I 115 23
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ E 4 I - 4 + - E 119 115 電卓の実現 S→E$ 6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * 5 + 4 $ S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I I→I(1) digit I→digit E 4 I - 4 + - E 119 115
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ 答えは119 $ - E S 119 - 電卓の実現 S→E$ 6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * 5 + 4 $ S→E$ E→E(1)+E(2) E→E(1)*E(2) E→(E(1)) E→I I→I(1) digit I→digit 答えは119 $ - E S 119 -
6.3 中間コード 中間コード プログラ ミング言語 中間コード 機械語 機械に依存しない
6.3 中間コード よく用いられる中間コード 後置記法 構文木 4つ組 3つ組
6.4 後置記法 後置記法 e1, e2, ..., ek : 後置記法の式 q : k項演算子 6.4 後置記法 後置記法 e1, e2, ..., ek : 後置記法の式 q : k項演算子 e1 e2 ... ek q : e1, ..., ekで表された値にq を 適用した結果 (a + b) * c a b + c * a * (b + c) a b c + * (a + b) * (c + d) a b + c d + *
6.4 後置記法 後置式の評価 1 3 + 5 * 20 4
6.5 解析木と構文木 構文木 解析木 構文木 演算子 / 被演算子 * d a * (b + c) / d a + b c
6.5 解析木と構文木 (1) E → E(1) op E(2) 6.5 解析木と構文木 構文木への構文主導型翻訳 (1) E → E(1) op E(2) {E.VAL := NODE(op, E(1).VAL, E(2).VAL} (2) E → ( E(1) ) {E.VAL := E(1).VAL} (3) E → -E(1) {E.VAL := UNARY(-, E(1).VAL} (4) E → id {E.VAL := LEAF(id)}
6.6 3番地コード,4つ組および3つ組 3番地コード A := B op C 算術・論理演算子 名前,定数,一時名 6.6 3番地コード,4つ組および3つ組 3番地コード A := B op C 算術・論理演算子 名前,定数,一時名 X + Y * Z T1 := Y * Z T2 := X + T1
6.6 3番地コード,4つ組および3つ組 その他の3番地文 A := B op C A := op B goto L 6.6 3番地コード,4つ組および3つ組 その他の3番地文 A := B op C A := op B goto L if A relop B goto L param A, call P, n A := B[I], A[I] := B A := addr B, A := *B, *A := B
6.6 3番地コード,4つ組および3つ組 4つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 6.6 3番地コード,4つ組および3つ組 4つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 OP ARG1 ARG2 RESULT (0) uminus B _ T1 (1) + C D T2 (2) * T3 (3) := A
6.6 3番地コード,4つ組および3つ組 3つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 6.6 3番地コード,4つ組および3つ組 3つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 OP ARG1 ARG2 (0) uminus B _ (1) + C D (2) * (3) := A
6.6 3番地コード,4つ組および3つ組 3つ組 A[I] := B OP ARG1 ARG2 (0) []= A I (1) _ B 6.6 3番地コード,4つ組および3つ組 3つ組 A[I] := B OP ARG1 ARG2 (0) []= A I (1) _ B A := B[I] OP ARG1 ARG2 (0) =[] B I (1) := A
6.6 3番地コード,4つ組および3つ組 間接3つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 6.6 3番地コード,4つ組および3つ組 間接3つ組 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 ST (0) (14) (1) (15) (2) (16) (3) (17) OP ARG1 ARG2 (14) uminus B _ (15) + C D (16) * (17) := A
6.6 3番地コード,4つ組および3つ組 表現法の比較 記憶域 文の順序の変更 4つ組 △ ○ 3つ組 ◎ × 間接3つ組
6.6 3番地コード,4つ組および3つ組 単一の配列による表現 T1 := - B T2 := C + C T3 := T1 * T2 6.6 3番地コード,4つ組および3つ組 単一の配列による表現 T1 := - B T2 := C + C T3 := T1 * T2 A := T3 OP ARG1 ARG2/RES RESULT (0) uminus B T1 (1) + C D T2 (2) * T3 (3) := A
ちょっと休憩 (雑談)
学会旅行 ★★★ 長岡(98.8) 高知(98.12) サン・フランシスコ(99.1) サン・ファン(99.4) ★ 鶯宿温泉(99.5) 香港(99.12) サン・ディエゴ(00.1) ペナン(00.11)
学会旅行 ★ 京都(01.3) 台北(01.7) ★★★ 那覇(01.7) 倉敷(01.12) サン・アントニオ(02.1) プラハ(02.6) マドリッド(02.6) 湯布院(02.8),金沢(02.9),…
休憩おわり
6.7 代入文の翻訳 整数型の代入文 A → id := E E → E + E | E * E | - E | ( E ) | id
6.7 代入文の翻訳 抽象的な水準での翻訳方式 E.P : 式Eの値を保持する名前 E.C : 式Eの値を計算する3番地文の列 6.7 代入文の翻訳 抽象的な水準での翻訳方式 E.P : 式Eの値を保持する名前 E.C : 式Eの値を計算する3番地文の列 N( ) : 新しい一時名の生成関数
6.7 代入文の翻訳 抽象的な水準での翻訳方式 A → id := E {A.C := E.C++[id.P := E.P]} 6.7 代入文の翻訳 抽象的な水準での翻訳方式 A → id := E {A.C := E.C++[id.P := E.P]} E → E(1)+E(2) {E.P:=N( ); E.C:=E(1).C++E(2).C++[E.P:=E(1).P+E(2).P]} (乗算も同じ) E → -E(1) {E.P:=N( ); E.C:=E(1).C++ [E.P:=-E(1).P]} E →(E(1)) {E.P:=E(1).P; E.C:=E(1).C} E → id {E.P:=id.P; E.C:=[ ]}
6.7 代入文の翻訳 具体的な水準での翻訳方式 A → id := E {GEN(id.P := E.P)} 6.7 代入文の翻訳 具体的な水準での翻訳方式 A → id := E {GEN(id.P := E.P)} E → E(1)+E(2) {E.P:=N( ); GEN(E.P:=E(1).P+E(2).P)} E → E(1)*E(2) {E.P:=N( ); GEN(E.P:=E(1).P*E(2).P)} E → -E(1) {E.P:=N( ); GEN(E.P:=-E(1).P)} E →(E(1)) {E.P:=E(1).P} E → id {E.P:=id.P}
6.7 代入文の翻訳 混合型の代入文 式Eの翻訳属性として型を表すE.Mを導入 X:=Y+I*J T1 := I int* J 6.7 代入文の翻訳 混合型の代入文 式Eの翻訳属性として型を表すE.Mを導入 X:=Y+I*J T1 := I int* J T2 := inttoreal T1 T3 := Y real+ T2 X := T3 実数型 整数型