言語理論とコンパイラ
第三回:
有限オートマトンと線形文法
2008年 4月25日
http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture3.html
Martin J. Dürst
duerst@it.aoyama.ac.jp, O 棟
529号室
© 2005-8 Martin
J. Dürst 青山学院大学
今日の予定
- 先週の宿題
- 有限オートマトン
- 線形文法
- 正規表現
- それらの間の変換
先週の宿題 1
[都合により削除]
先週の宿題 2
[都合により削除]
Cygwin のダウンロード、インストール
(提出なしだが、出来なかった人は次回にノートパソコンを持ってきて下さい。)
自分のノートパソコンに cygwin をダウンロード、インストールする。インストールの手順で必ず
gcc, flex と bison
を選ぶ。(家にダイアルアップ回線しかなかったら学校でやった方がよい。)
flex と bison の動作確認
- Cygwin Bash Shell を起動
flex -V
で flex のバージョン確認
gcc -v
で gcc のバージョン確認 (v
は小文字)
bison -V
で bison のバージョン確認
先週の終わり
文法 |
Type |
言語 |
オートマトン |
句構造文法 |
0 |
句構造言語 |
チューリング機械 |
文脈依存文法 |
1 |
文脈依存言語 |
線形拘束オートマトン |
文脈自由文法 |
2 |
文脈自由言語 |
プッシュダウンオートマトン |
正規文法 |
3 |
正規言語 |
有限オートマトン |
正規言語は字句解析の時に使う。
今週の展望
- 有限オートマトン (finite state automaton, FSA)
- 決定性有限オートマトン (deterministic finite automaton,
DFA)
- 非決定性有限オートマトン (non-deterministic finite
automaton, NFA)
- 正規文法 (regular grammar)
- 左線形文法 (left linear grammar)
- 右線形文法 (right linear grammar)
- 正規表現 (regular expression)
これらは全て同じ力を持って、正規言語を定義・受理する
有限オートマトン
- スタート状態から始まる
- 入力の語を繰り返して一字読んで、これによって状態を遷移する
- 語を読み終わった時に受理状態にいるとこの語が受理される
- 語を読み終わった時に受理状態にいない、もしくは途中で動作ができない場合に語が受理されない
- 状態の数が有限である
(すなわち、メモリは制限されている)
(automaton はギリシア語で、複数は automata)
有限オートマトンの状態遷移図
有限オートマトンの遷移表
(≈動作関数=状態遷移関数)
有限オートマトンに必要な物
- 状態の有限集合 (Q、図の円)
- 入力記号の有限集合
(Σ、図の矢印のラベル)
- 動作関数 (δ、図のラベル付き矢印)
- 初期状態 (q0 ∈ Q、図の (二重)
矢印、表の矢印つき状態)
- 受理状態の有限集合 (F ⊆
Q、図の二重円、表の星つき状態)
有限オートマトンは (Q, Σ, δ, q0, F)
の五字組で定義できる。
決定性と非決定性有限オートマトン
|
決定性 |
非決定性 |
同時に |
一つの状態 |
複数の状態 |
受理条件 |
状態が受理状態 |
状態の一つ以上が受理状態 |
ε 遷移 |
不可 |
可能 |
動作関数の型 |
δ: Q × Σ → Q |
δ: Q × (Σ ∪ {ε}) →
2Q |
(決定性) 有限オートマトンの例
- ある一個の語だけ受理できる
- ある記号の数が奇数、偶数、3で割れば余りが 2、等
- 語の先頭に決まった記号列がある
- 語の終わりに決まった記号列がある
- 語の真ん中に・どこかに決まった記号列がある
- 語の中にある記号列が潜んでいる
- 二つ以上の条件を同時に満たすもの
NFA から同等の DFA への変換
アルゴリズムの原理:
- NFA の状態の集合が DFA の状態に
- NFA の初期状態とそこから ε
遷移でいける状態の集合が DFA の初期状態
- NFA の受理状態を一つ以上含まれる DFA
の状態が受理状態
全ての DFA は NFA でもある。全ての NFA は同等の DFA
に変換できる。
よって、DFA と NFA の受理能力が等しい。
実装は DFA
の方が簡単が、テーブルは大きくなる可能性がある。
NFA から同等の DFA への変換の一例
動作関数
|
ε |
0 |
1 |
S |
{A} |
{} |
{} |
A |
{} |
{A,C} |
{B} |
B |
{} |
{} |
{A} |
C |
{} |
{} |
{} |
NFA から同等の DFA への変換: 注意点
ε 遷移の扱い方
- 「普通」の遷移を行った後に、ε
遷移をたどる
- ε 遷移は複数 (並行、立て続け) たどれる
- これを ε 閉包という
DFA の最小化
ある DFA から同等の最小の DFA を次の通りに作れる:
- 状態を受理状態と非受理状態の二つの集合に分ける
- それそれの状態からどの記号でどの集合に遷移するかを調べる
- 現在の集合を、どの記号でも同じ集合に遷移する状態の部分集合に分ける
- 3. で変更がない時まで 2. から繰り返す
最小化によって効率よい実装ができるし、二つの有限オートマトンが同等であるかどうかも簡単に調べられる。
DFA の最小化の一例
今週のまとめ
- 正規表現、線形・正規文法、有限オートマトンは皆同じ表現・受理能力を持つ。
- DFA による効率良い受理プログラムが作れる。
- これらは字句解析に有効に使える。