475
ビジュアル構文解析 Kazuhiro Ichikawa @phenan 1

ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

ビジュアル構文解析

Kazuhiro Ichikawa @phenan

1

Page 2: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

概要 •  様々な構文解析アルゴリズムを図解で紹介 Ø 古典的な手法から最近のものまで Ø  "なんとなく理解できる" のを目指す

•  スライド Ø  www.csg.ci.i.u-tokyo.ac.jp/~ichikawa/visual_parsing.pdf Ø 重いのでダウンロード推奨

2

Page 3: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

3

演算子順位構文解析 Ø  Shunting-yard algorithm Ø  Pratt parsing

上向き構文解析 Ø  LR parsing Ø  GLR parsing Ø  Earley parsing Ø  CYK algorithm Ø  Valiant parsing

下向き構文解析 Ø  LL(k) parsing Ø  Packrat parsing Ø  Packrat parsing with left recursion Ø  GLL parsing Ø  Adaptive LL(*) parsing

紹介するアルゴリズム

Page 4: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4

演算子順位構文解析 Ø  Shunting-yard algorithm 中置記法を後置記法に直す Ø  Pratt parsing 再帰下降型演算子順位構文解析

上向き構文解析 Ø  LR parsing 決定性有限オートマトン Ø  GLR parsing 非決定性有限オートマトン Ø  Earley parsing 動的計画法 Ø  CYK algorithm 動的計画法 Ø  Valiant parsing 行列積

下向き構文解析 Ø  LL(k) parsing k文字先読み Ø  Packrat parsing メモ化再帰 Ø  Packrat parsing with left recursion 強欲マッチ Ø  GLL parsing グラフ構造継続 Ø  Adaptive LL(*) parsing 先読みオートマトンの動的構築

紹介するアルゴリズム

Page 5: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

演算子順位構文解析 Operator precedence parsing

5

Page 6: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6

Shunting-yard algorithm [Dijkstra 1961] •  最も簡単な上向き構文解析 •  数式の構文解析が得意

Pratt parsing [Pratt 1973] •  下向きの演算子順位構文解析 •  手書きの再帰下降構文解析器の一部として利用される •  数式の構文解析が得意

Page 7: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Shunting-yard algorithm [Dijkstra 1961]

アイデア •  演算子優先度を使って後置記法に直す •  スタックを使い優先度順に並べ替える

7

1

*

2

+

3 1 * 2 + 3

優先度

後置記法

1 2 * 3 +

中置記法

Page 8: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8

