• 検索結果がありません。

コンパイラとプログラミング⾔語

N/A
N/A
Protected

Academic year: 2021

シェア "コンパイラとプログラミング⾔語"

Copied!
29
0
0

読み込み中.... (全文を見る)

全文

(1)

コンパイラとプログラミング⾔語

9

週 中間表現と意味解析

2013年6⽉12⽇

⾦岡 晃

(2)

授業計画

1

(4/10)

コンパイラの概要 第

2

(4/24)

コンパイラの構成 第

3

(5/1)

プログラミング⾔語の形式的な 記述

4

(5/8)

字句解析の概要と⾮決定性有限 オートマトン

5

(5/15)

決定性有限オートマトン・字句 解析プログラム

6

(5/22)

中間試験

7

(5/29)

構⽂解析の概要

/

上向き構⽂解析

8

(6/5)

下向き構⽂解析

/

構⽂解析プ ログラム

9

(6/12)

中間表現と意味解析 第

10

(6/19)

Java

仮想マシンとその機械語 第

11

(6/26)

条件分岐⽂と繰り返し⽂の コード⽣成

12

(7/3)

関数呼び出しのコード⽣成 第

13

(7/10)

休講

(7/24 or  7/31)

期末試験

(3)

【復習】第 8

下向き構⽂解析 / 構⽂解析プログラム

コンパイラとプログラミング⾔語

(4)

コンパイラの論理的な構成

プログラムソース ⽬的

プログラム

コンパイラ

字句解析 構⽂

解析 意味

解析 最適化 コード

⽣成

中間情報(中間語、名前表)

フェーズ

(5)

構⽂解析

• 字句解析が出⼒したトークンを読み込みながら、そのトークンの列 がプログラム⾔語の⽂法で許されているパターンと合うかを解析す る

プログラムソース 字句解析 トークントークン 構⽂解析

構⽂⽊

構⽂⽊

名前表

許されているパターンであれば、トークンの列は構⽂規則 に従って構成され、字句を葉とする構⽂⽊が⽣成される。

構⽂解析の結果、ソースプログラムの構造は構⽂⽊として 出⼒され、名前や数字などの情報は名前表に出⼒される。

(6)

構⽂解析法

上向き構⽂解析法

(bottom-up parser)

下向き構⽂解析法

(top-down parser)

⼊⼒した記号列が構⽂規則の 右辺と⼀致した場合に左辺の 記号に置き換えていく

記号列として次に何が来るの かを仮定しながら構⽂解析を

進めていく a ( b + c )

名前 名前

因⼦

名前 因⼦

因⼦

因⼦

上向き

解析法構⽂

下向き構⽂

解析法

(7)

左再帰的に記述されていると 解析が⾏えない場合がある

下向き構⽂解析の問題点(1)

左再帰性の問題 左再帰性:

⽣成規則の左辺の記号が右辺の最 左の記号になっている

左再帰性のある構⽂規則の例

<式> ::= <項> | <式>+<項>

<項> ::= <因⼦>| <項>*<因⼦>

<因⼦> ::= <名前>|(<式>)

<名前> ::= a|b|c

解析時に無限にループしてしまう

(8)

下向き構⽂解析の問題点(2)

効率が悪くなる バックトラック

(後戻り)

なぜ起こるか?

構⽂規則

<S> ::= a<A>bd

<A> ::= cb|c

双⽅のケースが

同じ終端記号(ここでは

”c”

) から始まっている

対策の1つ 括り出し:

共通の部分を別の規則で 独⽴させる

<S> ::= a<A>bd

<A> ::= c<B>

<B> ::= b|ε

“ε”

は 無⼊⼒を意味

する

(9)

LL 構⽂解析

⼊⼒された記号列の先頭(最も左)の⾮終端記号に適⽤すべき

⽣成規則を、それ以降の記号列を調べることによって⼀意に決 定することが可能となるようにする

LL: Left to right scan

Left most derivation

LL(k)構⽂解析

先読み記号を最⼤k個まで許すことを意味する

k=1 のとき、バックトラックのない下向き構⽂解析が可能。

そのとき、LL(1)構⽂解析を可能にする⽂法をLL(1)⽂法という

(10)

LL(1) ⽂法

与えられた⽂法Gに対する任意の⽣成規則

<A> ::= | |…|

に対してDirector(

A,

)

Director(

A,

) = , ならば、⽂法GはLL(1)⽂法である。

First集合

First( ) = {

| ∈ ,

⇒ ⋯

} ただし、

なら

First( ) Follow集合

Director集合

Follow( ) = {

| ∈ ,

⇒ ⋯ ⋯

}

