コンパイラ(9) 情報工学科5年 担当 河田 進
LR構文解析 1.コンパイラ(構文解析譜)の状態 ○今構文解析がどこまで進んでいるか ○今どの生成規則についての解析を行っているか 2.1つの規則についての状態 ●A→xyzについて考える ○解析を始める前 A→・xyz(LR(0)項と呼ぶ) ○xの受理が終わり,これからyを受理しようとしている状 態 A→x・yz ○xyの受理が終わり,これからzを受理しようとしている 状態 A→xy・z ○xyzの受理が終わり(ハンドルxyzが見つかった)A に還元を行う状態 A→xyz・# (#は還元を行う印。#という記号があるわけではない)
LR構文解析 3.xyzの記号の種類 ●A→aBb B→c について考える ○解析を始める前 A→・aBc ●A→aBb B→c について考える ○解析を始める前 A→・aBc 次の動作はaの受理:入力残の先頭とVtであるaが一致 するかどうか調べる ○aの受理が終わり,VnであるBから生成可能な記号列を 調べる開始状態 A→a・Bb 且つ B→・c ○cの受理が終わった状態 B→c・# ハンドルcが見つかったのでcをBに還元する その結果 A→aB・b を含む状態へ移る ○bの受理が終わった状態 A→aBb・# ハンドルaBbが見つかったのでaBbをAに還元し,何 処かにあるX→α・Aβを含む状態からX→αA・βを含 む状態へ移る
LR構文解析 4.生成規則から状態を求める P={ S’→S┤ S→Sa|ABc A→bAc|d B→aB|ε } P={ S’→S┤ S→Sa|ABc A→bAc|d B→aB|ε } ○1つの状態は複数のLR(0)項の集合 構文解析開始状態(I0) (0) (1) (2) I0={ S’→・S┤ S→・Sa S→・ABc (3) (4) A→・bAc A→ ・d } (0)の・Sから(1)(2)であることが分かる (1)の・Sから再度(1)(2)(増えない) (2)の・Aから(3)(4)であることが分かる
LR構文解析 4.状態I0から分かること I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } ○最初に受理可能なVtはbまたはd ○LR系構文解析は上向き構文解析の1つ(ハンドルを 見つけてVnに還元していく) ○LL(1)のように次に受理すべきVtが何か類推で きる
LR構文解析 5.状態I0から別の状態への移行 I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } ○I0の・の後ろにあるVtを受理,または還元によるVnの生成によ り他の状態へ移る(LR(0)項の・を1つ右へ移動) S I0->I1={ S’→S・┤ S→S・a } ◎・の後ろにVnが無いためこの2個だけ ◎次は┤またはaを受理(入力残の先頭記号で決まる) A I0->I2={ S→A・Bc B→・aB B→ ε・# } ◎B→・εというLR(0)項は存在しない。何も無いものを受理 する前ということは考えられない。 ◎次はaを受理するか,ハンドルεをBに還元するかを決めなけれ ばならない(不都合な状態)
LR構文解析 5.状態I0から別の状態への移行 I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } b I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } b I0->I3={ A→b・Ac A→・bAc A→ ・d} ◎次はbまたはdを受理(入力残の先頭記号で決まる) d I0->I4={ A→ d・# } ◎次はdをAに還元し,I4へ遷移する前のI0へ戻り A I0->I2によりI2へ移る
LR構文解析 6.状態の集合全体 P={ S’→S┤ S→Sa|ABc A→bAc|d B→aB|ε } P={ S’→S┤ S→Sa|ABc A→bAc|d B→aB|ε } I0={ S’→・S┤ S→・Sa S→・ABc A→・bAc A→ ・d } S A I0->I1={S’→S・┤ S→S・a}I0->I2={S→A・Bc B→・aB B→ ε・#} b d I0->I3={A→b・Ac A→・bAc A→ ・d} I0->I4={A→ d・#} ┤ a B I1->I5={S’→S┤・#} I1->I6={S→Sa・#} I2->I7={S→AB・c} a A I2->I8={B→a・B B→・aB B→ ε・#} I3->I9={A→bA・c} b d c B I3->I3 I3->I4 I7->I10={S→ABc・#} I8->I11={B→aB・#} a c I8->I8 I9->I12={A→bAc・#}
LR構文解析 7.不都合な状態 ○1つの状態にX→αa・bβ(次にbを受理する遷移) Y→γa・#(γaをYに還元しIjへ移動する) 理由 Ii∋{ Z→δ・Yη Y→・γa } Y Ii->Ij ∋{ Z→δY・η } どちらの動作を行うかを決めなければならないので不都合 ●1つの状態に複数の遷移が存在しても,入力残の先頭記号でどちらの 遷移をするかが決まるので不都合ではない ○1つの状態に複数の還元が存在する場合 どちらの還元を行うか決めなければならないので不都合 ○不都合な状態において動作を決定する方法の違いにより解析法の名前 が異なる(SLR(1),LALR(1)、LR(1)) ●(1)の1は手掛かりとして,これからに受理可能な記号列の長さを 1(つまり次に受理可能なVt)とすることを意味している
LR構文解析 状態集合練習 P={ S’→S┤ S→AbS|aBc A→cAB|b|ε B→Bd|b }