1 2 + ( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 9: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

9

1 2 + ( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 10: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

10

1

2 + ( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 11: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

11

1

2 + ( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 12: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

12

1

2 + ( * 3 4 + * ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

Page 13: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

13

1

2 + ( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 14: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

14

1

2

+

( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 15: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

15

1

2 +

( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 16: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

16

1 2

+

( * 3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 17: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

17

1 2

+

(

*

3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 18: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

18

1 2

+ ( *

3 4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 19: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

19

1 2

+ ( * 3

4 + * ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

Page 20: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

20

1 2

+ ( *

3

4 + ) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 21: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

21

1 2

+ ( *

3

4

+

) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 22: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

22

1 2

+ ( *

3

4 +

) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 23: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

23

1 2

+ ( *

3 4

+

) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 24: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

24

1 2

+ ( *

3 4 +

) 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

対応

対応

*

Page 25: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

25

1 2

+ *

3 4 +

5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 26: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

26

1 2

+ *

3 4 +

5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 27: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

27

1 2

+

* 3 4 +

5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 28: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

28

1 2

+

* 3 4 +

5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 29: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

29

1 2

+

* 3 4 +

5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 30: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

30

1 2

+

* 3 4 + 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

*

Page 31: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

31

1 2

+

* 3 4 + * 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

Page 32: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

32

1 2 + * 3 4 + 5

入力

$

スタック

$

出力

Num + * ( ) $ input 7 2 4 6 1 0 stack 7 3 5 1 0

終了

終了

*

Page 33: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Shunting-yard algorithm [Dijkstra 1961]

•  2つの順位関数を利用する手法を紹介した Ø  Dijkstra のオリジナルの論文では順位関数は1つ

•  順位行列を利用する方法もある Ø こちらの方がより強力

•  能力 Ø 計算量 : O(n) Ø 言語 : Operator-precedence language Ø 文法 : Operator-precedence grammar

33

Page 34: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Pratt parsing [Pratt 1973]

アイデア •  構文木の左下から上に成長させる •  構文木の右の枝は再帰的に作る

34

1

*

2

+

3

*

4

Page 35: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

35

- + 1 2 ( * - 3 ) 4 *

入力

5 $

$

Page 36: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

36

- + 1 2 ( * - 3 ) 4 *

入力

5 $

$

読む

Page 37: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

37

+ 1 2 ( * - 3 ) 4 *

入力

5 $

$

-

Page 38: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

38

+ 1 2 ( * - 3 ) 4 *

入力

5 $

$

- 前置単項演算子

Page 39: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

39

+ 1 2 ( * - 3 ) 4 *

入力

5 $

$

-

Page 40: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

40

+ 1 2 ( * - 3 ) 4 *

入力

5 $

$

-

読む

Page 41: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

41

+ 2 ( * - 3 ) 4 *

入力

5 $

$

-

1

Page 42: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

42

+ 2 ( * - 3 ) 4 *

入力

5 $

$

-

1

Page 43: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

43

+ 2 ( * - 3 ) 4 *

入力

5 $

$

-

1

Page 44: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

44

+ 2 ( * - 3 ) 4 *

入力

5 $

$

-

1

Page 45: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

45

+

2 ( * - 3 ) 4 *

入力

5 $

$

-

1

中置二項演算子

Page 46: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

46

* - 3 ) 4 *

入力

5 $

$

-

1

+

( 2

Page 47: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

47

* - 3 ) 4 *

入力

5 $

$

-

1

+

( 2

読む

Page 48: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

48

* - 3 ) 4 *

入力

5 $

$

-

1

+

(

2

(_):: 外置演算子

Page 49: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

49

* - 3 ) 4 *

入力

5 $

$

-

1

+

(

2

Page 50: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

50

* - 3 ) 4 *

入力

5 $

$

-

1

+

(

2

Page 51: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

51

* - 3 ) 4 *

入力

5 $

$

-

1

+

(

2

Page 52: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

52

- 3 ) 4 *

入力

5 $

$

-

1

+

(

2

*

Page 53: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

53

- ) 4 *

入力

5 $

$

-

1

+

(

2

*

3

Page 54: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

54

- ) 4 *

入力

5 $

$

-

1

+

(

2

*

3

Page 55: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

55

- ) 4 *

入力

5 $

$

-

1

+

(

2

*

3

Page 56: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

56

) 4 *

入力

5 $

$

-

1

+

(

2

*

3

-

Page 57: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

57

) *

入力

5 $

$

-

1

+

(

2

*

3

-

4

Page 58: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

58

) *

入力

5 $

$

-

1

+

(

2

*

3

-

4

対応

対応

Page 59: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

59

*

入力

5 $

$

-

1

+

2

*

3

-

4

Page 60: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

60

*

入力

5 $

$

-

1

+

2

*

3

-

4

Page 61: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

61

入力

5 $

$

-

1

+

2

*

3

-

4

*

Page 62: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

62

入力

$

$

-

1

+

2

*

3

-

4

*

5

Page 63: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

63

入力

$

$

-

1

+

2

*

3

-

4

*

5

Page 64: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

64

入力

$

$

-

1

+

2

*

3

-

4

*

5

Page 65: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

65

入力

$

$

-

1

+

2

*

3

-

4

*

5

終了

終了

Page 66: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Pratt parsing [Pratt 1973]

•  手書きの構文解析器の一部としてよく用いられる Ø 再帰関数による実装と相性が良い

•  演算子順位構文解析の手法は他にも存在する Ø  Precedence climbing method [Richardsら 1979]

•  能力 Ø 計算量 : O(n) Ø 言語 : Operator-precedence language Ø 文法 : Operator-precedence grammar

66

Page 67: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

上向き構文解析 Bottom-up parsing

67

Page 68: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

68

LR parsing [Knuth 1965] •  実用に十分な表現力を持ち、かつ高速 •  多くのパーサジェネレータで利用されている

GLR parsing [Tomita 1985] •  Earley parsing の最適化版 •  LR parsing の自然な拡張でもある

Earley parsing [Earley 1968] •  CYK algorithm を任意の CFG に拡張したもの

CYK algorithm [Cocke 1969, Younger 1967, Kasami 1965] •  様々な CFG の構文解析手法の理論的なベース •  Chomsky 標準形のみを対象とする

Valiant parsing [Valiant 1975] •  CFG の構文解析は行列積の計算量で計算できることを示した

Page 69: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

LR parsing [Knuth 1965]

アイデア •  決定性オートマトンを作る •  shift & reduce Ø  shift : 終端記号を読んで遷移 Ø  reduce : 構文木を組み立てて非終端記号で遷移

69

E

Num

+ Num

Page 70: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

70

1 2 * + + 3 4 5

入力

$

文法

E→E+TE→TT→T*NumT→Num

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 71: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

71

1 2 * + + 3 4 5 $

文法

shift

E→E+TE→TT→T*NumT→Num

入力

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 72: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

72

2 * + + 3 4 5 $

文法

E→E+TE→TT→T*NumT→Num

a d 1

入力

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 73: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

73

2 * + + 3 4 5 $

文法

reduce

E→E+TE→TT→T*NumT→Num

a d 1

入力

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 74: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

74

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

T→ 1

入力

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 75: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

75

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

c

T→ 1

入力

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num *

Page 76: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

76

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

shift?reduce?

*

Page 77: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

77

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

look-ahead

*

Page 78: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

78

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

look-ahead

reduce *

Page 79: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

79

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

look-ahead

*なし

*あり

*

Page 80: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

80

2 * + + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

shift

*

Page 81: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

81

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

f

*

Page 82: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

82

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

f

shift

*

Page 83: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

83

2 *

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

f h

*

Page 84: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

84

2 *

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

T→ 1

入力

f h

reduce

*

Page 85: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T→

85

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

1

入力

*

Page 86: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T→

86

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

1

入力

+なし

*

Page 87: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T→

87

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

c

1

入力

reduce

*

Page 88: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

88

2

*

+ + 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

1

入力

*

Page 89: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

89

2

*

+

+ 3 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

1

入力

e

*

Page 90: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

90

2

*

+

+

3

4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

1

入力

e d

*

Page 91: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

91

2

*

+

+ 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

1

入力

e g

T→ 3

*

Page 92: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

92

2

*

+

+ 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

1

入力

e g

T→ 3

+なし

reduce

*

Page 93: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

93

+ 4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

2

+

1

* 3

*

Page 94: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

94

+

4 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e

E→

2

+

1

* 3

*

Page 95: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

95

+ 4

5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e d

E→

2

+

1

* 3

*

Page 96: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

96

+

5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e g

T→ 4

E→

+

* 3 2 1

*

Page 97: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

97

+

* 5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e g

T→ 4

* なし

*あり

E→

+

* 3 2 1

Page 98: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

98

+ *

5 $

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e g

T→ 4

E→

+

* 3 2 1

f

Page 99: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

99

+ 5

$

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e g

T→ 4

E→

+

* 3 2 1

f h *

Page 100: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

100

+

$

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

e g

E→

+

* 3 2 1

T→ 5

*

4

Page 101: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E→

101

$

a

E→E+TE→TT→T*NumT→Num

文法

a

d

b

c

e g

f

E

Num

+

T

T

* h

*

Num

Num

b

入力

+

+

* 3 2 1

5

*

4

Page 102: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

LR parsing [Knuth 1965]

•  通常は LR 構文解析表を利用する •  構文解析表の作り方により受理文法が異なる Ø  SLR(1), LALR(1) [DeRemer 1969, 1971] など Ø 紹介した手法は SLR(1) に相当 Ø 解説: www.slideshare.net/ichikaz3/lr-parsing

•  能力 Ø 計算量 : O(n) Ø 言語 : Deterministic context-free language Ø 文法 : LR(1), SLR(1), LALR(1), ...

102

Page 103: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

GLR parsing [Tomita 1985]

アイデア •  非決定性オートマトンを作る •  異なる遷移で同一状態になったものをまとめる Ø グラフ構造スタック(GSS) Ø  Parse forest : 子の構文木を直接持たず、ラベルで持つ

103

E

Num

+ Num

E +

Page 104: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

104

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

1 2 + * * 3 + 4 5

入力

$

Page 105: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

105

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a d 1

2 + * * 3 + 4 5

入力

$

Page 106: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

106

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a c

2 + * * 3 + 4 5

入力

$

1

T1

Page 107: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

107

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b

2 + * * 3 + 4 5

入力

$

E1

T1

1

T1

Page 108: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

108

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b

2

+

* * 3 + 4 5

入力

$

e

E1

T1

Page 109: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

109

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b 2 +

* * 3 + 4 5

入力

$

e d

E1

T1

Page 110: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

110

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

* * 3 + 4 5

入力

$

E1

T1

e c

2

T2

Page 111: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

111

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

* * 3 + 4 5

入力

$

E1

T1

e c

2

T2

Page 112: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

112

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b + *

* 3 + 4 5

入力

$

E1

T1

e c

2

T2

f

Page 113: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

113

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b + *

*

3

+ 4 5

入力

$

E1

T1

e c

2

T2

f d

Page 114: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

114

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b + *

* + 4 5

入力

$

E1

T1

e c

2

T2

f h

3

T3

Page 115: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

115

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b + *

* + 4 5

入力

$

E1

T1

e c

2

T2

f h

3

T3

Page 116: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

116

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b + *

* + 4 5

入力

$

E1

T1

e c

2

T2

f h

3

T3

* あり * あり

Page 117: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

117

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

* + 4 5

入力

$

E1

T1

e

c

2 T2

f h

3 T3

* T4

T2 T3

c

Page 118: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

118

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

*

+ 5

入力

$

E1

T1

e

c

2 T2

f h

3 T3

* T4

T2 T3

c

f

*

4

Page 119: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

119

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

*

+

4

5

入力

$

E1

T1

e

c

2 T2

f h

3 T3

* T4

T2 T3

c

f

*

d

Page 120: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

120

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

*

+ 5

入力

$

E1

T1

e

c

2 T2

f h

3 T3

* T4

T2 T3

c

f

*

h

4

T5

Page 121: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

121

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

*

+ 5

入力

$

E1

T1

e

c

2 T2

f h

* T4

T2 T3

c

f h

4

T5

* T3 T5 T6

Page 122: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

122

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

*

+ 5

入力

$

E1

T1

e

c

2 T2

f h

c

* T3 T5 T6

* T4 T5

T7

Page 123: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

123

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

+ 5

入力

$

E1

T1

e

c

c

* T4 T5

T7

* T2 T6

T8

Page 124: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

124

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

+ 5

入力

$

E1

T1

e c

| T7 T8

T9

Page 125: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

125

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

+ 5

入力

$

E1

T1

e c

| T7 T8

T9

(2*3)*4 2*(3*4)

Page 126: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

126

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

+ 5

入力

$

E1

T1

e g

E2

T9

Page 127: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

127

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a b +

+ 5

入力

$

E1

T1

e g

E2

T9

+ あり + あり

Page 128: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

128

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

+ 5

入力

$ E1

T1

e g

E2

T9

b

+ E1 E2

E3

Page 129: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

129

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

+

5

入力

$ E1

T1

e g

E2

T9

b

+ E1 E2

E3

e +

Page 130: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

130

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

+ 5

入力

$ E1

T1

e g

E2

T9

b

+ E1 E2

E3

e + d

Page 131: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

131

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

+

入力

$ E1

T1

e g

E2

T9

b

+ E1 E2

E3

e + c

5 T10

Page 132: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

132

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

+

入力

$ E1

T1

e g

E2

T9

b

+ E1 E2

E3

e + g

E4

T10

Page 133: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

133

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

入力

$ E1

T1

e g

b

+ E1 E2

E3

e + c

E4

T10

+ E2 E4

E5

Page 134: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

134

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

b +

入力

$ E1

T1

e g

b

+ E3 E4

E6

+ E2 E4

E5

Page 135: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

135

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

a

入力

$

b

b

+ E3 E4

E6

+ E1 E5

E7

Page 136: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

136

a d

b

c

e g

f

E

Num

+

T T

* h

+

Num

Num

*

E

T

E→E+EE→TT→T*TT→Num

文法

入力

$

a b

| E6 E7

E8

Page 137: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

GLR parsing [Tomita 1985]

•  構文解析表の作り方は LR parsing と同様 Ø ただし同一箇所に複数規則を許す

•  ほぼ決定的な文法に対して O(n) で動作 •  能力 Ø 計算量 : O(np+1) (p=文法の最長の右辺の長さ) Ø 言語 : Context-free language Ø 文法 : Context-free grammar

137

Page 138: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Earley parsing [Earley 1968]

アイデア •  動的計画法 •  入力位置を進めながら構文規則上の位置を記録する Ø 構文木を記憶すると指数爆発するため親エントリを記憶

138

1 + 2 + 3

E→Num·{3}E→E·+E{3,2+3,(1+2)+3,1+(2+3)}E→E+E·{2+3,(1+2)+3,1+(2+3)}S→E·{(1+2)+3,1+(2+3)}

E→Num·{1}E→E·+E{1}S→E·{1}

Page 139: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

139

1 2 * + + 3 * 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

Page 140: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

140

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a00:E→·E+Eb00:E→·Tc00:T→·T*Td00:T→·Num

*

Page 141: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

141

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a00:E→·E+Eb00:E→·Tc00:T→·T*Td00:T→·Num

0文字目から0文字目まで

文法上の位置

*

Page 142: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

142

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

*

Page 143: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

143

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

d00:T→·Num

*

Page 144: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

144

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]

d00:T→·Num

scan (≒ shift)

*

Page 145: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

145

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]

0文字目から1文字目まででTになる

*

Page 146: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

146

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]

c00:T→·T*T

*

Page 147: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

147

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]b01:T→T·*T[c00]

c00:T→·T*T

complete (≒ reduce)

*

Page 148: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

148

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]b01:T→T·*T[c00]

b00:E→·T

*

Page 149: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

149

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]b01:T→T·*T[c00]c01:E→T·[b00]

b00:E→·T

complete

*

Page 150: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

150

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]b01:T→T·*T[c00]c01:E→T·[b00]

a00:E→·E+E

*

Page 151: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

151

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a01:T→Num·[d00]b01:T→T·*T[c00]c01:E→T·[b00]d01:E→E·+E[a00]

a00:E→·E+E

complete

*

Page 152: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

152

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

b01:T→T·*T

*

Page 153: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

153

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a02:T→T*·T[b01]

b01:T→T·*T

scan

*

Page 154: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

154

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a02:T→T*·T[b01]

非終端記号の前 *

Page 155: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

155

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a02:T→T*·T[b01]b22:T→·T*T[a02]c22:T→·Num[a02]

predict

*

Page 156: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

156

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a02:T→T*·T[b01]b22:T→·T*T[a02]c22:T→·Num[a02]

scan → complete → predict

*

Page 157: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

157

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a23:T→Num·[c22]

scan → complete → predict

scan

c22:T→·Num

*

Page 158: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

158

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a23:T→Num·[c22]b23:T→T·*T[b22]c03:T→T*T·[a02]

scan → complete → predict

a02:T→T*·Tb22:T→·T*T

complete

*

Page 159: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

159

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a23:T→Num·[c22]b23:T→T·*T[b22]c03:T→T*T·[a02]d03:T→T·*T[c00]e03:E→T·[b00]f03:E→E·+E[a00]

scan → complete → predict

a00:E→·E+Eb00:E→·Tc00:T→·T*T

complete

*

Page 160: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

160

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a04:E→E+·E[f03]

scan → complete → predict

f03:E→E·+E

scan

*

Page 161: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

161

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a04:E→E+·E[f03]b44:E→·E+E[a04]c44:E→·T[a04]d44:T→·T*T[c44]e44:T→·Num[c44]

scan → complete → predict

predict

*

Page 162: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

162

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a45:T→Num·[e44]

scan → complete → predict

scan

e44:T→·Num

*

Page 163: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

163

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a45:T→Num·[e44]b45:T→T·*T[d44]c45:E→T·[c44]d45:E→E·+E[b44]e05:E→E+E·[a04]

scan → complete → predict

a04:E→E+·Eb44:E→·E+Ec44:E→·Td44:T→·T*T

complete

*

Page 164: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

164

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a45:T→Num·[e44]b45:T→T·*T[d44]c45:E→T·[c44]d45:E→E·+E[b44]e05:E→E+E·[a04]f05:E→E·+E[a00]

scan → complete → predict

complete

a00:E→·E+E

*

Page 165: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

165

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a46:E→E+·E[d45]b06:E→E+·E[f05]

scan → complete → predict

d45:E→E·+Ef05:E→E·+E

scan

*

Page 166: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

166

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a46:E→E+·E[d45]b06:E→E+·E[f05]c66:E→·E+E[a46]d66:E→·T[a46]e66:T→·T*T[d66]f66:T→·Num[d66]

scan → complete → predict

predict

*

Page 167: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

167

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a67:T→Num·[f66]

scan → complete → predict

scan

f66:T→·Num

*

Page 168: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

168

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a67:T→Num·[f66]b67:T→T·*T[e66]c67:E→T·[d66]b67:E→E·+E[c66]e07:E→E+E·[b06]f47:E→E+E·[a46]

scan → complete → predict

a46:E→E+·Eb06:E→E+·Ec66:E→·E+Ed66:E→·Te66:T→·T*T

complete

*

Page 169: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

169

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a67:T→Num·[f66]b67:T→T·*T[e66]c67:E→T·[d66]b67:E→E·+E[c66]e07:E→E+E·[b06]f47:E→E+E·[a46]g47:E→E·+E[b44]h07:E→E+E·[a04]

scan → complete → predict

a04:E→E+·Eb44:E→·E+E

complete

*

Page 170: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

170

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a67:T→Num·[f66]b67:T→T·*T[e66]c67:E→T·[d66]b67:E→E·+E[c66]e07:E→E+E·[b06]f47:E→E+E·[a46]g47:E→E·+E[b44]h07:E→E+E·[a04]i07:E→E·+E[a00]

scan → complete → predict

complete

a00:E→·E+E

*

Page 171: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

171

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a68:T→T*·T[b67]

scan → complete → predict

b67:T→T·*T

scan

*

Page 172: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

172

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a68:T→T*·T[b67]b88:T→·T*T[a68]c88:T→·Num[a68]

scan → complete → predict

predict

*

Page 173: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

173

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]

scan → complete → predict

c88:T→·Num

scan

*

Page 174: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

174

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]b89:T→T·*T[b88]c69:T→T*T·[a68]

scan → complete → predict

a68:T→T*·Tb88:T→·T*T

complete

*

Page 175: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

175

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]b89:T→T·*T[b88]c69:T→T*T·[a68]d69:T→T·*T[e66]e69:E→T·[d66]f69:E→E·+E[c66]

g09:E→E+E·[b06]h49:E→E+E·[a46]

scan → complete → predict

a46:E→E+·Eb06:E→E+·Ec66:E→·E+Ed66:E→·Te66:T→·T*T

complete

*

Page 176: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

176

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]b89:T→T·*T[b88]c69:T→T*T·[a68]d69:T→T·*T[e66]e69:E→T·[d66]f69:E→E·+E[c66]

g09:E→E+E·[b06]h49:E→E+E·[a46]i49:E→E·+E[b44]j09:E→E+E·[a04]

scan → complete → predict

a04:E→E+·Eb44:E→·E+E

complete

*

Page 177: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

177

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]b89:T→T·*T[b88]c69:T→T*T·[a68]d69:T→T·*T[e66]e69:E→T·[d66]f69:E→E·+E[c66]

