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

25
言言言言言言言 言言言言言言言 2007 2007 -No.6- -No.6- 言言言言言言 言言言言言言 言言言言言言言言言言言言言 言言言言言言言言言言言言言 言言言言 言言言言

description

言語プロセッサ 2007 -No.6-. 東京工科大学 コンピュータサイエンス学部 亀田弘之. 内容. 前回の復習と演習 正規表現の ε-NFA への変換方法 ε-NFA の DFA への変換方法 Lex の紹介 構文解析(重要). 前回の復習. 処理対象を 正規表現 で記述 正規表現→ ε-NFA ε-NFA →DFA DFA→ 状態数最小 DFA  例題:正規表現 (ab|bc)*a(b|c). 確認のための演習. 教科書の73ページ問題1 (試験に出す予定). 演習. 次の正規表現 α について答えよ。 簡単化せよ。 - PowerPoint PPT Presentation

Transcript of 言語プロセッサ 2007 -No.6-

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

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

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

亀田弘之亀田弘之

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

内容1. 前回の復習と演習

1. 正規表現の ε-NFA への変換方法2. ε-NFA の DFA への変換方法

2. Lex の紹介3. 構文解析(重要)

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

前回の復習1. 処理対象を正規表現で記述2. 正規表現→ ε-NFA3. ε-NFA →DFA4. DFA→ 状態数最小 DFA

 例題:正規表現 (ab|bc)*a(b|c)

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

確認のための演習• 教科書の73ページ問題1(試験に出す予定)

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

演習1. 次の正規表現 α について答えよ。

1. 簡単化せよ。2. α を受理する状態数最少の DFN を作れ。

α = dd* | dd*.dd* | .dd* | | dd*E(s|ε)dd* |E(s|ε)dd* |.dd*E(s|ε)dd*

ただし、 d = { 0, 1, 2, 3, …, 9 }, s = { +, - }

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

発展課題ー 字句解析プログラム ー1. 教科書 p.72 ~ p.73 のソースコードを解

析せよ。( 典型的なコードですので、一度ゆっくり 解読することをお勧めします。 このあたりは、後日また授業で解説し  ます。 )

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

ここから今日の話

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

正規表現認識プログラム• 例:

– (a|b)*ab– C 言語の浮動小数点定数

など

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

方法• Java, C, Pascal などで記述することは

できるが、以下では、 flex を用いる方法を紹介する。

• まず、 (a|b)*ab について説明する。

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

例1: (a|b)*ab

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

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

する。

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

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

手順Flex gccFlex

Program

Lex.yy.c

a.exe文字列入力 出力

ライブラリ(fl)

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

(1) flex のプログラムを書く%%[\t ] { }(a|b)*ab { printf(“OK %s\n”,yytext); }. { printf(“NG %s\n”,yytext); }%%

<< 注 >>   sample01.l に格納。

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

(2)&(3) flex と gcc を使用

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

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

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

例 2 :正負の整数FIGURE [0-9]%%-{FIGURE}+ {printf("negative integer\n");}\+?{FIGURE}+{printf("positive integer\n");}

%%

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

(参考)正負の整数・実数• 数 → 整数 | 実数• 整数 → 正整数|負数• 正整数 → 符号付正整数|符号なし正整数• 負数 → 符号付負数• 符号付正整数 → +( 0|1|2|…|9 ) +

• 符号なし正整数 → ( 0|1|2|…|9 ) +

• 符号付負整数 → ー( 0|1|2|…|9 ) +

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

例 3 : ( C 言語の)浮動小数点定数

Numbers

Numbers

Numbers

Numbers

Numbers

f

l

E

e +

-L

F

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

例 3 : ( C 言語の)浮動小数点整数正規表現は、…((([0-9]*\.[0-9]+)|([0-9]+\.))|([0-

9]+))([eE][+-]?[0-9]+)?[flFL]?

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

例 4 :学籍番号学籍番号の構造:[0-9]{2,2}(A|B|C|D|P)[0-9]{3,3}

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

%%[0-9]{2,2}(A|B|C|D|P)[0-9]{3,3} printf(“%s

(Student ID)”,yytext);%%

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

練習• 前記の各例に対して、 flex で処理プログラムを書け。(試験に出す予定)

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

言語プロセッサ言語プロセッサ 20072007-No.6-No.6 (後半)(後半) --

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

亀田弘之亀田弘之

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

字句解析から構文解析へ

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

キーワード(構文解析)• 上向き解析 / 下向き解析( bottom up & top down )• Backtracking• 括りだし (factoring)• 左再帰性• First 集合 /Follow 集合  など

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

上向き解析 / 下向き解析数式→数式 演算子 数式数式→(数式)数式→-数式数式→ id演算子→ + | - | * |/

例: 5 + 3 ( 2 – 1 ) * 7