コンパイラ 2011 年 10 月 24 日
DESCRIPTION
コンパイラ 2011 年 10 月 24 日. 酒居敬一@A468 ( [email protected] ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2011/index.html. 構文解析. 前回の内容 下向き構文解析法 左再帰性の問題と、その除去 バックトラックの問題 今回の内容 LL (k) 構文解析法。 動機付けとして、下向き構文解析におけるバックトラックをなくしたい。 - PowerPoint PPT PresentationTRANSCRIPT
コンパイラ2011年 10月 24日
酒居敬一@A468 ([email protected])
http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2011/index.html
1
構文解析 前回の内容
下向き構文解析法 左再帰性の問題と、その除去 バックトラックの問題
今回の内容 LL (k) 構文解析法。
動機付けとして、下向き構文解析におけるバックトラックをなくしたい。
LLは Left to right scan, Left most derivation より。 k個の字句を先読みすることでバックトラックなし構文解析を実
現する。 LL(1) 構文解析法
字句をひとつだけ先読みすることで、決定的に構文解析可能。
2
LL構文解析 下向き構文解析では、解析木を根から生成する。
根にある非終端記号(=字句の列の先頭)がどの生成規則に適合するか、それが初めにわかればバックトラック不要。 の例では、 α と β のどちらかを一意に決めたい、ということ
。 字句をひとつ読んだとき、それが生成規則を決める
手がかりであるかどうかがわかればよい??? 入力記号 a が α の先頭記号になりうるか?
そしてバックトラック不要にするために、 β の先頭記号ではないこと。 入力記号 a がAの直後の終端記号になりうるか?
入力記号 a が α の先頭記号でなければ、 の場合。 そこで、 First 集合、 Follow 集合というものを考えることにする
。 このような a を含む集合を Director 集合という。
3
β|αA
εαA
First集合
α の先頭記号になりうる入力記号を First(α) とする。 同様に First(β) も考える。
First(α)∩First(β) = φ ならば、入力記号によりα か β を一意に決定できる。
ただし、 ε に展開してもいいかどうか一意に決定できないので、そういうときは後述の Follow 集合とともに決定する。
4
β|αA
εαA
とする。αFirstεならばεαただし、
aαT,a|aαFirst
First集合を求めるアルゴリズム α , β を記号列、A,Yを非終端記号、aを終端記号
とする。 α が空列記号( ε )のとき: First(α) に ε を加える。 α が終端記号aのとき: First(α) にaを加える。 α が非終端記号Aのとき:Aを左辺に持つすべての
生成規則A→ β について First(β) を求め、その要素をFirst(α) に加える。
α が長さ2以上の記号列( α =Y β )のとき
5
を加える。とに
を加える。に
FirstYFirstFirst
else
YFirstFirst
YFirstif
Follow集合 という生成規則からはAを ε に展開してもよい
。 このときは、 でもある。しかし、 ε は字句ではない。 入力からは、前ページのようには、一意に決定できない。
そこで Follow(A) という集合を考える。 これはAの直後の終端記号に成りうる記号の集合。
ならば α に展開できた。ところが、 a が First 集合に含まれず である場合でも であれば、ここは α に展開できる。つまり という生成規則に一意に決定できるということ。
6
εαA
First
AaST,a|aAFollow
Firsta
AFollowa
First
εαA
Follow集合を求めるアルゴリズム Sを開始記号、 α , β を記号列、A, B を非終端記号
、aを終端記号、$を入力の最後を表す特殊な記号とする。
1.Sが開始記号のとき: Follow( S ) に$を加える。2.A→ αBβ なる生成規則のとき:
Follow(B) に First(β) ー{ ε }を加える。3.A→ αBβ なる生成規則において、
First(β) に ε が含まれているとき: Follow(B) に Follow(A) を加える。
7
Director集合 First 集合と Follow 集合を合わせて、Aを α に展開す
べきかどうかを決定するための集合を Director 集合として定義する。
8
文法である。1LL、βとα
にも入っていたら、βA,DirectorにもαA,Directorがa
AFollowaかつεαまたはαFirstaT,a|aαA,Director
。を次のように定義するαA,Director
があるとき、αAに対して、生成規則NAと非終端記号TNα記号列 *
したものがそのようなものをなくかが決まらない。のどちらへ展開すべき
号ところで、同じ入力記
LL(1)文法 LL(1) 文法の定義
先頭の字句をひとつ読めば展開すべき生成規則が一意に決まるということを意味している。そのような文法を LL(1) 文法といっている。
9
文法であるという。ならば、文法Gは
に対して
する任意の生成規則与えられた文法Gに対
1LL
,A,DirectorA,Director
|||A
ji
21
jiwhere
n
再帰的下向き構文解析1 LL(1) 文法であれば、バックトラックしない
再帰的下向き構文解析器が作成できる。
しかしながら、この文法G1では、左再帰性をもつため、このままでは再帰的下向き構文解析ができない。
10
【文法G1】
(1)式 → 式+項
(2)式 → 項
(3)項 → 項*因子
(4)項 → 因子
(5)因子 → (式)
(6)因子 → i
再帰的下向き構文解析2 左再帰性を除去した文法G2
正規右辺文法もしくは拡張BNFによる文法G3
11
【文法G2】
(1)式 → 項 式端
(2)式端 → +項 式端| ε
(3)項 → 因子 項端
(4)項端 → *因子 項端| ε
(5)因子 → (式)|i
【文法G3】
(1)式 → 項 {+項}
(2)項 → 因子 {*因子}
(3)因子 → (式)|i
形式言語による言語と文法の定義1 アルファベット
空でない有限集合。 ABC…Zのような英語のアルファベットと混同しないように。
文字・記号 アルファベットの要素。
語・文字列・記号列 アルファベットの要素を有限個並べたもの。
空語・空文字列・空記号列 アルファベットの要素をひとつも含まないもの。 ε で表す
。 語彙
生成規則に現れる記号(全部)の集合。
12
形式言語による言語と文法の定義2 四つ組G=(N,T,P,S)を文法という。
N,T,Pは空ではない有限集合。 N,T,P の要素はそれぞれ非終端記号,終端記号,生成規
則。 NとTに共通部分はない。 Pの要素(生成規則)は「左辺→右辺」の形をとる。
左辺と右辺は(N∪T)*の要素とする。 開始記号SはS∈Nとする。
文法G上の言語L(G)とは、 開始記号Sから出発し、生成規則(Pの要素)を有限回
適用して得られた、終端記号列(文)の集合。
13
である。を文という。ならばで
を文形式という。ならばで
xS|TxGLxxSTx
xxSTNx
形式言語による言語と文法の定義3 句構造文法
1950 年代後半に言語学者チョムスキーによって考案された。
タイプ0(制限なし) タイプ1(文脈依存文法)
アセンブリ言語はこのタイプ。 タイプ 2(文脈自由文法)
生成規則の左辺がひとつの非終端記号だけからなる。 C言語や Java など高級言語はたいていこのタイプ。
タイプ3(正規文法)
14
予習・復習 C言語では次のような宣言もしくは定義ができる。
複雑な宣言や定義をそのまま書くと複雑で読みにくいので、通常は typedef を使って段階的に宣言や定義する。
これらの文に対応する生成規則を考えてみよう!
15
int *f(); /* f は int へのポインタを返す関数 */int (*f)(); /* f は int を返す関数へのポインタ */
char **argv; /* char へのポインタのポインタ */int (*daytab)[13]; /* daytab は int を要素とする要素数 13 の配列へのポインタ */int *daytab[13]; /* daytab は int へのポインタを要素とする要素数 13 の配列 */
char (*(*x())[])(); /* x は char を返す関数へのポインタの配列へのポインタを返す関数 */char (*(*x[3])())[5];/* x は char を要素とする要素数5の配列へのポインタを返す関数
へのポインタを要素とする要素数3の配列 */
出典 : " プログラミング言語C 第2版 ", 共立出版 , 149 ページ , 2001 年 .