40
言言言言言言言 2013 -No.6- 言言言言言言 言言言言言言言言言言言言言 言言言言

言語プロセッサ 2013 - No.6-

  • Upload
    yvon

  • View
    77

  • Download
    0

Embed Size (px)

DESCRIPTION

言語プロセッサ 2013 - No.6-. 東京工科大学 コンピュータサイエンス学部 亀田弘之. これからの内容. 字句解析プログラムの作成方法 手書きの方法 Flex を利用する方法 構文解析 解析手法の種類 左再帰とその除去 括りだし First と Follow. 参考資料 ( 発展 ). Intermediate Representations in Imperative Compilers: A Survey, James Stanier and Des Watson, - PowerPoint PPT Presentation

Citation preview

Page 1: 言語プロセッサ 2013 - No.6-

言語プロセッサ 2013-No.6-

言語プロセッサ 2013-No.6-

東京工科大学コンピュータサイエンス学部

亀田弘之

Page 2: 言語プロセッサ 2013 - No.6-

これからの内容1. 字句解析プログラムの作成方法

• 手書きの方法• Flex を利用する方法

2. 構文解析• 解析手法の種類• 左再帰とその除去• 括りだし• First と Follow

2言語プロセッサ 2013 (東京工科大学CS学部)

Page 3: 言語プロセッサ 2013 - No.6-

参考資料 ( 発展 )Intermediate Representations in

Imperative Compilers: A Survey, James Stanier and Des Watson, ACM Computing Surveys, Vol.45,

No.3, Article 26(27 pages), 2013.

3言語プロセッサ 2013 (東京工科大学CS学部)

Page 4: 言語プロセッサ 2013 - No.6-

復習課題: F lex を使ってみよう!• 自分で過去問に取り組む。• 自分で新しい課題を見つける。• その他(自由に)

4言語プロセッサ 2013 (東京工科大学CS学部)

Page 5: 言語プロセッサ 2013 - No.6-

手順

FlexFlex gccgccFlexProgram

Lex.yy.c

a.exea.exe文字列入力 出力

ライブラリ(fl)

5言語プロセッサ 2013 (東京工科大学CS学部)

Page 6: 言語プロセッサ 2013 - No.6-

Flex プログラムの記述(1)

delim [ \t\n]ws {delim}+letter [a-zA-Z]digit [0-9]id {letter}({letter}|{digit})*number {digit}+(\.{digit}+)?(E[+\-]?

{digit}+)?%%

6言語プロセッサ 2013 (東京工科大学CS学部)

Page 7: 言語プロセッサ 2013 - No.6-

Flex プログラムの記述(2)

{ws} { /* do nothing */ }If {return(IF);}Then {return(THEN);}else {return(ELSE);}{id} {yylval = install_id( );

return(ID);}{number} {yylval = install_num();

return(NUMBER);}

7言語プロセッサ 2013 (東京工科大学CS学部)

Page 8: 言語プロセッサ 2013 - No.6-

Flex プログラムの記述(3)

“<” {yylval = LT; return(RELOP);}“<=“ {yylval = LE; return(RELOP);}“=“ {yylval = EQ; return(RELOP);}“<>” {yylval = NE; return(RELOP);}“>“ {yylval = GT; return(RELOP);}“>=“ {yylval = GE; return(RELOP);}%%

8言語プロセッサ 2013 (東京工科大学CS学部)

Page 9: 言語プロセッサ 2013 - No.6-

Flex プログラムの記述(4)

install_id( ){static int id_ptr=0;return(id_ptr); }

install_num( ){static int num_ptr=0;return(num_ptr); }

9言語プロセッサ 2013 (東京工科大学CS学部)

Page 10: 言語プロセッサ 2013 - No.6-

Flex の復習

10言語プロセッサ 2013 (東京工科大学CS学部)

Page 11: 言語プロセッサ 2013 - No.6-