g09:E→E+E·[b06]h49:E→E+E·[a46]i49:E→E·+E[b44]j09:E→E+E·[a04]k09:E→E·+E[a00]

scan → complete → predict

a00:E→·E+E

complete

*

Page 178: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

178

1 2 * + + 3 4 5 入力

$

E→E+EE→TT→T*TT→Num

文法

a89:T→Num·[c88]b89:T→T·*T[b88]c69:T→T*T·[a68]d69:T→T·*T[e66]e69:E→T·[d66]f69:E→E·+E[c66]

g09:E→E+E·[b06]h49:E→E+E·[a46]i49:E→E·+E[b44]j09:E→E+E·[a04]k09:E→E·+E[a00]

scan → complete → predict

*

Page 179: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Earley parsing [Earley 1968]

•  原理的には LR parsing と同じ Ø  scan = shift, complete = reduce Ø  predict は LR ではオートマトン生成時に行っている

•  メモ化した再帰下降構文解析とほぼ同じ [Norvig 1991]

•  能力 Ø 計算量 : O(n3) Ø 言語 : Context-free language Ø 文法 : Context-free grammar

179

Page 180: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

CYK algorithm [Cocke 1969, Younger 1967, Kasami 1965]

アイデア •  動的計画法 •  n ~ n+k 番目のあり得る構文木を列挙していく •  Chomsky標準形の文法が対象

