言語理論とコンパイラ

第二回 (2008年 4月18日)

形式言語の重要性、種類、定義

http://www.sw.it.aoyama.ac.jp/2008/Compiler/lecture2.html

AGU

© 2006-8 Martin J. Dürst 青山学院大学

先週からの宿題

  1. XML に付いて調べて、結果をページ半分程度にまとめなさい。(この授業に関係あることの方がよい。)
  2. 次の行の Cプログラムの一文の字句解析の結果、構文解析の結果、そしてコンパイラの出力 (アセンブリ言語; コメントは必要ない; 割り算は DIV で) を、授業の例に習って書きなさい。
    total = pretax + pretax/100*5;

宿題 2 の正解例

[都合により削除]

授業全体の内容

理論 コンパイラ 他の応用
フロントエンド 言語理論、オートマトン 字句解析、構文解析 正規表現, XML
バックエンド 最適化、コード生成

言語理論の重要性

言語の基本用語

自然言語 (natural language) の場合は文や文書はある規則によって語から構成される

形式言語 (formal language) の場合は用語の使い方が違う:

語の定義

ある語や言語はある記号の有限集合 Σ を元に定義される

Σ はアルファベット (alphabet) という

Σ 上の語 (word over Σ) は Σ に属する 0 以上の記号の列である

記号の数は語の長さ (length of the word) といって、語 w の長さは |w| で表す

例: |abcba| = 5; |ε| = 0

記号は長さ 1 の語である

語の連結演算

二つの語を続いて並ぶと新しい語ができる

これは語の連結演算 (concatenation operation) という

連結演算は演算子なしで書く

例: 語 wv の連結は wv と書く

応用例: w = abcv = cba の時に wv = abccba である

同じ語 (や記号) の連結は乗数で書く: ww = w2aaaaa = a5

連結演算の性質

結合法則: 語 w, v, u の時 (wv)u = w(vu)

単位元は ε: wε = εw = w

可換法則は成り立たない: wvvw

連結の語の長さは連結される語の長さの和

言語の定義

Σ 上の言語 (language over Σ) は Σ 上の語の集合である

例 (Σ ={a,b,c}):

言語の演算

言語の演算は集合の演算と語の演算の組み合わせ

オートマトンと文法と言語

形式言語の表

文法 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以上の非終端記号と終端記号の列

α には被終端記号が少なくとも一つ含まれてないといけない

例: aAbaAAb, BCabc, CCb, Aε

反例: bcAc, εb

文法の種類

文法の種類は書換規則の制限で決まる

0. 特に制限なし: 句構造文法 (phrase structure grammar), (Chomsky) 0 型文法 (Type-0 grammar)

  1. αAβαγβ (α, β は0以上の、γ は1以上の (非)終端記号の列) の場合:
    文脈依存文法 (context-sensitive grammar), (Chomsky) 1 型文法 (Type-1 grammar)
  2. Aβ (β は0以上の (非)終端記号の列) の場合:
    文脈自由文法 (context-free grammar), (Chomsky) 2 型文法 (Type-2 grammar)
  3. AaB 又は Aa (ABa 又は Aa でも可) の場合:
    正規文法 (regular grammar), (Chomsky) 3 型文法 (Type-3 grammar)

導出

文法から語を作るプロセスは導出という

導出は初期記号から始まる

一回の導出は一つの書き換え規則の一回の適用:

現在ある (非)終端記号の列にある書換規則の左辺と同じ部分列を見つけ、この部分列を書換規則の右辺に入れ代える

結果が終端記号だけになるとその終端記号の列が文法が定義する言語の一つの語

適用できる書換規則がない場合、この導出が失敗

導出の例

文法: Saba, SaBTa, TABTa, TABa, BAAB, aAaa, Baba, Bbbb

導出: SaBTaaBABaaaABBaaaaBBaaaaBbaaaabbaa

宿題

提出期限と場所: 2008年4月24日 (木) 19:00 まで O棟5階のO529 号室の前の箱に投入

形式: A4 一枚 (裏も使ってよい)

  1. L = { a, cb, ac } の場合、L* の一番短い語 10個を列挙しなさい。
    発展問題 (解答自由): L* の長さ4の語を全て列挙しなさい。
  2. 「導出の例」で使われた文法を使って、4つの (例とお互いと) 異なる語の導出を書きなさい。この文法はどの様な言語を定義しているかを推測して、説明しなさい。
    発展問題 (解答自由): 自分の推測を証明してみなさい。
  3. (提出なしだが、出来なかった人は次回にノートパソコンを持ってきて下さい。)
    自分のノートパソコンに cygwin をダウンロードインストールする。インストールの手順で必ず gcc, flexbison を選ぶ。(家にダイアルアップ回線しかなかったら学校でやった方がよい。)