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