トッププログラミング言語 > 形式言語と処理機械(オートマトン)の関係

形式言語と処理機械(オートマトン)の関係

1.チョムスキーの分類

形式言語とオートマトンの関係を詳しく述べるために、チョムスキーの分類を再掲しておく。

表1.チョムスキーの分類
タイプ文法オートマトン言語例
0型句構造文法チューリングマシン自然言語
1型文脈依存文法線形有界オートマトン
2型文脈自由文法プッシュダウンオートマトンプログラム言語
3型正規文法有限オートマトン体系化したコードなど

2.正規文法

識別子(変数名、関数名など)の構文規則は次のように正規文法により定義できる[1]。

  <識別子> ::= <英字> { <英数字> }
  <英数字> ::= <英字> | <数字>
  <英字>   ::= a | b | … | z | A | B | … | Z
  <数字>   ::= 0 | 1 | 2 | … | 9

ここで { <英数字> } は <英数字> が0個以上並んだものを表す。 第2回の授業での記法を使えば、( <英数字> )* となる。

正規文法により定義された構文は有限オートマトン(finite automaton)によって認識することができる。 有限オートマトンは、有限個の状態と状態間の遷移を基本概念とする認識機械である。 初期状態から出発し、入力語中の記号を1つずつ読み込み、状態遷移を次々に繰り返し、 入力語が認識されるかどうかを調べる。上の構文規則で定義される識別子を認識する 有限オートマトンを図1.に示す。図中、○は状態を表し、矢印は状態遷移を表す。

初期状態s0で英字を読み込むと、状態s1に遷移する。 s1では、英字または数字の読み込みによって自分自身へ遷移する。 状態s1が◎になっているのは、それが識別子を認識した状態になっていることを表している。


図1.識別子を認識する有限オートマトン

この有限オートマトンの数学モデルは <Σ, S, s0, δ, F> の5要素から構成される。

プログラミング言語の構成要素は識別子のほか、 予約語(C言語で言えば、int, if, for, structなど)、演算子、記号、数値などが存在するが、 いずれも、正規文法で定義することができる。 したがって、コンパイラやインタプリタの字句解析フェーズでは、 このような有限オートマトンに対応する処理メカニズムを何らかの形で実現すればよい。


参考文献

[1] 白鳥、高橋、神長:ソフトウェア工学の基礎知識、昭晃堂(2003)
[2] http://www.sw.it.aoyama.ac.jp/2009/Compiler/lecture6.html