180

[ Chomsky 標準形 ] 以下の形式の規則しか持たない :

Ø  A→BCØ  A→aØ  S→ε

Page 181: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

181

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

入力 1 2 + * * 3 4

文法

Page 182: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

182

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

入力 1 2 + * * 3 4

文法 S→EE→E+EE→TT→T*TT→Num

Page 183: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

183

入力

T,E,S

N1

T,E,S

N2

T,E,S

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 184: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

184

入力

T,E,S -

N1

T,E,S

N2

T,E,S

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 185: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

185

入力

T,E,S -

N1 E1

T,E,S

N2

T,E,S

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 186: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

186

入力

T,E,S -

N1 E1

T,E,S -

N2

T,E,S

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 187: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

187

入力

T,E,S -

N1 E1

T,E,S -

N2 T1

T,E,S

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 188: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

188

入力

T,E,S -

N1 E1

T,E,S -

N2 T1

T,E,S -

N2

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 189: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

189

入力

T,E,S -

N1 E1

T,E,S -

N2 T1

T,E,S -

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 190: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

190

入力

T,E,S - E,S

N1 E1

T,E,S -

N2 T1

T,E,S -

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 191: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

191

入力

T,E,S - E,S

N1 E1 -

T,E,S -

N2 T1

T,E,S -

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 192: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

192

入力

T,E,S - E,S

N1 E1 -

T,E,S - T,E,S

N2 T1

T,E,S -

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 193: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

193

入力

T,E,S - E,S

N1 E1 -

T,E,S - T,E,S

N2 T1 -

T,E,S -

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 194: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

194

入力

T,E,S - E,S

N1 E1 -

T,E,S - T,E,S

N2 T1 -

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 195: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

195

入力

T,E,S - E,S -

N1 E1 -

T,E,S - T,E,S

N2 T1 -

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 196: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

196

入力

T,E,S - E,S -

N1 E1 - E1

T,E,S - T,E,S

N2 T1 -

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 197: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

197

入力

T,E,S - E,S -

N1 E1 - E1

T,E,S - T,E,S -

N2 T1 -

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 198: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

198

入力

T,E,S - E,S -

N1 E1 - E1

T,E,S - T,E,S -

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 199: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

199

入力

T,E,S - E,S - E,S

N1 E1 - E1

T,E,S - T,E,S -

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 200: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

200

入力

T,E,S - E,S - E,S

N1 E1 - E1 -

T,E,S - T,E,S -

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 201: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

201

入力

T,E,S - E,S - E,S

N1 E1 - E1 -

T,E,S - T,E,S - T,E,S

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 202: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

202

入力

T,E,S - E,S - E,S -

N1 E1 - E1 -

T,E,S - T,E,S - T,E,S

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 203: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

203

入力

T,E,S - E,S - E,S -

N1 E1 - E1 - E1

T,E,S - T,E,S - T,E,S

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 204: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

204

入力

T,E,S - E,S - E,S - E,S

N1 E1 - E1 - E1

T,E,S - T,E,S - T,E,S

N2 T1 - T1

T,E,S - T,E,S

N2 T1

T,E,S

1 2 + * * 3 4

S→EE1E→EE1S→TT1E→TT1T→TT1E1→N1ET1→N2T

S→NumE→NumT→NumN1→+N2→*

文法

Page 205: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

CYK algorithm [Cocke 1969, Younger 1967, Kasami 1965]

•  任意のCFGはChomsky標準形に自動変換可能

•  計算順序は変更可能 Ø 左から順番に計算すると Earley parsing とほぼ同じ

•  能力 Ø 計算量 : O(n3) Ø 言語 : Context-free language Ø 文法 : Context-free grammar (Chomsky標準形)

205

Page 206: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Valiant parsing [Valiant 1975]

アイデア •  CYKの表を行列とみなすと不動点問題に •  行列積を使いながら帰納法的に解ける

206

Page 207: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

207

Page 208: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

208

これらが同じとなる不動点を求める

Page 209: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

209

Page 210: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

210

Page 211: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

211

帰納法

帰納法

Page 212: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

212

Page 213: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

213

これらが同じなら良い

Page 214: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

214

Page 215: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

215

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

Page 216: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

216

A3 X3 X3 B1 C3 X3

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

Page 217: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

217

A3 X3 X3 B1 C3 X3

帰納法

✖ ︎ ➕︎ ✖ ︎ ➕︎ =

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

Page 218: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

218

A2 X3

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A1 X1 X1 B1 C1 X1 ✖ ︎ ➕︎ ✖ ︎ ➕︎ = ✖ ︎ ➕︎

Page 219: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

219

C1' A2 X3 C1

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A1 X1 X1 B1 C1' X1 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ =

Page 220: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

220

C1' A2 X3 C1 帰納法

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A1 X1 X1 B1 C1' X1 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ =

Page 221: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

221

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

