15
Compilers Chapter5 Syntax-Directed Translation 電電電電電電電 4 電 電電 電電

Compilers Chapter5 Syntax-Directed Translation

  • 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

Page 1: Compilers Chapter5  Syntax-Directed Translation

CompilersChapter5 Syntax-Directed Translation

電子情報工学科  4年

早津 政和

Page 2: Compilers Chapter5  Syntax-Directed Translation

概要

文法指向翻訳– syntax-directed definition & translation scheme– 統合属性と継承属性– 依存関係グラフ

L 属性定義と実装– Top-down での評価 Bottom-up での評価– スタックとレジスタ

Page 3: Compilers Chapter5  Syntax-Directed Translation

Syntax-Directed Translation

文法記号に「属性」を付け加えた言語を解釈

syntax-directed definition と translation scheme の 2 つの記法がある

parsing と同時に意味規則を評価できる方法は、コンパイル時間の効率の面で非常に重要

   → L 属性定義を用いると実行可能

Page 4: Compilers Chapter5  Syntax-Directed Translation

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

Page 5: Compilers Chapter5  Syntax-Directed Translation

Synthesized Attribute& Inherited Attribute

統合属性 子ノードから値が計算される

継承属性 親や兄弟ノードから値が計算さ

れる

依存関係グラフ 属性間の依存関係を           矢印で表し

たグラフ

 A

CB

D E

Page 6: Compilers Chapter5  Syntax-Directed Translation

Dependency Graph

Circularity 依存関係グラフが循環性を持っていると評価できない

 依存関係グラフが循環性を持たず、属性値の依存関係に(部分)順序が

あるとき、 Strong Noncircular

Syntax-Directed Definitionと呼び 再帰的に評価をする関数を、作れる

i s t

i s t i s t

E

E1 E2

Page 7: Compilers Chapter5  Syntax-Directed Translation

L–Attributed Definitions

L( 左 ) 属性定義   A→X1 ・・・ Xn において、   X jの属性値が X1 ~ X j -1 の属性値と A の継承属性のみに依存する

translation scheme で表現する際の制限  1 . X の継承属性:    その記号より前の動作で値が計算されていなければならない

  2 . X の意味動作:    その動作より右の記号の統合属性の値を用いてはならない

  3 . A の統合属性:    参照している全ての記号の属性値が計算されて初めて計算でき

Page 8: Compilers Chapter5  Syntax-Directed Translation

Top-down での評価

左再帰の排除 等は省略

translation scheme から predictive translator を作るアルゴリズム

1. 非終端記号 A に対応する関数(継承属性値をパラメタに取り、統合属性値を返す)を作成する

2. 非終端記号 A に対応するコードは現在の入力記号に基づいて、どの生成規則を適用するかを決める

3.production の右側に対応するコードは以下の通り  ⅰ ) トークン X :属性値を変数に格納し、入力を一つ進める ⅱ) 非終端記号 B : c:=B(b1,b2,…,bk) を生成  c: 統合属性 b: 継承

属性 ⅲ) 意味動作:動作はそのままに、属性値に対応する変数を参照す

Page 9: Compilers Chapter5  Syntax-Directed Translation

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) }

Page 10: Compilers Chapter5  Syntax-Directed Translation

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 →

Page 11: Compilers Chapter5  Syntax-Directed Translation

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])

Page 12: Compilers Chapter5  Syntax-Directed Translation

Bottom-up での評価(4)

埋込み動作の排除 

  translation scheme の動作が production を終端するように

マーカーを埋め込む

  R → + T {print('+')} R   ⇒ R → + T M R

  M → {print('+')}

Page 13: Compilers Chapter5  Syntax-Directed Translation

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

Page 14: Compilers Chapter5  Syntax-Directed Translation

スタックとレジスタ(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

Page 15: Compilers Chapter5  Syntax-Directed Translation

スタックとレジスタ(2)

レジスタ   一つのレジスタはスタックの特別な場合と考えられる   スタックに多くとも1要素のみが入る場合は代わりにレジス

タを用いることができる

Lifetime   属性値の Lifetime は算出されたときに始まりそれに依存する

全ての属性が算出されたときに終わる   2つの属性の Lifetime が重なっていないとき、それらの値は

同じレジスタに格納することができる