Director(

,

) = {

| ∈ , ∈

First

または(

かつ

Follow( ))}

終端記号の集合は

(11)

9

中間表現と意味解析

コンパイラとプログラミング⾔語

(12)

本⽇の到達⽬標と概要

• 到達⽬標

– 構⽂解析の中間出⼒としての構⽂⽊と四つ組の理解 – 意味解析の概要理解

– 名前表への検索⼿法の理解

• 概要

– 四つ組と構⽂⽊

– 意味解析

– 名前表と探索

• 線型探索

• ⼆分探索

• ハッシュ法

(13)

構⽂解析とその出⼒

• 字句解析が出⼒したトークンを読み込みながら、そのトークンの列 がプログラム⾔語の⽂法で許されているパターンと合うかを解析す る

プログラムソース 字句解析 トークントークン 構⽂解析

構⽂⽊

構⽂⽊

名前表

許されているパターンであれば、トークンの列は構⽂規則 に従って構成され、字句を葉とする構⽂⽊が⽣成される。

構⽂解析の結果、ソースプログラムの構造は構⽂⽊として 出⼒され、名前や数字などの情報は名前表に出⼒される。

(14)

構⽂解析法

上向き構⽂解析法

(bottom-up parser)

下向き構⽂解析法

(top-down parser)

⼊⼒した記号列が構⽂規則の 右辺と⼀致した場合に左辺の 記号に置き換えていく

記号列として次に何が来るの かを仮定しながら構⽂解析を

進めていく a ( b + c )

名前 名前

因⼦

名前 因⼦

因⼦

因⼦

上向き

解析法構⽂

下向き構⽂

解析法

(15)

構⽂⽊の表現⽅法:⼆分⽊と四つ組

• ⼆分⽊

– ⼆項演算⼦から成る式や代⼊⽂で利⽤される

– 演算⼦というノード(節点)が 2 つの⼦を持つ。

– 2 つの⼦がオペランド

– 変数や定数は⼦を持たない(葉ノード)

• 四つ組

– 演算⼦、 2 つのオペランド、演算結果の保管先アドレス、という 4 つのデータを 1 つの組として保管する⽅法

– ⼆分⽊に⽐べ、メモリ消費が少ない

=

a +

+ b c tmp#1

= tmp#1 a

(16)

⼆分⽊による構⽂⽊表現

• ⼆項演算⼦から成る式や代⼊⽂で利⽤される

• 演算⼦というノード(節点)が 2 つの⼦を持つ。

• 2 つの⼦がオペランド

• 変数や定数は⼦を持たない(葉ノード)

d=a*(b+c)

=

d *

a +

b c

z=y+1/(x‐1)

=

z +

y /

1 ‐

x 1

(17)

例:⼆分⽊を拡張する

• ⼆項演算⼦以外にも適⽤できる ようにする

– 3 項以上も O.K.

– 関数呼び出しにも対応

• call というノードで「関数 を呼び出す」を⽰す

• call の左の⼦ノードが「関 数名」

• call の右の⼦ノードを arg_vector というノード にし、その⼦ノードに

「引数」がくるようにす る

y+find_max(a+b, c, 0)/(x‐1)

y /

call

find_max arg_vector

+ c

a b

0

x 1

+

(18)

四つ組

• 演算⼦、 2 つのオペランド、演算結果の保管先アドレス、という 4 つの データを 1 つの組として保管する⽅法

1. 演算⼦の情報

2. 第 1 オペランドの情報 3. 第 2 オペランドの情報 4. 演算結果の保存先

• ⼆分⽊に⽐べ、メモリ消費が少ない

+ b c tmp#1

* a tmp#1 tmp#2

= tmp#2 d

d=a*(b+c)

=

d *

a +

b c

(19)

四つ組の例

z=y+1/(x‐1)

=

z +

y /

1 ‐

x 1

‐ x 1 tmp#1

/ 1 tmp#1 tmp#2

+ y tmp#2 tmp#3

= tmp#3 z

(20)

コンパイラの論理的な構成

プログラムソース ⽬的

プログラム

コンパイラ

字句解析 構⽂

解析 意味

解析 最適化 コード

⽣成

中間情報(中間語、名前表)

フェーズ

(21)

意味解析

• 名前表を利⽤したエラーチェック

– ある識別⼦がプログラム中に現れたときに、構⽂的には正しく ても、意味が不明になるケースが現れたらエラーを返す

• 例

– データ宣⾔部の処理に、同じ名前を複数回宣⾔していないかと いう⼆重宣⾔のチェック

– 実⾏部の処理に、宣⾔されていない名前を⽤いてないかの チェック