X4 = X3 B2 A3 X4 X4 B3 C4 ✖ ︎ ➕︎ ✖ ︎ ➕︎ ✖ ︎ ➕︎

Page 222: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

222

C4' X3 B2 C4

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A3 X4 X4 B3 C4' X4 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ =

Page 223: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

223

C4' X3 B2 C4 帰納法

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A3 X4 X4 B3 C4' X4 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ =

Page 224: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

224

X2 B3 C2

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

X2 = ✖ ︎ ➕︎ X1 B2 ✖ ︎ ➕︎ A2 X4 ✖ ︎ ➕︎ A1 X2 ✖ ︎ ➕︎

Page 225: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

225

C2' X1 B2 C2

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A1 X2 X2 B3 C2' X2 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ = A2 X4 ✖ ︎ ➕︎

Page 226: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

226

C2' X1 B2 C2 帰納法

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

A1 X2 X2 B3 C2' X2 ✖ ︎ ➕︎ ✖ ︎ ➕︎ =

✖ ︎ ➕︎ = A2 X4 ✖ ︎ ➕︎

Page 227: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

227

A1 A2

A3

X1 X2

X4X3

X1 X2

X4X3

B1 B2

B3

X1 X2

X4X3

C1 C2

C4C3

A X X B C X

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

✖ ︎ ➕︎ ✖ ︎ ➕︎ =︎

サイズが半分の問題4つと行列積で解ける!

→ 計算量は行列積の計算量に依存

Page 228: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

228

サイズが半分の問題2つと

行列積の計算量で解ける問題に分割可能

→ 計算量は行列積の計算量に依存

Page 229: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Valiant parsing [Valiant 1975]

•  更に変形すると boolean 行列積に落ちる •  計算量の下限を示すものであり実用的ではない

•  能力 Ø 計算量 : O(np) (2 < p < 3, boolean 行列積の計算量) Ø 言語 : Context-free language Ø 文法 : Context-free grammar (Chomsky標準形)

229

Page 230: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

下向き構文解析 Top-down parsing

230

Page 231: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

231

LL(k) parsing [Sippu 1979] •  手書きではよく使われるが、表現力は少し弱い •  k > 1 の場合は自動生成に向かない

Packrat parsing [Ford 2002] •  十分な表現力と解析速度を持つ •  曖昧性を持たないプログラミング言語の構文解析に適する

Packrat parsing with left recursion [Warth 2008] •  左再帰型の文法を扱えるように拡張したもの

GLL parsing [Scott 2010] •  下向き構文解析で CFG を O(n3) で解析する手法

Adaptive LL(*) parsing [Parr 2014] •  LL(k) のアイデアを任意の CFG に適用

Page 232: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

LL(k) parsing [Sippu 1979]

アイデア •  分岐があるときは k 文字まで先読みして決める •  本当は怖い LL(k) parsing

232

E T E'

E' +

-

E'

E' =

=

Page 233: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

233

S→aaAaaS→abAbaA→bA→ε

文法

入力:abba

Page 234: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

234

S→aaAaaS→abAbaA→bA→ε

文法

入力:abba

LL(2)文法

Page 235: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

235

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

入力:abba

Page 236: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

236

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

入力:abba

先読み スタック 逆順で書く [xy] = z · y x

Page 237: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

237

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba

Page 238: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

238

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba

一致

Page 239: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

239

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba

Page 240: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

240

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba

一致

Page 241: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

241

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba

Page 242: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

242

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba

一致

Page 243: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

243

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba

Page 244: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

244

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba

一致

Page 245: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

245

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba→[a][ab]|ba

Page 246: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

246

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba→[a][ab]|ba

一致

Page 247: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

247

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba→[a][ab]|ba→[a]|a

Page 248: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

248

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba→[a][ab]|ba→[a]|a

一致

Page 249: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

249

[S]|aa→[a][aa][aaA][aaAa][aaAaa]|aa[S]|ab→[a][ab][abA][abAb][abAba]|ab[aaA]|aa→|aa[aaA]|ba→[aab]|ba[abA]|ba→|ba[abA]|bb→[abb]|bb

actions

[S]|abba→[a][ab][abA][abAb][abAba]|abba→[a][ab][abA][abAb]|bba→[a][ab][abA]|ba→[a][ab]|ba→[a]|a→|

Page 250: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

LL(k) parsing [Sippu 1979]

•  LR と同様に SLL(k), LALL(k), LL(k) が存在 Ø  SLL(k) [Rosenkrantz 1969] は先読みに前文脈を考慮しない

•  手書きの構文解析器は大抵 SLL(k) Ø  SLL(1) = LALL(1) = LL(1) Ø 任意の LL(k) 文法は SLL(k) 文法に変形可能

•  能力 Ø 計算量 : O(n) Ø 言語 : LL(k) language Ø 文法 : SLL(k), LALL(k), LL(k)

250

Page 251: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Packrat parsing [Ford 2002]

アイデア •  同じ開始位置に対して構文解析結果を一つに決める •  メモ化再帰

251 * 画像引用: en.wikipedia.org/wiki/Pack_rat

Page 252: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

252

1 2 * + + 3 4 5

入力

$

0:E

E→T+EE→TT→Num*TT→Num

文法

*

Page 253: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

253

1 2 * + + 3 4 5

入力

$

+ E 0:T

0:E

E→T+EE→TT→Num*TT→Num

文法

*

Page 254: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

254

1 2 * + + 3 4 5

入力

$

* T

+ E

0:Num

0:T

0:E

E→T+EE→TT→Num*TT→Num

文法

*

Page 255: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

255

1 2 * + + 3 4 5

入力

$

~1: 1

* T

+ E

0:Num

0:T

0:E

E→T+EE→TT→Num*TT→Num

文法

*

Page 256: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

256

1 2 * + + 3 4 5

入力

$

~1: 1

T

+ E 0:T

0:E

1:* 0:Num

E→T+EE→TT→Num*TT→Num

文法

*

Page 257: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

257

1 2 * + + 3 4 5

入力

$

~1: 1

T

+ E 0:T

0:E

1:* 0:Num

~2: *

E→T+EE→TT→Num*TT→Num

文法

*

Page 258: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

258

1 2 * + + 3 4 5

入力

$

~1: 1

2:T

+ E 0:T

0:E

1:* 0:Num

~2: *

E→T+EE→TT→Num*TT→Num

文法

*

Page 259: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

259

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

* T 2:Num

E→T+EE→TT→Num*TT→Num

文法

*

Page 260: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

260

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

* T 2:Num

~3: 2

E→T+EE→TT→Num*TT→Num

文法

*

Page 261: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

261

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

T

~3: 2

E→T+EE→TT→Num*TT→Num

文法

3:* 2:Num

*

Page 262: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

262

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

T

~3: 2

3:* 2:Num

解析失敗

E→T+EE→TT→Num*TT→Num

文法

*

Page 263: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

263

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

3:*

2:Num

とっておく

E→T+EE→TT→Num*TT→Num

文法

バックトラックして 別の選択肢を試す

*

Page 264: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

264

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

2:Num

E→T+EE→TT→Num*TT→Num

文法

3:*

2:Num

一致

*

Page 265: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

265

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

2:Num

再利用 ~3: 2

E→T+EE→TT→Num*TT→Num

文法

3:*

*

Page 266: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

266

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:* 0:Num

~3: 2

E→T+EE→TT→Num*TT→Num

文法

3:*

2:Num

とっておく

*

Page 267: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

267

1 2 * + + 3 4 5

入力

$

2:T

+ E 0:T

0:E

1:*

0:Num

~3: 2 1

*

E→T+EE→TT→Num*TT→Num

文法

3:*

2:Num

*

Page 268: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