手順1. Flex のプログラムを書く。2. Flex のプログラムを flex にかける。3. 出力ファイル lex.yy.c を gcc でコン

パイルする。この際,ライブラリーを忘れずに!

4. 出力 a.exe を実行する。5. さまざまな文字列を入力する。

11言語プロセッサ 2013 (東京工科大学CS学部)

Page 12: 言語プロセッサ 2013 - No.6-

手順

Flex gccFlexProgram

Lex.yy.c

a.exe文字列入力 出力

ライブラリ(fl)

12言語プロセッサ 2013 (東京工科大学CS学部)

Page 13: 言語プロセッサ 2013 - No.6-

実際の手順

C:\> flex sample01.lC:\> gcc lex.yy.c –lflC:\> a.exe

それでは、実際にやってみよう。

13言語プロセッサ 2013 (東京工科大学CS学部)

Page 14: 言語プロセッサ 2013 - No.6-

字句解析から構文解析へ

以上で、字句解析(入門)は終わり。字句解析の次の処理は、構文解析でした

ね。

14言語プロセッサ 2013 (東京工科大学CS学部)

Page 15: 言語プロセッサ 2013 - No.6-

構文解析編

15言語プロセッサ 2013 (東京工科大学CS学部)

Page 16: 言語プロセッサ 2013 - No.6-

キーワード(構文解析)• 上向き解析 / 下向き解析

( bottom up & top down )• Backtracking• 括りだし (factoring)• 左再帰性• First 集合 /Follow 集合  など

16言語プロセッサ 2013 (東京工科大学CS学部)

Page 17: 言語プロセッサ 2013 - No.6-

いろいろな構文解析法• 構文解析手法はとてもよく研究されて

おり、様々な手法が知られている。• 例えば、

– Early 法– Chart 法

などなど (余裕のある人はいずれ                 勉強してください)

自然言語処理( CS 学部3年後期開講科目,担当教員:亀田)自然言語処理( CS 学部3年後期開講科目,担当教員:亀田)

プチお知らせプチお知らせ

17言語プロセッサ 2013 (東京工科大学CS学部)

Page 18: 言語プロセッサ 2013 - No.6-

• 処理対象の文法の性質を利用して、より効率的な手法がいろいろと提案されている。

18言語プロセッサ 2013 (東京工科大学CS学部)

Page 19: 言語プロセッサ 2013 - No.6-

• 文脈自由文法– Early 法・ Chart 法 など

• 通常のプログラミング言語は、文脈自由文法ではないが、その構成要素の多くは文脈自由文法で記述可能!

• 文法の制限の仕方にもいろいろある。

19言語プロセッサ 2013 (東京工科大学CS学部)

Page 20: 言語プロセッサ 2013 - No.6-

LR 文法と LL 文法 (1)• LR 文法に対する構文解析法( LR 構文解

析法) → bottom up 型• LL 文法に対する構文解析法( LL 構文解析

法) → top down 型

(教科書 76-77 ページ参照)

20言語プロセッサ 2013 (東京工科大学CS学部)

Page 21: 言語プロセッサ 2013 - No.6-

LR 文法と LL 文法 (2)• LR 文法に対する構文解析法( LR 構文解析

法)→ bottom up 型 <= 自動生成向き

(Bison)• LL 文法に対する構文解析法( LL 構文解析

法)→ top down 型 <= 手作業可能

(教科書 76-77 ページ参照)21言語プロセッサ 2013 (東京工科

大学CS学部)

Page 22: 言語プロセッサ 2013 - No.6-

LL(k) 文法• 構文解析は、文法規則(書き換え規

則)を適用しつつ進行。• 適用すべき規則は、一般には複数個存

在。 →  backtrack 発生→ 効率低下(回避すべき!)

• k 文字先読で適用すべき規則が決定される文法がある!( LL(k) 文法と呼ぶ)

Backtrack なし!

これはすごい!

22言語プロセッサ 2013 (東京工科大学CS学部)

