第二回 (2008年 4月18日)
形式言語の重要性、種類、定義
http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture2.html
© 2006-8 Martin J. Dürst 青山学院大学
DIV
で) を、授業の例に習って書きなさい。total = pretax + pretax/100*5;
[都合により削除]
理論 | コンパイラ | 他の応用 | |
---|---|---|---|
フロントエンド | 言語理論、オートマトン | 字句解析、構文解析 | 正規表現, XML |
バックエンド | 最適化、コード生成 |
自然言語 (natural language) の場合は文や文書はある規則によって語から構成される
形式言語 (formal language) の場合は用語の使い方が違う:
ある語や言語はある記号の有限集合 Σ を元に定義される
Σ はアルファベット (alphabet) という
Σ 上の語 (word over Σ) は Σ に属する 0 以上の記号の列である
記号の数は語の長さ (length of the word) といって、語 w の長さは |w| で表す
例: |abcba| = 5; |ε| = 0
記号は長さ 1 の語である
二つの語を続いて並ぶと新しい語ができる
これは語の連結演算 (concatenation operation) という
連結演算は演算子なしで書く
例: 語 w と v の連結は wv と書く
応用例: w = abc で v = cba の時に wv = abccba である
同じ語 (や記号) の連結は乗数で書く: ww = w2、aaaaa = a5 等
結合法則: 語 w, v, u の時 (wv)u = w(vu)
単位元は ε: wε = εw = w
可換法則は成り立たない: wv ≠ vw
連結の語の長さは連結される語の長さの和
Σ 上の言語 (language over Σ) は Σ 上の語の集合である
例 (Σ ={a,b,c}):
言語の演算は集合の演算と語の演算の組み合わせ
語と同じく言語でも LL を L2 等で表す
L* と書く
例: L = { a, b } => L* = { ε, a, b, aa, ab, ba, bb, aaa, ... }
文法 | grammar | Type | 言語 | オートマトン |
句構造文法 | phrase structure grammar (psg) | 0 | 句構造言語 | チューリング機械 |
文脈依存文法 | context-sensitive grammar (csg) | 1 | 文脈依存言語 | 線形拘束オートマトン |
文脈自由文法 | context-free grammar (cfg) | 2 | 文脈自由言語 | プッシュダウンオートマトン |
正規文法 | regular grammar (rg) | 3 | 正規言語 | 有限オートマトン |
文法は (N, Σ, P, S) の四字組で定義される。
書換規則一つは α → β と書く
α は左辺 (left-hand side)、β は右辺 (right-hand side) という
α とβ は 0以上の非終端記号と終端記号の列
α には被終端記号が少なくとも一つ含まれてないといけない
例: aAb → aAAb, BC → abc, C → Cb, A → ε
反例: bc → Ac, ε → b
文法の種類は書換規則の制限で決まる
0. 特に制限なし: 句構造文法 (phrase structure grammar), (Chomsky) 0 型文法 (Type-0 grammar)
文法から語を作るプロセスは導出という
導出は初期記号から始まる
一回の導出は一つの書き換え規則の一回の適用:
現在ある (非)終端記号の列にある書換規則の左辺と同じ部分列を見つけ、この部分列を書換規則の右辺に入れ代える
結果が終端記号だけになるとその終端記号の列が文法が定義する言語の一つの語
適用できる書換規則がない場合、この導出が失敗
文法: S → aba, S → aBTa, T → ABTa, T → ABa, BA → AB, aA → aa, Ba → ba, Bb → bb
導出: S ⇒aBTa⇒aBABaa⇒aABBaa⇒aaBBaa⇒aaBbaa⇒aabbaa
提出期限と場所: 2008年4月24日 (木) 19:00 まで O棟5階のO529 号室の前の箱に投入
形式: A4 一枚 (裏も使ってよい)