268

1 2 * + + 3 4 5

入力

$

E

0:E

~3: 2 1

*

3:+ 0:T

E→T+EE→TT→Num*TT→Num

文法

2:T

1:*

0:Num

3:*

2:Num

*

Page 269: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

269

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

~4: +

E→T+EE→TT→Num*TT→Num

文法

2:T

1:*

0:Num

3:*

2:Num

*

Page 270: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

270

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

+ E 4:T 2:T

1:*

0:Num

3:*

2:Num

* T 4:Num

*

Page 271: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

271

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

+ E 4:T 2:T

1:*

0:Num

3:*

2:Num

T

~5: 3

5:* 4:Num

*

Page 272: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

272

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

+ E 4:T 2:T

1:*

0:Num

3:*

2:Num

T 5:* 4:Num

解析失敗

*

Page 273: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

273

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

+ E 4:T 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

*

Page 274: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

274

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 4 5

入力

$

4:E

0:E

3:+ 0:T

+ E 4:T 2:T

1:*

0:Num

3:*

2:Num

5:* 4:Num

~5: 3

*

Page 275: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

275

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

E 2:T

1:*

0:Num

3:*

2:Num

5:* ~5: 3

4:Num

5:+ 4:T

Page 276: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

276

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:* ~6: +

4:Num

5:+ 4:T

Page 277: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

277

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

* T 6:Num

Page 278: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

278

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

T

~7: 3

7:* 6:Num

Page 279: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

279

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num

~8: *

Page 280: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

280

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num

* T 8:Num

Page 281: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

281

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num

T

~9: 5

9:* 8:Num

Page 282: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

282

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num

T 9:* 8:Num

解析失敗

Page 283: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

283

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num 9:*

8:Num

Page 284: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

284

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num 9:*

~9: 5

8:Num

Page 285: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

285

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

+ E 6:T

8:T 7:* 6:Num 9:*

~9: 5

8:Num

Page 286: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

286

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

E

8:T

7:*

6:Num

9:*

8:Num

~9: 5 4

*

9:+ 6:T

Page 287: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

287

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

E

8:T

7:*

6:Num

9:*

8:Num

9:+ 6:T

解析失敗

Page 288: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

288

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

8:T

7:*

6:Num

9:*

8:Num

9:+

6:T

Page 289: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

289

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

8:T

7:*

6:Num

9:*

8:Num

9:+

~9: 5 4

*

6:T

Page 290: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

290

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E 2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+ 4:T

8:T

7:*

6:Num

9:*

8:Num

9:+

~9: 5 4

*

6:T

Page 291: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

291

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E

0:E

3:+ 0:T

6:E

2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+

4:T

8:T

7:*

6:Num

9:*

8:Num

9:+

~9:

5 4

*

6:T

+

3

Page 292: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

292

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5

入力

$

4:E 0:E

3:+

0:T

6:E

2:T

1:*

0:Num

3:*

2:Num

5:*

4:Num

5:+

4:T

8:T

7:*

6:Num

9:*

8:Num

9:+ ~9:

6:T

2 1

*

5 4

*

+

3

+

Page 293: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Packrat parsing [Ford 2002]

•  SLL(k) で k → ∞ したものとみなせる Ø 文脈を無視して無限先読みして分岐を一つに決定する Ø 何らかの方法で一つに決まりさえすれば良い Ø  LL(*) [Parr 2011] は可能なら SLL(k) で分岐するもの

•  動的計画法でも同様の解析は可能 Ø 入力の後ろから順にたどって表を作る

•  能力 Ø 計算量 : O(n) Ø 言語 : Parsing expression language Ø 文法 : Parsing expression grammar

293

Page 294: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Packrat parsing with left recursion [Warth 2008]

アイデア •  構文解析中に左再帰検出 •  左再帰部は成長しなくなるまで繰り返し適用

294

Page 295: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

295

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

動的計画法ベースで説明する。

下向き構文解析と言えないかも?

Page 296: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

296

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:

*:

Num:

T:

E:

終端記号

非終端記号

Page 297: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

297

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:なし

T:

E:

終端記号

非終端記号

入力を読む

Page 298: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

298

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:なし

T:なし

E:

終端記号

非終端記号

文法を見る

Page 299: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

299

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:なし

T:なし

E:なし

終端記号

非終端記号

文法を見る

Page 300: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

300

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:

*:

Num:

T:

E:

Page 301: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

301

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:5

T:

E:

入力を読む

Page 302: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

302

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:5

T:5

E:

文法を見る

Page 303: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

303

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:5

T:5

E:5

文法を見る

Page 304: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

304

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:5

T:5

E:5

もう一度文法を見る

更新不可

Page 305: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

305

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:

*:

Num:

T:

E:

Page 306: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

306

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:*

Num:なし

T:

E:

入力を読む

Page 307: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

307

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:*

Num:なし

T:なし

E:なし

文法を見る

Page 308: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

308

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:

*:

Num:

T:

E:

Page 309: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

309

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:

E:

入力を読む

Page 310: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

310

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:4

E:

文法を見る

Page 311: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

311

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:4

E:4

文法を見る

Page 312: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

312

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:4*5

E:4

もう一度文法を見る

*:* Num:5

Page 313: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

313

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:4*5

E:4*5

もう一度文法を見る

Page 314: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

314

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:4

T:4*5

E:4*5

更にもう一度文法を見る

更新不可

Page 315: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

315

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:

E:

以降同様に進める

Page 316: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

316

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:なし

E:

Page 317: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

317

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:なし

E:なし

Page 318: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

318

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:3

T:

E:

Page 319: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

319

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:3

T:3

E:

Page 320: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

320

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:3

T:3

E:3

Page 321: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

321

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:3

T:3

E:3+(4*5)

+:+ T:4*5

もう一度

Page 322: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

322

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:3

T:3

E:3+(4*5)

更にもう一度

更新不可

Page 323: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

323

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:

E:

Page 324: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

324

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:なし

E:

Page 325: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

325

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:+

*:なし

Num:なし

T:なし

E:なし

Page 326: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

326

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:

E:

Page 327: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

327

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:2

E:

Page 328: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

328

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:2

E:2

Page 329: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

329

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:2

E:2+3

もう一度

+:+ T:3

Page 330: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

330

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:2

E:(2+3)+(4*5)

更にもう一度

+:+ T:4*5

Page 331: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

331

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:2

T:2

E:(2+3)+(4*5)

更に更にもう一度

更新不可

Page 332: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

332

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:*

Num:なし

T:

E:

Page 333: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

333

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:*

Num:なし

T:なし

E:

Page 334: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

334

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:*

Num:なし

T:なし

E:なし

Page 335: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

335

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:

E:

Page 336: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

336

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1

E:

Page 337: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

337

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1

E:1

Page 338: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

338

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:1

もう一度

*:* Num:2

Page 339: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

339

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:1*2

もう一度

Page 340: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

340

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:(1*2)+3

更にもう一度

+:+ T:3

Page 341: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

341

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:((1*2)+3)+(4*5)

更に更にもう一度

+:+ T:4*5

Page 342: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

342

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:((1*2)+3)+(4*5)

更に更に更にもう一度

更新不可

Page 343: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

343

E→E+TE→TT→T*NumT→Num

文法

1 2 * + + 3 * 4 5 入力

$

+:なし

*:なし

Num:1

T:1*2

E:((1*2)+3)+(4*5)終了

Page 344: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Packrat parsing with left recursion [Warth 2008]

•  メモ化再帰ベースの方がやや効率が良い Ø 実装は難しい。論文のやつバグってない?