– 代⼊の場合、左辺は利⽤可能な名前かどうかのチェック

– 演算や代⼊処理に合わせて型の整合をとるためのチェック

(22)

名前表

• ソースプログラム中のデータ宣⾔部より、ユーザが名前を付けた変 数や配列、関数についての情報がまとめられた表

• 書かれる情報例

– 形式:変数、配列、関数、ユーザ定義型など – 型:整数、実数、⽂字列、ポインタなど

– 語⻑: 1 バイト、 4 バイト、 8 バイト – 種類:グローバル、仮引数

– メモリ上の番地

– …

エントリ番号 名前 データ型 番地 領域⻑

1 a int 12 4

2 b int 16 4

3 c int 20 4

4 d int 24 4

5 $wk1 int 28 4

6 $wk2 int 32 4

(23)

フェーズ概要:ソースプログラム

int a,b,c,d;

a=b+c*d;

回)

4/24

(第

2

回)

の資料より

(24)

フェーズ概要:字句解析

int a,b,c,d;

a=b+c*d;

予約語

int

名前

a

名前

b

名前

c

名前

d

記号コンマ 記号コンマ

記号コンマ 記号セミコロン

記号セミコロン

名前

a

名前

b

名前

c

名前

d

記号等号 記号加算

記号乗算 字句解析

回)

4/24

(第

2

回)

の資料より

(25)

フェーズ概要:構⽂解析

予約語

int

名前

a

名前

b

名前

c

名前

d

記号コンマ 記号コンマ

記号コンマ 記号セミコロン

名前表に登録 エントリ番号 名前 データ型 番地 領域⻑

1 a int 12 4

2 b int 16 4

3 c int 20 4

4 d int 24 4

5 $wk1 int 28 4

6 $wk2 int 32 4

回)

4/24

(第

2

回)

の資料より

(26)

フェーズ概要:構⽂解析

記号セミコロン

名前

a

名前

b

名前

c

名前

d

記号等号 記号加算

記号乗算

中置記法から後置記法に変換

名前

a

名前

b

名前

c

名前

d

記号乗算 記号加算 記号等号 回)

4/24

(第

2

回)

の資料より

(27)

フェーズ概要:意味解析

名前を名前表と照合し、エントリ番号に置き換え 算術式を複数の演算に分解

乗算 名前表#

3

名前表#

4

名前表#

5

加算 名前表#

2

名前表#

5

名前表#

6

代⼊ 名前表#

1

名前表#

6

回)

4/24

(第

2

回)

の資料より

(28)

名前表と検索

意味解析では、構⽂解析によって検出した名前を名前表で検索する必要がある

代表的な検索⼿法

線型検索

表の先頭から順に検索対象の⽂字列と等しいかを調べる⽅法

検索にかかる⼿間:

1 2 ⁄

実装が容易

⼆分検索

⼆分⽊を⽤意して検索

検索の効率は線型検索に⽐べて良い

検索にかかる⼿間:

log 1 –

ハッシュ表の利⽤

表のインデックス(それぞれのデータの番号)にハッシュ値を利⽤

ハッシュ値:⼊⼒されたデータをハッシュ関数により値に変換

値の分布が⼀様

検索したい⽂字列をハッシュ関数にかけて得たインデックスを呼び出す

検索にかかる⼿間:

1

(29)

本⽇の到達⽬標と概要

• 到達⽬標

– 構⽂解析の中間出⼒としての構⽂⽊と四つ組の理解 – 意味解析の概要理解

– 名前表への検索⼿法の理解

• 概要

– 四つ組と構⽂⽊

– 意味解析

– 名前表と探索

• 線型探索

• ⼆分探索

• ハッシュ法

参照

関連したドキュメント

ベクトル計算と解析幾何 移動,移動の加法 移動と実数との乗法 ベクトル空間の概念 平面における基底と座標系

名大・工 鳥居 達生《胎 t 鍵ゆ驚麗■) 名大・工 襲井 鉄轟〈艶 t 鍵陣 s 濾囎麗) 名大・工 彰浦 洋韓ユ騰曲エ鋤翼鱒騰

Kyoto University, Kyoto,

Amortized efficiency of list update and paging rules.. On the

Research Institute for Mathematical Sciences, Kyoto University...

This paper proposes that the two-way interpretation of an indet-mo shown in (88) results from the two structural positions that an indet-mo can occur in: an indet-mo itself

解析モデル平面図 【参考】 修正モデル.. 解析モデル断面図(その2)

※ CMB 解析や PMF 解析で分類されなかった濃度はその他とした。 CMB