FIRST集合
$ \mathrm{FIRST}(\gamma)は$ \gammaから導出される文字列の先頭になり得る、全ての終端記号の集合
$ \gammaを終端記号と非終端記号の列だとする
$ \epsilonも含まれることがある
引数は非終端記号を考えることが多い
$ Xが終端記号なら$ \mathrm{FIRST}(X)は$ \{X\}なので秒でわかるから
規則の下側から求めていくと良い
定義
$ \mathrm{FIRST}(a)=\{a|a\in T,a\xRightarrow{\ast}a\cdots\}
ただし、$ a\xRightarrow{\ast}\epsilonなら$ \mathrm{FIRST}(a)に$ \epsilonを追加する
記号の意味
$ Tは終端記号
$ \xRightarrow{\ast} は0回以上ステップの導出
$ a\cdotsは$ aから始まる記号列
ex. $ abc
例えば以下のような文法規則を考える(この規則をこのノート内で「規則1」と呼ぶ)
大文字は非終端記号で、小文字は終端記号とする
$ Z → d -- ①
$ Z → X Y Z -- ②
$ Y → c -- ③
$ X → Y -- ④
$ X → a -- ⑤
このとき、$ \gammaを$ X * Yとすると
③④⑤より$ X → c | a
③⑤より$ Y → c
が導かれるので$ \mathrm{FIRST}(X\times Y)=\{a, c\}となる
試す
下にも書いたが、ここで試せる
code:grammar
Z -> d
Z -> X Y Z
Y -> c
X -> Y
X -> a
FIRST集合を求めるアルゴリズム
『(環境)5 プログラミング言語処理系』.icon p.151-参考
FIRSTを手で計算するときは、(略)、開始記号より遠い方から計算するとよい. 『(環境)5 プログラミング言語処理系』.icon p.152
再帰下降構文解析が出来ない例
以下のような生成規則がある時
$ X\rightarrow\gamma_1
$ X\rightarrow\gamma_2
ここである終端記号$ Iが、FIRST($ \gamma_1)にも、FIRST($ \gamma_2)にも入っているとすると、関数$ Xは$ Iを入力されたときに、どちらの規則に従えば良いのか判断ができない
複雑になる例
nullableが絡んでくるとFIRST集合は複雑になる
上述した規則1に以下の規則を足したものを考える
$ Y \rightarrow \epsilon
$ \epsilonは空文字を表す
この時、これと規則1の④よりXも空文字を生成できる
ので、$ \gamma=XYZを考えた時
$ \mathrm{FIRST}(Z)\subset \mathrm{FIRST}(XYZ)になることがわかる
なので、FIRST集合を計算する際は、どの記号がnullableを生成することができるかを覚えておかないといけない
書いてて意味わからんくなったので再度復習したい!!!!!!!!!!!!!!mrsekut.icon
First Follow — Calculator for finding first, follow and predict sets
文法規則からFIRST集合とFOLLOW集合を求めるやつ
参考
『(環境)5 プログラミング言語処理系』