言語処理系(5) 金子敬一
4 プログラミング言語の構文の定義 4.1 文脈自由文法 4.2 導出と解析木 4.3 文脈自由文法の能力
4.1 文脈自由文法 文脈自由文法 BNF記法 プログラミング言語の 構文を指定
4.1 文脈自由文法 書換え規則(生成規則) 文 → if 式 then 文 else 文 式 → 式 + 式 4.1 文脈自由文法 書換え規則(生成規則) 文 → if 式 then 文 else 文 式 → 式 + 式 文 → begin 文の並び end 文の並び → 文 | 文; 文の並び
4.1 文脈自由文法 書換え規則(生成規則) 終端記号:言語の文字列の基本記号.字句と同義 非終端記号:文,式,文の並び,などの構文上の分類 4.1 文脈自由文法 書換え規則(生成規則) 終端記号:言語の文字列の基本記号.字句と同義 非終端記号:文,式,文の並び,などの構文上の分類 出発記号:非終端記号の1つ.対象としている言語を表す. 生成規則:構文上の分類を他の分類や終端記号から生成する規則
4.1 文脈自由文法 書換え規則(生成規則) 文 → begin 文の並び end 文の並び → 文 | 文; 文の並び 文の並び → 文 4.1 文脈自由文法 書換え規則(生成規則) 文 → begin 文の並び end 文の並び → 文 | 文; 文の並び 文の並び → 文 文の並び → 文; 文の並び
4.1 文脈自由文法 生成規則例 非終端記号 式 → 式 演算子 式 式 → ( 式 ) 式 → - 式 式 → id 演算子 → + 4.1 文脈自由文法 生成規則例 非終端記号 式 → 式 演算子 式 式 → ( 式 ) 式 → - 式 式 → id 演算子 → + 演算子 → - 演算子 → * 演算子 → / 演算子 → ^
4.1 文脈自由文法 表記上の約束 次の記号は非終端記号 式,文,演算子のようなゴシック体の日本語による名前 4.1 文脈自由文法 表記上の約束 次の記号は非終端記号 式,文,演算子のようなゴシック体の日本語による名前 アルファベットの最初の方のイタリック体の大文字 文字S.これは出発記号
4.1 文脈自由文法 表記上の約束 次の記号は終端記号 1字の小文字a, b, c +, - のような演算子記号 4.1 文脈自由文法 表記上の約束 次の記号は終端記号 1字の小文字a, b, c +, - のような演算子記号 括弧やコンマのような区切り記号 数字0, 1, ..., 9
4.1 文脈自由文法 表記上の約束 アルファベットの終わりの方の大文字は文法記号(非終端記号または終端記号).主にX, Y, Z 4.1 文脈自由文法 表記上の約束 アルファベットの終わりの方の大文字は文法記号(非終端記号または終端記号).主にX, Y, Z アルファベットの終わりの方の小文字は終端記号列.主にu, v, ..., z
4.1 文脈自由文法 表記上の約束 Aを左辺に持つ生成規則全体をA生成規則.A → a1, A → a2, ..., A → akがA生成規則ならば,A→a1 | a2 | ... | akと書いても良い.a1, a2, ..., akを代替と呼ぶ.
4.1 文脈自由文法 表記上の約束 小文字のギリシャ文字,例えばa, b, g, は文法記号列を表す 最初の生成規則の左辺を出発記号
4.1 文脈自由文法 生成規則例 E → E A E | ( E ) | - E | id A → + | - | * | / | ^ 4.1 文脈自由文法 生成規則例 式 → 式 演算子 式 式 → ( 式 ) 式 → - 式 式 → id 演算子 → + 演算子 → - 演算子 → * 演算子 → / 演算子 → ^ E → E A E | ( E ) | - E | id A → + | - | * | / | ^
4.2 導出と解析木 導出 A → g : 生成規則 a, b : 文法記号 a A b ⇒ a g b : 導出
4.2 導出と解析木 導出 a1 ⇒ a2 ⇒ ... ⇒ an a1はanを導出する. a1からanへの導出
4.2 導出と解析木 導出 ⇒*: 0回以上の導出 ⇒+: 1回以上の導出
4.2 導出と解析木 文と文形式 文脈自由文法G 出発記号S L(G) : Gが w : 終端記号のみからなる文字列 生成する言語 4.2 導出と解析木 文と文形式 文脈自由文法G 出発記号S w : 終端記号のみからなる文字列 S ⇒+ w ⇔ w ∈ L(G) L(G) : Gが 生成する言語 Gの文
4.2 導出と解析木 文と文形式 w : 終端記号のみからなる文字列 Gの文 S ⇒+ w ⇔ w ∈ L(G) 4.2 導出と解析木 文と文形式 w : 終端記号のみからなる文字列 S ⇒+ w ⇔ w ∈ L(G) S ⇒+ a, a : 非終端記号を含みうる Gの文 Gの文形式
4.2 導出と解析木 文と文形式 E → E + E | E * E | ( E ) | - E | id 4.2 導出と解析木 文と文形式 E → E + E | E * E | ( E ) | - E | id E ⇒ - E ⇒ - ( E ) ⇒ - ( E + E ) ⇒ - ( id + E ) ⇒ - ( id + id ) 文形式 文
4.2 導出と解析木 文と文形式 E ⇒ - E ⇒ - ( E ) ⇒ - ( E + E ) ⇒ - ( id + E ) 4.2 導出と解析木 文と文形式 E ⇒ - E ⇒ - ( E ) ⇒ - ( E + E ) ⇒ - ( id + E ) ⇒ - ( id + id ) 最左導出:導出の過程で最も左の非終端記号を置換 cf.最右導出
4.2 導出と解析木 解析木 置換え順序によらない図表現 E ⇒ - E ⇒ - ( E ) ⇒ - ( E + E ) 4.2 導出と解析木 解析木 置換え順序によらない図表現 E E ⇒ - E ⇒ - ( E ) ⇒ - ( E + E ) ⇒ - ( id + E ) ⇒ - ( id + id ) E - ( E ) E + E id id
4.2 導出と解析木 a1 ⇒ a2 ⇒ ... ⇒ anから解析木を生成 a1の節点のみからなる木 4.2 導出と解析木 解析木 a1 ⇒ a2 ⇒ ... ⇒ anから解析木を生成 a1の節点のみからなる木 ai=X1X2...Xkなる解析木に対して,aiをai-1のXjをb=Y1Y2...Yrで置換して得るとき,ai-1を表す解析木のXjに対応する葉に,左からY1, Y2, ..., Yrと名前を付けた子を与える
4.2 導出と解析木 解析木 Eの節点のみからなる木 E
4.2 導出と解析木 解析木 E ⇒ - E ⇒ - ( E ) E E - E E - ( E )
4.2 導出と解析木 解析木 - ( E ) ⇒ - ( E + E ) E - E E - ( E ) ( E ) E +
4.2 導出と解析木 解析木 - ( E + E ) ⇒ - ( id + E ) E - E ( E ) E + E + id
4.2 導出と解析木 解析木 - ( id + E ) ⇒ - ( id + id ) E - E ( E ) E + id id id 4.2 導出と解析木 解析木 - ( id + E ) ⇒ - ( id + id ) E - E ( E ) E + id id id id
4.2 導出と解析木 解析木 E ⇒ E + E ⇒ id + E ⇒ id + E * E ⇒ id + id * E 4.2 導出と解析木 解析木 E ⇒ E + E ⇒ id + E ⇒ id + E * E ⇒ id + id * E ⇒ id + id * id E ⇒ E * E ⇒ E + E * E
4.2 導出と解析木 解析木 E ⇒ E + E ⇒ id + E ⇒ id + E * E ⇒ id + id * E 4.2 導出と解析木 解析木 E ⇒ E + E ⇒ id + E ⇒ id + E * E ⇒ id + id * E ⇒ id + id * id E E + E id E * E id id
4.2 導出と解析木 解析木 E ⇒ E * E ⇒ E + E * E ⇒ id + E * E ⇒ id + id * E 4.2 導出と解析木 解析木 E ⇒ E * E ⇒ E + E * E ⇒ id + E * E ⇒ id + id * E ⇒ id + id * id E E * E E + E id id id
4.2 導出と解析木 曖昧性 複数の解析木を生成する文法は曖昧 曖昧除去規則(結合性,優先順序)
優先順位:- > ^ > {* /} > {+ -} 4.2 導出と解析木 左結合 曖昧性 E → E + E | E - E | E * E | E / E | E ^ E | ( E ) | - E | id に対して曖昧性を除去するには, 右結合 優先順位:- > ^ > {* /} > {+ -}
4.2 導出と解析木 曖昧性 - 1次子 ^ 因子 * / 項 + - 式 式 → 式+項 | 式–項 | 項 4.2 導出と解析木 曖昧性 - 1次子 ^ 因子 * / 項 + - 式 式 → 式+項 | 式–項 | 項 項 → 項*因子 | 項/因子 | 因子 因子 → 1次子^因子 | 1次子 1次子 → -1次子 | 要素 要素 → ( 式 ) | id
4.2 導出と解析木 導出例: x + y * z 式 ⇒ 式+項 ⇒項+項 式 → 式+項 | 式–項 | 項 ⇒因子+項 4.2 導出と解析木 導出例: x + y * z 式 ⇒ 式+項 ⇒項+項 ⇒因子+項 ⇒1次子+項 ⇒要素+項 ⇒id+項 ⇒id+項*因子 ⇒id+因子*因子 ⇒…⇒id+id*因子⇒…⇒id+id*id 式 → 式+項 | 式–項 | 項 項 → 項*因子 | 項/因子 | 因子 因子 → 1次子^因子 | 1次子 1次子 → -1次子 | 要素 要素 → ( 式 ) | id
4.2 導出と解析木 導出例: x + y * z 式 ⇒ 式+項 ⇒項+項 ⇒因子+項 ⇒1次子+項 ⇒要素+項 ⇒id+項 4.2 導出と解析木 導出例: x + y * z 式 式 ⇒ 式+項 ⇒項+項 ⇒因子+項 ⇒1次子+項 ⇒要素+項 ⇒id+項 ⇒id+項*因子 ⇒id+因子*因子 ⇒…⇒id+id*因子⇒…⇒id+id*id 式 + 項 項 項 * 因 因 因 1 1 1 要 要 要 id id id
ちょっと休憩 (雑談)
言葉の語源 おくび ゲップのこと 江戸患い 脚気のこと 土左衛門 力士の名前から へちま (い)とうり→へちまうり おくび ゲップのこと 江戸患い 脚気のこと 土左衛門 力士の名前から へちま (い)とうり→へちまうり ろくでもない ろく=陸=平坦
休憩おわり
4.3 文脈自由文法の能力 正規表現と文脈自由文法 正規表現で表現可能 ⇒ 文脈自由文法で表現可能 4.3 文脈自由文法の能力 正規表現と文脈自由文法 正規表現で表現可能 ⇒ 文脈自由文法で表現可能 正規表現の方が,理解しやすく,効率のよい処理系を生成しやすい
4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε Sから導出される全ての文は,括弧の釣合がとれている 4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε Sから導出される全ての文は,括弧の釣合がとれている 釣合のとれた括弧のみからなる文字列はすべて,Sから生成可能
4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε Sから導出される全ての文は,括弧の釣合がとれている S ⇒ ε 4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε Sから導出される全ての文は,括弧の釣合がとれている S ⇒ ε S ⇒ ( S ) S ⇒* ( x ) S ⇒* ( x ) y
4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε 釣合のとれた括弧のみからなる文字列はすべて,Sから生成可能 4.3 文脈自由文法の能力 文脈自由文法の例 S → ( S ) S | ε 釣合のとれた括弧のみからなる文字列はすべて,Sから生成可能 長さ0の空列εはSから導出可能 長さ2nの釣合う括弧の列w=( x ) y S ⇒ ( S ) S ⇒* ( x ) S ⇒* ( x ) y
4.3 文脈自由文法の能力 文脈自由でない言語 L1 = {wcw | wは(a|b)*に属する} ただし,a, b, c: 終端記号 4.3 文脈自由文法の能力 文脈自由でない言語 L1 = {wcw | wは(a|b)*に属する} ただし,a, b, c: 終端記号 w: 終端記号列 L1’ = {wcwR | wは(a|b)*に属する} S → a S a | b S b | c
4.3 文脈自由文法の能力 文脈自由でない言語 L2 = {anbmcndm | n>0かつm>0} 4.3 文脈自由文法の能力 文脈自由でない言語 L2 = {anbmcndm | n>0かつm>0} ただし,a, b, c, d: 終端記号 L2’ = {anbmcmdn | n>0かつm>0} S → a S d | b A c A → b A c| bc
4.3 文脈自由文法の能力 文脈自由でない言語 L2 = {anbmcndm | n>0かつm>0} 4.3 文脈自由文法の能力 文脈自由でない言語 L2 = {anbmcndm | n>0かつm>0} ただし,a, b, c, d: 終端記号 L2” = {anbncmdm | n>0かつm>0} S → A B A → a A b| a b B → c B d | c d
4.3 文脈自由文法の能力 文脈自由でない言語 L3 = {anbncn | n>0} ただし,a, b, c: 終端記号 4.3 文脈自由文法の能力 文脈自由でない言語 L3 = {anbncn | n>0} ただし,a, b, c: 終端記号 L3’ = {anbn | n>0} S → a S b | a b