文脈自由文法とは
文脈自由文法 (Context FreeGrammar) は、次によって定義される形式文法である
● 終端記号: VT
● 非終端記号: VN
● 開始記号: S
● 生成規則: A → α の集合
A は非終端記号。α は、終端記号および非終端記号からなる記号列
文脈自由文法によって生成される言語を、文脈自由言語という
8
9.
文脈自由文法の例 (1)
アルファベット {a,b } 上での正則表現を表す文脈自由文法は次のように表せる
VT
={ a,b,Φ,+,*,(,) }
VN
= { E }
E → a | b | Φ | E E | E + E | E * | ( E )
開始記号: E
9
10.
文脈自由文法の例 (2)
簡単な数式の文法を定義する文脈自由文法は次のように表せる
VT
= {NUM, IDENT, PLUS, MINUS }
VN
= { Expr, Op, Term }
Expr → Expr Op Expr | LPR Expr RPR | Term
Op → PLUS | MINUS | ASTERISK | SLASH
Term → NUM | IDENT
開始記号: Expr
10
文脈自由言語の所属判定問題
ある記号列 x1
x2
...xn
が、文脈自由言語 Lに所属するかどうかの判定を、
所属判定問題 (decision problem) と呼ぶ
例
アルファベット { a,b } 上の記号列 baaba は次の生成規則の言語 L に所属するだろ
うか?
S → AB | BC
A → BA | a
B → CC | b
C → AB | a Introduction to Automata Theory, Languages, and Computation
Example 7.34 (P.306) より引用
13
CYK 法の例
baaba
S →AB | BC
A → BA | a
B → CC | b
C → AB | a
S,A,C
∅
∅
S,A
B
S,A,C
B
B
A,C
B
S,C
A,C
S,A
B A,C
b a a b a
Introduction to Automata Theory, Languages, and Computation
Example 7.34 (P.306) より引用
開始記号を含んでいれば
導出が可能表
を
埋
め
る
方
向
15
文脈自由言語 L について、ある数N が存在して、L に属する長さ N 以上の記号列 z
に対して、次のような条件をみたす x = uvwxy という分解が存在する
● 1 ≤ |vx|
● |vwx| ≤ N
● 任意の整数 i ≥ 0 について uvi
wxi
y ∈ L
証明の方針
文脈自由文法は Chomsky 標準形で表すことができた。L を表す Chomsky 標準形の
CFG を (VT
,VN
,S,P) とし、N=|V| として 2N
以上の長さの L の記号列 x の導出木を
考える。この時、導出木は二分木であり、深さは N + 1 以上であるから根までのパスに
同じ非終端記号がある。残りは正則言語の反復補題と同様
文脈自由文法の反復補題
20
LL(1) 文法か否かの判定
ある CFGの任意の非終端記号 N の生成規則 N → α1
| α2
| … | αn
について
1 ≤ i < j ≤ n のとき
Director(N,αi
) ∩ Director(N,αj
) = ∅
であれば、その文法は LL(1) 文法である。すなわち、1 つ次のトークンを読めば、どの
生成規則を用いれば良いかが確定する
28
29.
上向き構文解析法
入力された記号列について、1 文字ずつ読み (Shift)ながら生成規則をたどり、非終端
記号に還元 (Reduce) していく方式。最終的に開始記号までたどり着けるように還元を
行う
E → E + T | T
T → T * F | F
F → (E) | i
T F*
E
i + (i* i
F F F
E + ( F これから読む部分
+ i ) * i
左から右への走査
29
30.
LR 構文解析法
LR 構文解析法では、次に読む文字と還元できる生成規則とを同時に管理する
●左から右への走査 (Left-to-Right scanning)
● 左端導出 (Rightmost derivation)
コンパイラの構成と最適化
文法 G1 (P.93) より引用
E → E + T
E → T
T → T * F
T → F
F → (E)
F → i
S → E $
E → E + T
E → T
T → T * F
T → F
F → (E)
F → i
S → ● E $
E → ● E + T
E → ● T
T → ● T * F
T → ● F
F → ● (E)
F → ● i
便宜上
開始記号を
新たに作る シフト位置
を記載した
マークを
付与する
30
31.
LR 構文解析法
1. 開始の生成規則S → E $ を便宜上加え、$ を入力の最後に読み取ることとする
2. シフト位置を ● 記号にて示す。最初にS → ● E $ として、非終端記号をすべて展開しながら(た
とえば E → ● E + T を加える)、次に読み取る記号についての閉包(Closure) を作成する
3. シフト位置の次にある記号すべてについて、読み取ったあとの状態から、ふたたび閉包を作成
する。既存の閉包と同じ状態になった場合は同一としてみなす
4. 閉包それぞれをオートマトンの状態として定義し、読み取るべき文字を遷移規則とする
5. スタックを用意し、開始状態から記号を一つずつ読んでいきシフトした場合にはスタックへプッ
シュ、還元する場合にはスタックからポップする
31
32.
S → E$ ●
S → ● E $
E → ● E + T
E → ● T
T → ● T * F
T → ● F
F → ● ( E )
F → ● i
E
T
F
(
i
$
+
T
*
F
)
+
(
(
i
F
*
TF
E
i
F → i ● #
T → F ● #
E → T ● #
T → T ● * F
S → E ● $
E → E ● + T
F → ( E ● )
E → E ● + T
E → E + ● T
T → ● T * F
T → ● F
F → ● ( E )
F → ● i
T → T * ● F
F → ● ( E )
F → ● i
T → T * F ● #
F → ( E ) ● #
E → E + T ● #
T → T ● * F
● は読み取り位置の記号
# は次に還元することを示す
(
F → ( ● E )
E → ● E + T
E → ● T
T → ● T * F
T → ● F
F → ● ( E )
F → ● i
i
32
33.
コンフリクト
場合によっては、次の記号を読み取るべきか還元すべきか定まらない場合がある (Shift
/ Reduceコンフリクト)。また、還元すべきルールが複数ある場合もある (Reduce /
Reduce コンフリクト)
このような場合の先読みの方法に応じて、複数の手法がある (詳細は触れない)
● SLR(1) … 還元の際に 1 文字先読み
● LR(1) … 生成規則の Follow で 1 文字先読み
● LALR(1) … LR(1) の状態数圧縮
E → T ● #
T → T ● * F
33
[課題] 文法の定義
以下に示すような論理演算、整数演算が可能な文法定義をせよ。
V →true | false
V → 整数値 (-1000 から 1000 まで)
E → V | (E) |
E + E | E - E | E * E | E / E |
E & E | E | E | E = E | E <> E
Cond → if E then E else E
43