•  大抵のケースで計算量は O(n) Ø メモ化が無駄になるケースは計算量が悪化 Ø 現実的な文法には最悪ケースはほぼ出現しないらしい

•  能力 Ø 計算量 : O(n2) (論文にははっきりとは書いてないがたぶん) Ø 言語 : Parsing expression language Ø 文法 : 左再帰を含む Parsing expression grammar

344

Page 345: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

GLL parsing [Scott 2010]

アイデア •  グラフ構造の継続を利用 •  幅優先探索

345

0:E=·E+E 0:S=·E$

0:E=·T

0:T=·T*T

0:T=·Num

Page 346: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

346

0:·E$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 347: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

347

0:·E+E

0:·E$

0:·T

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 348: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

348

0:·E+E

0:·E$

0:·T

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 349: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

349

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 350: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

350

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 351: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

351

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 352: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

352

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 353: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

353

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 354: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

354

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 355: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

355

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 356: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

356

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 357: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

357

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T

2:·T*T

2:·Num 1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 358: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

358

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T

2:·T*T

2:·Num 1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 359: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

359

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T

2:·T*T

2:·Num 3:Num· 1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 360: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

360

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 361: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

361

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

3:T·

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 362: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

362

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

3:T·

3:E·+E

3:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 363: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

363

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

3:T·

3:E·+E

3:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 364: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

364

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

3:T·

3:E·+E 4:E+·E

3:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 365: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

365

0:·E+E

0:·E$

0:·T

0:·T*T

0:·Num 1:Num·

1:T·*T

1:T·

1:E·+E

1:E·$

2:T*·T 3:T*T·

2:·T*T

2:·Num 3:Num·

3:T·*T

3:T·

3:E·+E 4:E+·E

3:E·$

1 2 * + + 3 4

入力

$

S→EE→E+EE→TT→T*TT→Num

文法

Page 366: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

366

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

S→EE→E+EE→TT→T*TT→Num

文法

Page 367: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

367

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T S→EE→E+EE→TT→T*TT→Num

文法

Page 368: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

368

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T S→EE→E+EE→TT→T*TT→Num

文法

Page 369: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

369

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num

S→EE→E+EE→TT→T*TT→Num

文法

Page 370: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

370

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num

S→EE→E+EE→TT→T*TT→Num

文法

Page 371: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

371

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

S→EE→E+EE→TT→T*TT→Num

文法

Page 372: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

372

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T· S→EE→E+EE→TT→T*TT→Num

文法

Page 373: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

373

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T·

5:E·+E

5:E+E·

S→EE→E+EE→TT→T*TT→Num

文法

Page 374: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

374

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T·

5:E·+E

5:E+E·

5:E·$

S→EE→E+EE→TT→T*TT→Num

文法

Page 375: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

375

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T·

5:E·+E

5:E+E·

5:E·$

S→EE→E+EE→TT→T*TT→Num

文法

Page 376: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

376

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T·

5:E·+E

5:E+E·

5:E·$

6:E+·E

S→EE→E+EE→TT→T*TT→Num

文法

Page 377: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

377

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E

4:·T

4:·T*T

4:·Num 5:Num·

5:T·*T

5:T·

5:E·+E

5:E+E·

5:E·$

6:E+·E

S→EE→E+EE→TT→T*TT→Num

文法

Page 378: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

378

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

S→EE→E+EE→TT→T*TT→Num

文法

Page 379: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

379

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

S→EE→E+EE→TT→T*TT→Num

文法

Page 380: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

380

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

S→EE→E+EE→TT→T*TT→Num

文法

Page 381: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

381

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num

S→EE→E+EE→TT→T*TT→Num

文法

Page 382: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

382

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num

S→EE→E+EE→TT→T*TT→Num

文法

Page 383: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

383

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

S→EE→E+EE→TT→T*TT→Num

文法

Page 384: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

384

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

S→EE→E+EE→TT→T*TT→Num

文法

Page 385: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

385

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

7:E·+E

7:E+E·

S→EE→E+EE→TT→T*TT→Num

文法

Page 386: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

386

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

7:E·+E

7:E+E·

7:E·$

S→EE→E+EE→TT→T*TT→Num

文法

Page 387: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

387

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

7:E·+E

7:E+E·

7:E·$ 8:E$·

S→EE→E+EE→TT→T*TT→Num

文法

Page 388: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

388

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

7:E·+E

7:E+E·

7:E·$ 8:E$·

S→EE→E+EE→TT→T*TT→Num

文法

Page 389: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

389

1 2 * + + 3 4

入力

$

0:·E+E

0:·E$

3:E·+E 4:E+·E

4:·E+E 5:E·+E

5:E+E·

6:E+·E

6:·E+E

6:·T

6:·T*T

6:·Num 7:Num·

7:T·*T

7:T·

7:E·+E

7:E+E·

7:E·$ 8:E$·

S→EE→E+EE→TT→T*TT→Num

文法

Page 390: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

GLL parsing [Scott 2010]

•  パーサコンビネータとして実装可能

•  LL(k) grammar に対しては O(n) で動作する

•  能力 Ø 計算量 : O(n3) Ø 言語 : Context-free language Ø 文法 : Context-free grammar

390

Page 391: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Adaptive LL(*) parsing [Parr 2014]

アイデア •  先読みオートマトンにより分岐を選択する Ø バックトラックを避けることで高速化を図る Ø ここまでは LL(*) のアイデア

•  動的に先読みオートマトンを作る Ø 入力言語は有限集合なので、先読み言語は常に正規

391

Num Num

+

* -

Page 392: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

392

E→T+EE→TT→Num*TT→Num

文法

1 2 * + + 3 * 4 5 入力

$

Page 393: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

393

Augmented transition networks (ATNs)

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

S S1 E

S2 $

S' ε

Page 394: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

394

1 2 * + + 3 * 4 5 入力

$

0:E

Page 395: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

395

1 2 * + + 3 * 4 5 入力

$

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε どちらの分岐か 先読みして選ぶ

0:E

Page 396: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

396

1 2 * + + 3 * 4 5 入力

$

1→E12→E2

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

ATN上の状態

選んだ分岐

Page 397: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

397

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

ε遷移で到達可能

Page 398: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

398

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21

2→T11T21 Num

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

先読み

Page 399: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

399

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21 Num

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

reduce 操作

呼び出しスタック情報を利用して、 reduce 対象を判別する

Page 400: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

400

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

外側の文脈は不明なので、 E による遷移の右辺を追加する

reduce 操作

Page 401: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

401

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12

2→T12 *

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

Page 402: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

402

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

Num * T

T

T1

T2

ε

ε

T11 T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

ε遷移で到達可能

Page 403: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

403

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21

2→T11T21

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

S S1 E

S2 $

S' ε

Page 404: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

404

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

S S1 E

S2 $

S' ε

reduce 操作

Page 405: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

405

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21E13S1

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

S S1 E

S2 $

S' ε

reduce 操作

Page 406: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

406

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21E13S1

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

1→E122→

+

S S1 E

S2 $

S' ε

Page 407: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

407

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21E13S1

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

1→E12E1E22→

+

S S1 E

S2 $

S' ε

ε遷移

Page 408: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

408

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21E13S1

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

1→E12E1E2T1T22→

+

S S1 E

S2 $

S' ε

ε遷移

Page 409: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

409

1 2 * + + 3 * 4 5 入力

$

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

1→T11T21T13E11

2→T11T21T13E21E13S1

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

Num

1→E12E1E2T1T22→

+

S S1 E

S2 $

S' ε

Page 410: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

410

1 2 * + + 3 * 4 5 入力

$

Num * Num 1

+

E の先読みオートマトン

0:E

Page 411: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

+ E

411