Page 23: 言語プロセッサ 2013 - No.6-

以下、 LL(1) を取り扱います

23言語プロセッサ 2013 (東京工科大学CS学部)

Page 24: 言語プロセッサ 2013 - No.6-

実例で考えよう!1. 括りだし2. 左再帰の回避

24言語プロセッサ 2013 (東京工科大学CS学部)

Page 25: 言語プロセッサ 2013 - No.6-

1.括りだし• 文法

S → aBdB → b | bc

• 入力: abcd

25言語プロセッサ 2013 (東京工科大学CS学部)

Page 26: 言語プロセッサ 2013 - No.6-

a b c d26言語プロセッサ 2013 (東京工科

大学CS学部)

Page 27: 言語プロセッサ 2013 - No.6-

a b c d

S

B

27言語プロセッサ 2013 (東京工科大学CS学部)

Page 28: 言語プロセッサ 2013 - No.6-

a b c d

S

B

? 28言語プロセッサ 2013 (東京工科大学CS学部)

Page 29: 言語プロセッサ 2013 - No.6-

a b c d

S

B

Backtrac 発生!

29言語プロセッサ 2013 (東京工科大学CS学部)

Page 30: 言語プロセッサ 2013 - No.6-

a b c d

S

B

解析成功!

30言語プロセッサ 2013 (東京工科大学CS学部)

Page 31: 言語プロセッサ 2013 - No.6-

• backtrack 回避の方法→ 括りだし

31言語プロセッサ 2013 (東京工科大学CS学部)

Page 32: 言語プロセッサ 2013 - No.6-

1.括りだし• 文法

S → aBd          S → aBdB → b | bc         B → b (c |ε)

32言語プロセッサ 2013 (東京工科大学CS学部)

Page 33: 言語プロセッサ 2013 - No.6-

左再帰の回避

A→AβA

A β

A β

無限降下だ!無限降下だ!

Fermat33言語プロセッサ 2013 (東京工科

大学CS学部)

Page 34: 言語プロセッサ 2013 - No.6-

左再帰の回避方法• A→Aα|β

A → βA’ A’ → αA’ | ε

(教科書 81 ページ参照)

34言語プロセッサ 2013 (東京工科大学CS学部)

Page 35: 言語プロセッサ 2013 - No.6-

左再帰の例E → E + T | TT → T * F | FF → ( E ) | id

35言語プロセッサ 2013 (東京工科大学CS学部)

Page 36: 言語プロセッサ 2013 - No.6-

左再帰の回避E → E + T | TT → T * F | FF → ( E ) | id

E → T E’ E’ → + T E’ | ε

36言語プロセッサ 2013 (東京工科大学CS学部)

Page 37: 言語プロセッサ 2013 - No.6-

左再帰の回避E → E + T | TT → T * F | FF → ( E ) | id

E → T E’ E’ → + T E’ | ε

T → F T’ T’ → * F T’ | ε

F → ( E ) | id

37言語プロセッサ 2013 (東京工科大学CS学部)

Page 38: 言語プロセッサ 2013 - No.6-

LL(1) 文法• LL(1) 文法は、1文字先読みすること

で、適用すべき規則が一意に決まる、という性質を備え持っている。

• つまり、「 A→α | β 」に対して、1文字先読みすれば、 「 A→α 」 と「 A→β 」のどちらを適用すればいいのかが決まる。(効率のよい処理が望める)

38言語プロセッサ 2013 (東京工科大学CS学部)

Page 39: 言語プロセッサ 2013 - No.6-

 でも、与えられた文法が LL(1) 文法であることをどうやって知ることができるのだろうか?

39言語プロセッサ 2013 (東京工科大学CS学部)

Page 40: 言語プロセッサ 2013 - No.6-

LL(1) 文法の判定法• First• Follow

これは次回やりましょう。少し煩雑で

すが、難しくはありません。でも重要ですよ!

40言語プロセッサ 2013 (東京工科大学CS学部)