Upload
kaelem
View
76
Download
0
Embed Size (px)
DESCRIPTION
Compilers Chapter5 Syntax-Directed Translation. 電子情報工学科 4 年 早津 政和. 概要. 文法指向翻訳 syntax-directed definition & translation scheme 統合属性と継承属性 依存関係グラフ L 属性定義と実装 Top-down での評価 Bottom-up での評価 スタックとレジスタ. Syntax-Directed Translation. 文法記号に「属性」を付け加えた言語を解釈 - PowerPoint PPT Presentation
Citation preview
CompilersChapter5 Syntax-Directed Translation
電子情報工学科 4年
早津 政和
概要
文法指向翻訳– syntax-directed definition & translation scheme– 統合属性と継承属性– 依存関係グラフ
L 属性定義と実装– Top-down での評価 Bottom-up での評価– スタックとレジスタ
Syntax-Directed Translation
文法記号に「属性」を付け加えた言語を解釈
syntax-directed definition と translation scheme の 2 つの記法がある
parsing と同時に意味規則を評価できる方法は、コンパイル時間の効率の面で非常に重要
→ L 属性定義を用いると実行可能
Syntax-directed Definition& Translation Scheme
syntax-directed definition 高次の表現法で実装の詳細を隠す
translation scheme 意味規則が評価される順番を示し、実装の詳細を明らかにする
{ SEMANTIC ACTION }T → T1 * F { T.val := T1.val × F.val}
PRODUCTION SEMANTIC RULE
T → T1 * F T.val := T1.val × F.val
Synthesized Attribute& Inherited Attribute
統合属性 子ノードから値が計算される
継承属性 親や兄弟ノードから値が計算さ
れる
依存関係グラフ 属性間の依存関係を 矢印で表し
たグラフ
A
CB
D E
Dependency Graph
Circularity 依存関係グラフが循環性を持っていると評価できない
依存関係グラフが循環性を持たず、属性値の依存関係に(部分)順序が
あるとき、 Strong Noncircular
Syntax-Directed Definitionと呼び 再帰的に評価をする関数を、作れる
i s t
i s t i s t
E
E1 E2
L–Attributed Definitions
L( 左 ) 属性定義 A→X1 ・・・ Xn において、 X jの属性値が X1 ~ X j -1 の属性値と A の継承属性のみに依存する
translation scheme で表現する際の制限 1 . X の継承属性: その記号より前の動作で値が計算されていなければならない
2 . X の意味動作: その動作より右の記号の統合属性の値を用いてはならない
3 . A の統合属性: 参照している全ての記号の属性値が計算されて初めて計算でき
る
Top-down での評価
左再帰の排除 等は省略
translation scheme から predictive translator を作るアルゴリズム
1. 非終端記号 A に対応する関数(継承属性値をパラメタに取り、統合属性値を返す)を作成する
2. 非終端記号 A に対応するコードは現在の入力記号に基づいて、どの生成規則を適用するかを決める
3.production の右側に対応するコードは以下の通り ⅰ ) トークン X :属性値を変数に格納し、入力を一つ進める ⅱ) 非終端記号 B : c:=B(b1,b2,…,bk) を生成 c: 統合属性 b: 継承
属性 ⅲ) 意味動作:動作はそのままに、属性値に対応する変数を参照す
る
Bottom-up での評価(1)
translation scheme での表現 例)変数宣言 int p, q, r; の評価
D → T { L.in := T.type }
L ;
T → int { T.type := integer }
T → real { T.type := real }
L → { L1.in := L.in }
L1, id { addtype(id.entry, L.in) }
L → id { addtype(id.entry, L.in) }
Bottom-up での評価(2)
スタックの様子
スタックは下の図のように状態と属性値の対でできているとする A→XYZ の場合、 XYZ が A に置き換わる「縮小」が起こる
INPUT state PRODUCTION USED
real p , q , r
-
p , q , r real
p , q , r T T → real
, q , r T p
, q , r T L L → id
q , r T L ,
, rT L ,q
, r T L L → L , id
r T L ,T L ,r
T L L → L , id
D D → T L
state val
・・・ ・・・
X X.x
Y Y.y
Z Z.z
・・・ ・・・
top →
Bottom-up での評価(3)
スタックを考慮したコード
※ top, ntop は縮小前/後のスタックのトップを表す
L→id が適用される時、 id.entry はスタックのトップに、 T.type はその下に
あるため addtype(val[top],val[top-1]) は addtype(id.entry,T.type) と等価 このようにスタック中の T.type の値を替わりに用いることで、 L.in を含
むコピールールが消える
PRODUCTION CODE FRAGMENT
D → T L ;T → int val[ntop] := integer
T → real val[ntop] := real
L → L , idaddtype(val[top] , val[top-3])
L → idaddtype(val[top] , val[top-1])
Bottom-up での評価(4)
埋込み動作の排除
translation scheme の動作が production を終端するように
マーカーを埋め込む
R → + T {print('+')} R ⇒ R → + T M R
M → {print('+')}
Bottom-up での評価(5)
属性値の位置
1 つ目 /2 つ目どちらの生成
規則を用いるかに関わらず C.i は val[top-1]
PRODUCTION SEMANTIC RULES
S → aAC C.i := A.s
S → bABC C.i := A.s
C → c C.s := g(C.i)
PRODUCTION SEMANTIC RULES
S → aAC C.i := A.s
S → bABMC C.i := A.s; C.i := M.s
C → c C.s := g(C.i)
M →ε M.s := M.i
スタックとレジスタ(1)
コピールール コピールールを特別に扱うことによってスタックの利用効率を改
善することができる 1つよりも多くのスタックを利用した方がその機会が多くなる
1 スタック 2 スタックA.iA.i
B1.i
A.i
B1.i
B1.s
A.i
B1.i
B1.s
B2.i
A.i
B1.i
B1.s
B2.i
B2.s
A.i
A.s
A.i B1.s
B2.s
A.sB1.s
A
B1 B2
i
i i
スタックとレジスタ(2)
レジスタ 一つのレジスタはスタックの特別な場合と考えられる スタックに多くとも1要素のみが入る場合は代わりにレジス
タを用いることができる
Lifetime 属性値の Lifetime は算出されたときに始まりそれに依存する
全ての属性が算出されたときに終わる 2つの属性の Lifetime が重なっていないとき、それらの値は
同じレジスタに格納することができる