Download - 言語プロセッサ 2007 -No.6-
![Page 1: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/1.jpg)
言語プロセッサ言語プロセッサ 20072007-No.6--No.6-
東京工科大学東京工科大学コンピュータサイエンス学部コンピュータサイエンス学部
亀田弘之亀田弘之
![Page 2: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/2.jpg)
内容1. 前回の復習と演習
1. 正規表現の ε-NFA への変換方法2. ε-NFA の DFA への変換方法
2. Lex の紹介3. 構文解析(重要)
![Page 3: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/3.jpg)
前回の復習1. 処理対象を正規表現で記述2. 正規表現→ ε-NFA3. ε-NFA →DFA4. DFA→ 状態数最小 DFA
例題:正規表現 (ab|bc)*a(b|c)
![Page 4: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/4.jpg)
確認のための演習• 教科書の73ページ問題1(試験に出す予定)
![Page 5: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/5.jpg)
演習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-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/6.jpg)
発展課題ー 字句解析プログラム ー1. 教科書 p.72 ~ p.73 のソースコードを解
析せよ。( 典型的なコードですので、一度ゆっくり 解読することをお勧めします。 このあたりは、後日また授業で解説し ます。 )
![Page 7: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/7.jpg)
ここから今日の話
![Page 8: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/8.jpg)
正規表現認識プログラム• 例:
– (a|b)*ab– C 言語の浮動小数点定数
など
![Page 9: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/9.jpg)
方法• Java, C, Pascal などで記述することは
できるが、以下では、 flex を用いる方法を紹介する。
• まず、 (a|b)*ab について説明する。
![Page 10: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/10.jpg)
例1: (a|b)*ab
![Page 11: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/11.jpg)
手順1. Flex のプログラムを書く。2. Flex のプログラムを flex にかける。3. 出力ファイル lex.yy.c を gcc でコンパイル
する。
4. 出力 a.exe を実行する。5. さまざまな文字列を入力する。
![Page 12: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/12.jpg)
手順Flex gccFlex
Program
Lex.yy.c
a.exe文字列入力 出力
ライブラリ(fl)
![Page 13: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/13.jpg)
(1) flex のプログラムを書く%%[\t ] { }(a|b)*ab { printf(“OK %s\n”,yytext); }. { printf(“NG %s\n”,yytext); }%%
<< 注 >> sample01.l に格納。
![Page 14: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/14.jpg)
(2)&(3) flex と gcc を使用
C:\> flex sample01.lC:\> gcc lex.yy.c –lflC:\> a.exe
それでは、実際にやってみよう。
![Page 15: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/15.jpg)
例 2 :正負の整数FIGURE [0-9]%%-{FIGURE}+ {printf("negative integer\n");}\+?{FIGURE}+{printf("positive integer\n");}
%%
![Page 16: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/16.jpg)
(参考)正負の整数・実数• 数 → 整数 | 実数• 整数 → 正整数|負数• 正整数 → 符号付正整数|符号なし正整数• 負数 → 符号付負数• 符号付正整数 → +( 0|1|2|…|9 ) +
• 符号なし正整数 → ( 0|1|2|…|9 ) +
• 符号付負整数 → ー( 0|1|2|…|9 ) +
![Page 17: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/17.jpg)
例 3 : ( C 言語の)浮動小数点定数
Numbers
Numbers
Numbers
Numbers
Numbers
f
l
.
.
E
e +
-L
F
![Page 18: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/18.jpg)
例 3 : ( C 言語の)浮動小数点整数正規表現は、…((([0-9]*\.[0-9]+)|([0-9]+\.))|([0-
9]+))([eE][+-]?[0-9]+)?[flFL]?
![Page 19: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/19.jpg)
例 4 :学籍番号学籍番号の構造:[0-9]{2,2}(A|B|C|D|P)[0-9]{3,3}
![Page 20: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/20.jpg)
%%[0-9]{2,2}(A|B|C|D|P)[0-9]{3,3} printf(“%s
(Student ID)”,yytext);%%
![Page 21: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/21.jpg)
練習• 前記の各例に対して、 flex で処理プログラムを書け。(試験に出す予定)
![Page 22: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/22.jpg)
言語プロセッサ言語プロセッサ 20072007-No.6-No.6 (後半)(後半) --
東京工科大学東京工科大学コンピュータサイエンス学部コンピュータサイエンス学部
亀田弘之亀田弘之
![Page 23: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/23.jpg)
字句解析から構文解析へ
![Page 24: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/24.jpg)
キーワード(構文解析)• 上向き解析 / 下向き解析( bottom up & top down )• Backtracking• 括りだし (factoring)• 左再帰性• First 集合 /Follow 集合 など
![Page 25: 言語プロセッサ 2007 -No.6-](https://reader035.vdocuments.mx/reader035/viewer/2022070502/56814b08550346895db82134/html5/thumbnails/25.jpg)
上向き解析 / 下向き解析数式→数式 演算子 数式数式→(数式)数式→-数式数式→ id演算子→ + | - | * |/
例: 5 + 3 ( 2 – 1 ) * 7