言語理論とコンパイラ
第二回 (2012 年 4 月 20
日)
形式言語の重要性、種類、定義
http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture2.html
Martin J. Dürst
© 2006-12 Martin
J. Dürst 青山学院大学
今日の内容
- 前回からの宿題
- 言語理論の定義
- 言語理論の演算
- オートマトン、文法、導出
前回からの宿題
- 下記一行の C
プログラム断片の字句解析の結果、構文解析の結果、そしてコンパイラの出力
(アセンブリ言語; コメントは必要ない; 引き算は
SUB
、割り算は DIV
)
を、授業の例に習って書きなさい。
grade = english/2 + math - absent*5;
宿題の正解例
[事情により削除]
授業全体の内容
|
理論 |
コンパイラ |
他の応用 |
フロントエンド
(front end) |
言語理論、オートマトン |
字句解析、構文解析 |
正規表現, XML |
バックエンド
(back end) |
|
最適化、コード生成 |
|
言語理論の重要性
- データ形式、プログラム言語のモデル
- 計算、認識のモデル
言語の基本用語
自然言語 (natural language)
の場合は文や文書はある規則によって (単)語から構成
形式言語 (formal language) の場合の用語:
- 語 (word) がある規則によって記号 (symbol) から構成
- 語は記号の列 (string of symbols)
- 例: 記号 a, b, c を元に
a, abc, aaabbb, abcba,
等の語がある
- 空語 (empty word) ε も語の一つ
語の定義
- ある語や言語はある記号の有限集合 Σ
をもとに定義
- Σ はアルファベット (alphabet) という (例:
Σ = {a, b, c})
- Σ 上の語 (word over Σ) は Σ
に属する 0 以上の記号の列
- 記号の数は語の長さ (length of the word)
- 語 w の長さは |w| と表記
- 例: |abcba| = 5; |ε| = 0
- 記号は長さ 1 の語でもある
語の連結演算
- 二つの語を連続して並ぶと新しい語ができる
- これは語の連結演算 (concatenation operation)
- 連結演算は演算子なしで表記
- 例: 語 w と v の連結は
wv と表記
- 応用例: w = abc で v =
cba の時に wv = abccba
である
- 同じ語 (や記号) の連結は乗数で表記:
w2 =
ww、a5 = aaaaa
等
連結演算の性質
- 結合法則 (associativity): 語 w, v,
u の時 (wv)u =
w(vu)
- 単位元 (neutral element) は ε: wε
= εw = w
- 可換法則は成立しない: wv ≠
vw
- 連結の語の長さは連結される語の長さの和:
|wv| = |w| + |v|
言語の定義
Σ 上の言語 (language over Σ) は Σ
上の語の集合
Σ ={a,b,c}
上の言語の例:
- 空集合: {}
- 空語の集合: {ε}
- Σ (Σ 上の長さ 1 の語の集合):
{a,b,c}
- 長さ 3 の (Σ 上の) 語の集合
- Σ 上の全ての語の集合
- a と始まる (Σ 上の) 語の集合
- a を晴、b を曇、c
を雨・雪にして、来週の都道府県庁の一日づつの天気を表す語の集合
言語の例 (続き)
- Σ = {a,..., z}, C 言語の予約語 (の集合)
- Σ = {0,..., 9, a,..., f, A,..., F, x,...}, C
言語の整数定数 (の集合)
- Σ = {ASCII や Unicode の文字}, 文法的に正しい C
言語のプログラム (の集合)
- Σ = {a,..., z, (, ), ¬, ∧, ∨}, (論理演算の)
整論理式 (の集合)
- Σ = {ローマ字など}, 英語の単語 (の集合)
- Σ = {ローマ字など}, フランス語の単語
(の集合)
- Σ = {漢字、かななど}, 日本語の単語
(の集合)
- Σ = {漢字、かななど},
日本語の文法的に正しい文 (の集合)
言語の演算
言語の演算は集合の演算と語の演算の組み合わせ
- 言語の和集合
- 言語の積集合
- 言語の差集合
- 言語の結合演算: 言語 A と B
の場合、結合 AB = { wv |
w∈A, v∈B }
語と同じく言語でも LL を
L2 等で表記
- クリーン閉包 (閉含) ((Kleene) closure): 0
以上の同じ言語の連結
L* と書く; L* =
⋃∞i=0
Li
例: L = {a, b} =>
L* = {ε, a, b,
aa, ab, ba, bb, aaa,
...}
形式言語の主な課題
- 言語の簡単で分かりやすい定義
- 言語の定義からの語の作成方法
- ある記号の列はある言語に属するかどうかの判断方法
- この判断がどうやって簡単で高速に実装、実行可能
オートマトンと文法と言語
- オートマトンは言語を受理 (認識、識別)
する機械のモデル
- 文法は言語を生成する規則
- オートマトンと文法には様々な種類が存在
- 種類によって受理・生成する言語が異なる
- 言語理論では主に四種類の言語を区別
- この四種類の言語には順番に部分集合の関係が成立
- この四種類の言語にはそれぞれオートマトンと文法の種類が対応
形式言語の表
(チョムスキー階層、Chomsky hierarchy)
文法 |
grammar |
Type |
言語 (族) |
オートマトン |
句構造文法 |
phrase structure grammar (psg) |
0 |
句構造言語 |
チューリング機械 |
文脈依存文法 |
context-sensitive grammar (csg) |
1 |
文脈依存言語 |
線形拘束オートマトン |
文脈自由文法 |
context-free grammar (cfg) |
2 |
文脈自由言語 |
プッシュダウンオートマトン |
正規文法 |
regular grammar (rg) |
3 |
正規言語 |
有限オートマトン |
- チューリング機械 (Turing machine)
は一般の計算機のモデル
- 文脈自由言語は構文解析に使用
- 正規言語は字句解析に使用
オートマトンの種類
オートマトンの種類は「外部」メモリの制限で決まる:
0. 外部メモリなし: 有限オートマトン
1. 外部メモリが最上部しか見えないスタック:
プッシュダウンオートマトン
2. 外部メモリが長さ制限付きのテープ:
線形拘束オートマトン
3. 外部メモリが長さ制限なしのテープ:
チューリング機械
文法の定義
(grammar)
- 非終端記号の有限集合 N (nonterminal symbols)
- 終端記号の有限集合 Σ (terminal
symbols、N ∩ Σ = {})
- 書換規則の有限集合 P
(生成規則ともいう、production rules 又は rewriting rules)
- 開始記号 S (S ∈ N,
初期記号とも言う、start symbol)
文法は (N, Σ, P, S)
の四字組で定義
書換規則
(rewriting rule)
書換規則一つは α → β と書く
α は左辺 (left-hand side)、β は右辺
(right-hand side) という
α とβ は
0以上の非終端記号と終端記号の列
左辺には非終端記号が最低一つ
例: aD → aDDb, EF → abc,
F → Fb, D → ε
反例: bc → Dc, ε → b
導出
(derivation)
- 文法から語を作るプロセス
- 導出は初期記号から始まる
- 一回の導出では一つの書き換え規則を一回適用:
- 現在ある (非)終端記号の中に
- 書換規則の左辺と同じ部分列を見つけ
- この部分列を書換規則の右辺と入れ代える
- 複数の導出が可能な場合、任意に選べる
- 結果が終端記号だけの列になるとその終端記号の列が
(文法が定義する) 言語の一つの語
- 適用可能な書換規則がない場合、この導出が失敗
文法の種類
文法の種類は書換規則の制限で決まる:
0. 特に制限なし: 句構造文法 (phrase structure grammar), (Chomsky)
0 型文法
1. αAβ →
αγβ (α, β
は0以上の、γ は1以上の (非)終端記号の列)
の場合:
文脈依存文法 (context-sensitive grammar), (Chomsky) 1 型文法
2. A → β (β は0以上の
(非)終端記号の列) の場合:
文脈自由文法 (context-free grammar), (Chomsky) 2 型文法
3. A → aB 又は A→
a 又は A →ε (A →
Ba 又は A→ a 又は
A →εでも可) の場合:
正規文法 (regular grammar), (Chomsky) 3 型文法
導出の例
文法: S → aba, S → aDTa,
T → CDTa, T → CDa,
DC → CD, aC → aa, Da
→ ba, Db → bb
導出の一例: S
→aDTa→aDCDaa→aCDDaa→aaDDaa→aaDbaa→aabbaa
宿題
提出期限と場所: 2011 年 4 月 26 日 (木) 19:00 まで O 棟 5
階の O-529 号室の前の箱に投入
形式: A4 一枚 (裏も使用可能)
- L = { a, cb, ac }
の場合、L* の一番短い語
10個を列挙しなさい。
発展問題 (解答自由): L*
の長さ4の語を全て列挙しなさい。
- 「導出の例」で使われた文法を使って、4つの
(例とお互いと)
異なる語の導出を書きなさい。この文法はどの様な言語を定義しているかを推測して、説明しなさい。(ヒント:
推測が簡単でなかったら、導出に問題があるかも)
発展問題 (解答自由):
自分の推測を証明してみなさい。
- (提出なしだが、できなかった場合、必ず次回にノートパソコンを持参すること)
自分のノートパソコンに cygwin をインストールする (画像つき詳細)。インストールの手順で必ず
gcc, flex, bison, diff と
make
を選ぶ。以前インストールされた場合、必ず確認・更新。