Document

言語処理系(8)
金子敬一
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 構文主導型翻訳方式
• 翻訳属性
プログラムの扱うデータ
文法記号に付随させる
翻訳属性
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.1 構文主導型翻訳方式
• 解析木上の翻訳属性
E→E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL}
E→digit {E.VAL:=digit}
E
3
1
E
3
2
E
1
6
E
+
2
E
+
3
6.2 構文主導型翻訳系の実現
• スタックによる実現
A→XYZ
{A.VAL:= f (X.VAL, Y.VAL, Z.VAL)}
状態
Z
Y
X
値
Z.VAL
Y.VAL
X.VAL
状態
値
A
A.VAL
6.2 構文主導型翻訳系の実現
• 電卓の実現
S →E$
(1)
(2)
→
+
E E E
(1)
(2)
→
*
E E E
(1)
→(
E E )
E→ I
I→I(1) digit
I→digit
意味動作
{print E.VAL}
(1)
(2)
{E.VAL:=E .VAL+E .VAL}
(1)
(2)
{E.VAL:=E .VAL*E .VAL}
(1)
{E.VAL:=E .VAL}
{E.VAL:=I.VAL}
{I.VAL:=10*I(1).VAL+LEXVA
L}
{I.VAL:=LEXVAL}
6.2 構文主導型翻訳系の実現
• 電卓の実現
S →E$
(1)
(2)
→
+
E E E
(1)
(2)
→
*
E E E
(1)
→(
E E )
E→ I
I→I(1) digit
I→digit
2 3 * 5 + 4 $
3
-
2
I
23
-2
6.2 構文主導型翻訳系の実現
• 電卓の実現
S →E$
(1)
(2)
→
+
E E E
(1)
(2)
→
*
E E E
(1)
→(
E E )
E→ I
I→I(1) digit
I→digit
2 3 * 5 + 4 $
5I
E
-5
*
-
EI
115
23
6.2 構文主導型翻訳系の実現
• 電卓の実現
S →E$
(1)
(2)
→
+
E E E
(1)
(2)
→
*
E E E
(1)
→(
E E )
E→ I
I→I(1) digit
I→digit
2 3 * 5 + 4 $
4I
E
-4
+
-
E
119
115
6.2 構文主導型翻訳系の実現
• 電卓の実現
2 3 * 5 + 4 $
S →E$
(1)
(2)
→
+
E E E
(1)
(2)
→
*
E E E
答えは119
(1)
E→(E )
E→ I
$
I→I(1) digit
E
S
I→digit
119
-
6.3 中間コード
• 中間コード
プログラ
ミング言語
中間コード
機械に依存しない
機械語
6.3 中間コード
• よく用いられる中間コード
− 後置記法
−構文木
− 4つ組
− 3つ組
6.4 後置記法
• 後置記法
e1, e2, ..., ek : 後置記法の式
q : k項演算子
e1 e2 ... ek q : e1, ..., ekで表された値にq を
適用した結果
(a + b) * c
a * (b + c)
(a + b) * (c + d)
a b + c *
a b c + *
a b + c d + *
6.4 後置記法
• 後置式の評価
1
4
20
3
+
5
*
6.5 解析木と構文木
• 構文木
解析木
構文木
/
被演算子
*
a * (b + c) / d
a
d
+
b
c
演算子
6.5 解析木と構文木
• 構文木への構文主導型翻訳
(1) E → E op E
(1)
(2)
op
{E.VAL := NODE( , E .VAL, E .VAL}
(1)
(1)
(
)
(2) E → E
{E.VAL := E .VAL}
(3) E → -E(1)
(1)
{E.VAL := UNARY( , E .VAL}
(4) E → id
{E.VAL := LEAF(id)}
(1)
(2)
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
−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
(0)
(1)
OP
uminus
+
ARG1
B
C
ARG2
_
D
RESULT
T1
T2
(2)
(3)
*
:=
T1
T3
T2
T3
A
_
6.6 3番地コード,4つ組および3つ組
• 3つ組
T1 := - B
T2 := C + C
T3 := T1 * T2
A := T3
(0)
(1)
OP
uminus
+
ARG1
B
C
ARG2
_
D
(2)
(3)
*
:=
(0)
A
(1)
(2)
6.6 3番地コード,4つ組および3つ組
• 3つ組
A[I] := B
(0)
(1)
OP
[]=
ARG2
I
_
ARG1
A
B
OP
=[]
:=
ARG1
B
A
ARG2
I
_
A := B[I]
(0)
(1)
(0)
6.6 3番地コード,4つ組および3つ組
• 間接3つ組
T1 := - B
T2 := C + C
T3 := T1 * T2
A := T3
(0)
(1)
ST
(14)
(15)
(2)
(3)
(16)
(17)
(14)
(15)
OP
uminus
+
ARG1
B
C
ARG2
_
D
(16)
(17)
*
:=
(14)
A
(15)
(16)
6.6 3番地コード,4つ組および3つ組
• 表現法の比較
4つ組
3つ組
間接3つ組
記憶域
文の順序の変更
△
◎
○
○
×
○
6.6 3番地コード,4つ組および3つ組
• 単一の配列による表現
T1 := - B
T2 := C + C
T3 := T1 * T2
A := T3
ARG1
B
ARG2/RES
(0)
OP
uminus
(1)
+
C
D
T2
(2)
*
:=
T1
T3
T2
A
T3
(3)
RESULT
T1
ちょっと休憩
(雑談)
学会旅行
•
•
•
•
•
•
•
•
長岡(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番地文の列
−N( ) : 新しい一時名の生成関数
6.7 代入文の翻訳
• 抽象的な水準での翻訳方式
A → id := E {A.C := E.C++[id.P := E.P]}
(1)
(2)
+
E → E E {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)}
E → E(1)+E(2) {E.P:=N( ); GEN(E.P:=E(1).P+E(2).P)}
(1)
(2)
(1)
(2)
*
E → E E {E.P:=N( ); GEN(E.P:=E .P*E .P)}
E → -E(1) {E.P:=N( ); GEN(E.P:=-E(1).P)}
(1)
(1)
(
)
E→ E
{E.P:=E .P}
E → id {E.P:=id.P}
6.7 代入文の翻訳
• 混合型の代入文
式Eの翻訳属性として型を表すE.Mを導入
X:=Y+I*J
実数型 整数型
T1 := I int* J
T2 := inttoreal T1
T3 := Y real+ T2
X := T3