言語理論とコンパイラ
第二回 (2014 年 4 月 18
日)
形式言語の重要性、種類、定義
http://www.sw.it.aoyama.ac.jp/2014/Compiler/lecture2.html
Martin J. Dürst
© 2006-14 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 (例: abccba ≠ cbaabc)
- 連結の語の長さは連結される語の長さの和:
|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,
...}
形式言語の主な課題
- 言語の簡単で分かりやすい定義
- 言語の定義からの語の作成方法
- ある記号の列はある言語に属するかどうかの判断方法
- この判断がどうやって簡単で高速に実装、実行可能
- 構文 (syntax) と意味 (semantics) の関連付け
オートマトンと文法と言語
- オートマトンは言語を受理 (認識、識別)
する機械のモデル
- 文法は言語を生成する規則
- オートマトンと文法には様々な種類が存在
- 種類によって受理・生成する言語の範囲が異なる
- 言語理論では主に四種類の言語 (族) を区別
- この四種類の言語には順番に部分集合の関係が成立
- この四種類の言語にはそれぞれオートマトンと文法の種類が対応
形式言語の表
(チョムスキー階層、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)
- 文法から語を作るプロセス
- 初期記号から開始
- 一回の導出では一つの書き換え規則を一回適用:
- 現在ある (非)終端記号の中に
- 書換規則の左辺と同じ部分列を特定
- この部分列を書換規則の右辺と置換
- 複数の導出が可能な場合、任意に選択
(選択により、別の語を作成)
- 結果が終端記号だけの列の時点で導出が終了
→結果が (文法が定義する) 言語の一つの語
- 適用可能な書換規則がない場合、導出が失敗
文法と導出の例
文法:
S → aba (1), S → aDTa (2),
T → CDTa (3), T → CDa
(4),
DC → QC (5), QC → QD (6),
QD → CD (7),
aC → aa (8), Da → ba (9),
Db → bb (10)
(数値は書き換え規則の番号、下線は書換規則の適応範囲、普通
(宿題を含め) 省略)
導出の一例: S →2 aDTa→4 aDCDaa→5 aQCDaa→9 aQCbaa→6 aQDbaa→7 aCDbaa→8 aaDbaa→10 aabbaa
文法の種類
文法の種類は書換規則の制限で区別:
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 → Ba 又は A→
aでも可) の場合:
正規文法 (regular grammar), (Chomsky) 3 型文法
(全ての場合に、S → ε も特別に可)
宿題
提出期限と場所: 2014 年 4 月 24 日 (木) 19:00 まで O 棟 5
階の O-529 号室の前の箱に投入
形式: A4 一枚 (裏も使用可)
- L = { a, cb, ac }
の場合、L* の一番短い語
10個を列挙しなさい。
発展問題 (解答自由): L*
の長さ4の語を全て列挙しなさい。
- 「導出の例」で使われた文法を使って、3つの
(例とお互いと) 異なる語の導出を書きなさい
(途中段階を全部含む、番号・下線不要)。この文法はどの様な言語を定義しているかを推測し、説明しなさい。
(ヒント:
推測が簡単でなかったら、導出に問題の可能性大)
発展問題 (解答自由):
自分の推測を証明してみなさい。
- (提出なしだが、できなかった場合、必ず次回にノートパソコンを持参すること)
自分のノートパソコンに cygwin をインストールする (画像つき詳細)。インストールの手順で必ず
gcc, flex, bison, diff と
make
を選ぶ。以前インストールされた場合、必ず確認・更新。