Download presentation
Presentation is loading. Please wait.
1
言語処理系(8) 金子敬一
2
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 制御の流れを変える文
3
6.1 構文主導型翻訳方式 意味動作 生成規則にプログラムを付加 構文解析しながら中間コードを生成 このプログラムを 出力動作 意味規則
6.1 構文主導型翻訳方式 意味動作 生成規則にプログラムを付加 構文解析しながら中間コードを生成 このプログラムを 出力動作 意味規則 などと呼ぶ
4
6.1 構文主導型翻訳方式 翻訳属性 プログラムの扱うデータ 文法記号に付随させる E → E(1) + E(2)
6.1 構文主導型翻訳方式 翻訳属性 プログラムの扱うデータ 文法記号に付随させる E → E(1) + E(2) {E.VAL:=E(1).VAL+E(2).VAL} 上昇型構文解析を想定 葉に近い方が結びつきが強い 翻訳属性
5
6.1 構文主導型翻訳方式 解析木上の翻訳属性 意味動作で翻訳属性を計算可能
6.1 構文主導型翻訳方式 解析木上の翻訳属性 意味動作で翻訳属性を計算可能 E→E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL} E→digit {E.VAL:=digit} 解析木を構成しない場合は,スタックを利用
6
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
7
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
8
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}
9
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ 3 - 2 I I 23 - 2 電卓の実現 S→E$ E→E(1)+E(2)
6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * $ 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
10
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ E 5 I - 5 * - E I 115 23 電卓の実現 S→E$
6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * $ 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
11
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ E 4 I - 4 + - E 119 115 電卓の実現 S→E$
6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * $ 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
12
6.2 構文主導型翻訳系の実現 2 3 * 5 + 4 $ 答えは119 $ - E S 119 - 電卓の実現 S→E$
6.2 構文主導型翻訳系の実現 電卓の実現 2 3 * $ 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 -
13
6.3 中間コード 中間コード プログラ ミング言語 中間コード 機械語 機械に依存しない
14
6.3 中間コード よく用いられる中間コード 後置記法 構文木 4つ組 3つ組
15
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 + *
16
6.4 後置記法 後置式の評価 1 3 + 5 * 20 4
17
6.5 解析木と構文木 構文木 解析木 構文木 演算子 / 被演算子 * d a * (b + c) / d a + b c
18
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)}
19
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
20
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
21
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
22
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
23
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
24
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
25
6.6 3番地コード,4つ組および3つ組 表現法の比較 記憶域 文の順序の変更 4つ組 △ ○ 3つ組 ◎ × 間接3つ組
26
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
27
ちょっと休憩 (雑談)
28
学会旅行 ★★★ 長岡(98.8) 高知(98.12) サン・フランシスコ(99.1) サン・ファン(99.4) ★ 鶯宿温泉(99.5)
香港(99.12) サン・ディエゴ(00.1) ペナン(00.11)
29
学会旅行 ★ 京都(01.3) 台北(01.7) ★★★ 那覇(01.7) 倉敷(01.12) サン・アントニオ(02.1)
プラハ(02.6) マドリッド(02.6) 湯布院(02.8),金沢(02.9),…
30
休憩おわり
31
6.7 代入文の翻訳 整数型の代入文 A → id := E E → E + E | E * E | - E | ( E ) | id
32
6.7 代入文の翻訳 抽象的な水準での翻訳方式 E.P : 式Eの値を保持する名前 E.C : 式Eの値を計算する3番地文の列
6.7 代入文の翻訳 抽象的な水準での翻訳方式 E.P : 式Eの値を保持する名前 E.C : 式Eの値を計算する3番地文の列 N( ) : 新しい一時名の生成関数
33
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:=[ ]}
34
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}
35
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 実数型 整数型
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.