1 2 * + + 3 * 4 5 入力

$

0:E

Num * Num 1

+

E の先読みオートマトン

0:T

Page 412: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

+ E

412

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

どちらの分岐か選ぶ

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

Page 413: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

413

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

S S1 E

S2 $

S' ε

Page 414: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

414

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21

S S1 E

S2 $

S' ε

Page 415: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

415

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21E11E21T13

S S1 E

S2 $

S' ε

Page 416: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

416

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1

S S1 E

S2 $

S' ε

Page 417: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

417

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12

2→

S S1 E

S2 $

S' ε

Page 418: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

418

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

S S1 E

S2 $

S' ε

Page 419: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

419

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

T + E

E

E1

E2

ε

ε

E11 E12 E13

E21 T

E'

ε

ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

S S1 E

S2 $

S' ε

Page 420: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

+ E

420

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

Num 1

*

T の先読みオートマトン

Page 421: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

* T

+ E

421

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

Num 1

*

T の先読みオートマトン

0:Num

Page 422: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

* T

+ E

422

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

終端記号を読む

Page 423: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T 1:*

+ E

423

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

~1: 1

Page 424: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T 1:*

+ E

424

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

終端記号を読む

Page 425: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

425

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

~2: *

Page 426: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

426

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

分岐を選ぶ

Page 427: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

427

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

Num 1

* T の先読みオートマトン

+ ?

Page 428: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

428

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

+

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

Page 429: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

429

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→

2→E12

+

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

Page 430: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

430

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→

2→E12E1E2T1T2

+

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

Page 431: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

431

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→

2→E12E1E2T1T2

+

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1 * 1→T12T1T2

2→

Page 432: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

432

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

Num 1

* T の先読みオートマトン

+ 2

Page 433: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

433

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

Num 1

* T の先読みオートマトン

+ 2

2:Num

Page 434: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

434

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

2:Num

~3: 2

Page 435: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

2:T 1:*

+ E

435

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

0:Num

~3: 2

Page 436: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E 3:+

436

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

~3: 2 1

*

Page 437: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

437

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

~4: +

Page 438: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

438

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

分岐を選ぶ

Page 439: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

439

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

Num * Num 1

+ E の先読みオートマトン

+ ?

Page 440: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

440

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

+

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

S S1 E

S2 $

S' ε

Page 441: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

441

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→E12

2→ +

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

S S1 E

S2 $

S' ε

Page 442: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

442

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→E12E1E2T1T2

2→ +

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

S S1 E

S2 $

S' ε

Page 443: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

443

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

1→E12E1E2T1T2

2→ +

1→E1T1T22→E2T1T2

1→T11T21E11

2→T11T21E21E13S1 Num 1→T12T1T2

2→T12T1T2 *

S S1 E

S2 $

S' ε

Page 444: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

444

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

Num * Num 1

+ E の先読みオートマトン

+

Page 445: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

445

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

Num * Num 1

+ E の先読みオートマトン

+

+ E 4:T

Page 446: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

446

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

+ E 4:T

Num 1

* T の先読みオートマトン

+ 2

Page 447: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

447

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

+ E 4:T

Num 1

* T の先読みオートマトン

+ 2

4:Num

Page 448: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

448

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

+ E 4:T

4:Num

~5: 3

Page 449: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

E

4:E 3:+

449

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

~5: 3

Page 450: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

450

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

~6: +

Page 451: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

451

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

Num * Num 1

+ E の先読みオートマトン

+

$ ?

Page 452: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

452

1 2 * + + 3 * 4 5 入力

$

Num * Num +

+ $

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

1→T11T21T13E11

2→T11T21T13E21E13S1

Page 453: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

453

1 2 * + + 3 * 4 5 入力

$

Num * Num +

+ 1→

2→S2

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

1→T11T21T13E11

2→T11T21T13E21E13S1

Page 454: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

454

1 2 * + + 3 * 4 5 入力

$

Num * Num +

+ 1→

2→S2

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε S S1

E S2

$ S'

ε

1→T11T21T13E11

2→T11T21T13E21E13S1

Page 455: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

455

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

Num * Num 1

+ E の先読みオートマトン

+

$ 2

Page 456: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

456

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

Num * Num 1

+ E の先読みオートマトン

+

$ 2

6:T

Page 457: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

457

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

Num 1

* T の先読みオートマトン

+ 2

Page 458: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

458

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

Num 1

* T の先読みオートマトン

+ 2

* T 6:Num

Page 459: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

T

6:E

4:E 3:+

459

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

~7: 4

Page 460: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

460

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

~8: *

Page 461: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

461

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

Num 1

*

T の先読みオートマトン

+ 2

$ ?

Page 462: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

462

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

$

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1

*

+

Page 463: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

463

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

$

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1

*

+ 1→

2→S2

Page 464: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

464

1 2 * + + 3 * 4 5 入力

$

T

T1

T2

ε

ε

T11 Num * T

T12 T13

T21 Num

T'

ε

ε

E

E1

E2

ε

ε

E11 T + E

E12 E13

E21 T

E'

ε

ε

$

S S1 E

S2 $

S' ε

1→T12→T2

Num 1→T11

2→T21E11E21T13E13S1

*

+ 1→

2→S2

Page 465: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

465

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

Num 1

*

+,$ 2

T の先読みオートマトン

Page 466: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

466

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

Num 1

*

+,$ 2

8:Num

T の先読みオートマトン

Page 467: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

467

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

8:Num

~9: 5

Page 468: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

8:T

6:E

4:E 3:+

468

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

7:* 6:Num

~9: 5

Page 469: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

469

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

6:T

~9: 5 4

*

Page 470: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

6:E

4:E 3:+

470

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

5:+ 4:T

~9: 5 4

*

Page 471: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

4:E 3:+

471

1 2 * + + 3 * 4 5 入力

$

0:E

0:T

~9:

5 4

*

+

3

Page 472: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

472

1 2 * + + 3 * 4 5 入力

$

0:E

~9: 2 1

*

5 4

*

+

3

+

Page 473: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

Adaptive LL(*) parsing [Parr 2014]

•  ANTLR v4 のアルゴリズム Ø  v2 は LL(k), v3 は LL(*)

•  大抵の場合に O(n) で動作 Ø  GLR や GLL よりも高速

•  能力 Ø 計算量 : O(n4) Ø 言語 : ALL(*) language Ø 文法 : Predicated grammar

473

Page 474: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

年表 474

1961: Shunting-yard

1973: Pratt

1965: LR

1985: GLR

1968: Earley

1965-1969: CYK

1975: Valiant 1979: LL(k)

1969: SLL(k)

2002: Packrat

2008: Packrat+左再帰

2010: GLL

2014: Adaptive LL(*)

2011: LL(*)

1971: SLR(k)

1969: LALR(k)

1979: Precedence climbing

1991: メモ化再帰 Earley

Page 475: ビジュアル構文解析 - ppl.jssst.or.jpppl.jssst.or.jp/ppl2016/slides/visual_parsing.pdf · 演算子順位構文解析 Ø Shunting-yard algorithm 中置記法を後置記法に直す

•  演算子順位構文解析 Ø  p.007 Shunting-yard algorithm Ø  p.034 Pratt parsing

•  上向き構文解析 Ø  p.069 LR parsing Ø  p.103 GLR parsing Ø  p.138 Earley parsing Ø  p.180 CYK algorithm Ø  p.206 Valiant parsing

•  下向き構文解析 Ø  p.232 LL(k) parsing Ø  p.251 Packrat parsing Ø  p.294 Packrat parsing with left recursion Ø  p.345 GLL parsing Ø  p.391 Adaptive LL(*) parsing

475