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

Post on 18-Mar-2016

73 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

言語プロセッサ言語プロセッサ 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

top related