470 likes | 928 Views
構文解析(1). 構文解析 文法規則. 構文解析木. a=bb+34 字句解析 構文解析. Assignment. a. =. bb. +. 34. =. LeftHandSide. Arithmetic_expression. NAME. NAME. INTEGER. term. term. +. primary. primary. NAME. INTEGER. 構文. <Program>::=<Main_function>
E N D
構文解析(1) 構文解析 文法規則
構文解析木 a=bb+34 字句解析 構文解析 Assignment a = bb + 34 = LeftHandSide Arithmetic_expression NAME NAME INTEGER term term + primary primary NAME INTEGER
構文 <Program>::=<Main_function> <Main_function>::= “main” “(“ “)” <Block> <Block>::= “{“ { <Var_decl> } { <Statement> } “}” <Var_decl>::= “int” NAME { “,” NAME } “;” <Statement>::= <Assignment> | “{“ <Statement> “}” | “;” <Assignment>::= <Lefthand_side> “=” <Arithmetic_expression> “;” <Lefthand_side>::= NAME <Arithmetic_expression>::=<Arithmetic_term> { (“+”|”-“) <Arithmetic_term> } <Arithmetic_term>::=<Arithmetic_factor> { (“*”|”/”|”%”) <Arithmetic_factor> } <Arithmetic_factor>::=<Unsigned_factor> | “-“ <Unsigned_factor> <Unsigned_factor>::=NAME | INTEGER | “(“ <Arithmetic_expression> “)”
構文解析(例) bb+34 字句解析 構文解析 Arithmetic_expression bb + 34 + Arithmetic_term Arithmetic_term NAME INTEGER Arithmetic_factor Arithmetic_factor Unsigned_factor Unsigned_factor NAME INTEGER
構文解析の問題点1:左再帰性 例: E ::= E “+” T | T 最左導出を行うと, E→E→E→... となり,停止しない 1.規則の変形(右再帰へ) E ::= TD D ::= “+”TD | ε 2.EBNFを用いる(閉包の利用) E ::= T {“+”T} 中括弧でスター閉包を表す
構文解析の問題点2:バックトラック ルール:E→T”+”T|T”-”T,T→”a” “-“ もあるとき E T T “+” プログラムが複雑 計算時間がかかる “+” と “-” が異なる ⇒ バックトラック 入力= “a” “-” “a”
文法規則を推測する 事例から構文規則を推測する 例: write(a,bc,d); ↓ <WRITE> ::= “write” “(“ NAME { “,” NAME } “)” または <WRITE> ::= “write” “(“ [ EXP ] { “,” EXP } “)” 変数1つは必ず 入れなければならない 式を書いてもよい
プログラム ⇒ 文法規則 proceduremain; var ei,su,go; begin ei := a+70; if ei = su then su := 50*ei else su := 20*ei end . <program> ::= “procedure” “main” “,” <block> “.” <block> ::= <var> “begin” <statement> { “;” <statement> } “end” <var> ::= “var” NAME { “,” NAME } “;” <statement> ::= <assign> | <if> <assign> ::= NAME “:=“ <expression> <if> ::= “if” <bexpression> “then” <statement> “else” <statement>
予測的下降構文解析 • LL構文解析 (Left to right scan & Left most parsing) LL(k)文法ーk個まで先読み可 • LL(1)文法ー1個のみ先読み可 左辺が同じルールが2つ以上あるとき, 1つだけ先読みすればどの右辺を選択すればよいか決定できる. • 左辺が同じルールの右辺の先頭トークン(終端記号)が同じものがない. (注)以後,入力の最後に$があるものとする
例:先頭が異なる終端記号なら(字句解析で決定できるID,CONSTを含む)どの規則を使うか決定できる例:先頭が異なる終端記号なら(字句解析で決定できるID,CONSTを含む)どの規則を使うか決定できる • primary ::= ID | CONST | “(“ expression “)” • state ::= ID “:=“ expression | “if” expression “then” state | “read” “(“ ID “)” 先頭が ID 先頭が CONST 先頭が ID 先頭が ( 先頭が if 先頭が read
先頭が非終端記号 先頭が read 例 A ::= BC | DE B ::= “read” “(“ ID “)” D ::= “write” “(“ ID “)” • First集合=先頭になる可能性のある終端記号の集合 • First(B)={“read”} First(D)={“write”} Firstが異なるので,1トークンの先読みで選択可 • LL(1)の条件=右辺のFirstが異なる 先頭が write
εルール(右辺がεのとき) 先頭 “y” 例 S ::= A “x” A ::= “y” | ε • S => A “x” => “y” “x” (Aの先頭=First) または S => A “x” => “x” (Aの後ろに来るトークン=Follow) 先頭 “x”
First(先頭終端記号集合) • First(α)={a|α=>aβ} ただし,α=>εのときにはεを含む. 例: S ::= b | BC B::=c | ε C::=d First(b)={b} First(ε)={ε} First(C)={d} First(B)={c,ε} *First(CB)=First(C) First(C)がεを含まないとき *First(BC)=First(B)∪First(C)ー{ε} ={c,d} First(B)がεを含むとき First(S)={b}∪First(BC)={b,c,d}
First集合を求めなさい 1.ルール: E→T”+”T|T”-”T,T→”a”|”9” First(“a”)=?,First(T)=?,First(E)=? 2.ルール: E→TD,T→”a”|”9”, D→”+”D|”-”D|ε First(“a”)=?,First(“-”D)=?, First(T)=?,First(D)=?,First(E)=?
★First集合 2.ルール: E→TD,T→”a”|”9”, D→”+”D|”-”D|ε 解答例 First(“a”)={ "a" } ,First(“-”D)={ "-" } First(T)={ "a" , "9" } , First(D)={ "+" , "-" , ε }, First(E)=First(T)={ "a" , "9" }
Follow(後ろに現れる終端記号集合) • Follow(A)={b|S=>αAbγ} 例: S ::= b | BC B::=c | ε C::=d Follow(S)={$} (注)入力の最後に$があるものとする. Follow(C)={$} Follow(B)=First(C)={d}
Director(あるルールを適用したときの,先頭終端記号集合)Director(あるルールを適用したときの,先頭終端記号集合) • ルールがA::=αであるとする. • First(α)がεを含まないとき, Director(A,α)=First(α) • First(α)がεを含むとき, Director(A,α)=First(α)∪Follow(A)-{ε} 例:S ::= b | BC B::=c | ε C::=d Director(S,b)={b} Director(S,BC)={c,d} Director(B,c)={c}Director(B,ε)=Follow(B)={d}
Director集合を求めなさい 1.ルール: E→T”+”T|T”-”T,T→”a”|”9” Director(T,”a”)=?,Director(T,”9”)=?, Director(E,T”+”T)=?,Director(E,T”-”+T)=? 2.ルール:E→TD"$",T→”a”|”9”, D→”+”D|”-”D|ε Director(T,”a”)=?,Director(T,”9”)=?, Director(D,”+”D)=?,Director(D,“-”D)=?, Director(D,ε)=?,Director(E,TD)=?
★Director集合 2.ルール:E→TD"$",T→”a”|”9”, D→”+”D|”-”D|ε Director(T,”a”)={ "a" }, Director(T,”9”)={ "9" }, Director(D,”+”D)={ "+" }, Director(D,“-”D)={ "-" } Director(D,ε)=FOLLOW(D)={ "$" } Director(E,TD)=First(T)={ "a" , "9" }
LL(1)文法 トークンを一つ先読みすれば,バックトラックなしで構文解析できる. ↓ 次のトークンによって,どのルールを使えばよいか決まる. ↓ あるルールの先頭に来る可能性のあるトークンの集まり=FIRST集合とすると, 選択可能なルールではFIRST集合に交わりがない(共通集合がない)
LL(1)でない <logical_factor>::=<name> “==”<name> <logical_factor>::=<name> “<”<name> <logical_factor>::=<name> “>”<name> a<b 1<name>"==" 一致しないバックトラック a"<" 2 <name>"<" 一致=解析を進める <name>"<"
LL(1)である ルールを一つにまとめれば,ルールの中の選択に変わり,バックトラックがなくなる <logical_factor>::=<name> ("=="|"<"|">")<name> a>b <name>"<"をルールの中で選択=バックトラックなし a"<"
LL(1)である • <S>::=<E>"$" • <E>::=<T><D> • <D>::="+"<T><D>|"-"<T><D>|ε • <T>::=NAME • Director(<D>,"+"<T><D>)={"+"} • Dircetor(<D>,"-"<T><D>)={"-"} • Director(<D>,ε)={"$"} • Director(<D>,?)は互いに素である →LL(1)である
LL(1)でない • <S>::=<E>"$" • <E>::=<T>"+"<T>|<T>"-"<T> • <T>::=NAME • Director(<D>,<T>"+"<T>)={NAME} • Dircetor(<D>,<T>"-"<T>)={NAME} • Director(<D>,?)は互いに素でない →LL(1)でない
最左導出 • ルール:E→T”+”T,T→”a” E T T “+” “a” “a” 入力= “a” “+” “a”
バックトラック • ルール:E→T”+”T|T”-”T,T→”a” “-“ もあるとき E T T “+” “+” と “-” が異なる ⇒ バックトラック 入力= “a” “-” “a”
先読み:バックトラックをなくす • ルール:E→TD ,D→”+”T|”-”T,T→”a” E 左辺が同じ=> 右辺の一番左が異なる T D T “-” 入力の“-”を見て(先読みし) D → “-” T を選択 入力= “a” “-” “a”
左括り出し:バックトラックをなくす • <IF>→”if” “(“ <LE> “)” <STATE> <LE>→<AE> | <AE> “<” <AE> | <AE> “>” <AE> 左括り出し ↓ • <LE> →<AE> <D> <D> → ε | “<“<AE> | “>”<AE> First=右辺の一番左の終端記号 First(ε)={ε} First(“<“<AE>)={”<“} First(“>”<AE>)={”>”}
課題4.2:左括りだし 1.<Var_decl>::=NAME | NAME"="INTEGER 2.<factor>::=NAME | NAME"[" <Expression>| NAME"--"| NAME"++" 3.<Expression>::=<Exp>| <Exp> "=" <Expression>
★ 左括りだし 3.<Expression>::=<Exp>| <Exp> "=" <Expression> 解答例: <Expression>::=<Exp>["="<Expression>]
LL(1)である • <S>::=<E>”$”, • <E>::=<T><D> • <D>::=”+”<T><D>|"-"<T><D>|ε • <T>::=NAME • Director(<D>,"+"<T><D>)={"+"} • Director(<D>,"-"<T><D>)={"-"} • Director(<D>,ε)={$"} • Director(<D>,?)は互いに素である →LL(1)である
LL(1)でない • <S>::=<E>”$”, • <E>::=<T>”+”<T>| <T>"-"<T> • <T>::=NAME • Director(<E>,<T>"+"<T>)={NAME} • Director(<E>,<T>"-"<T>)={NAME} • Director(<E>,?)は互いに素でない →LL(1)でない
一つ先読み:LL(1)構文解析 • ルール: 1)E→TD 2)D→+TD 3)D→ε 4)T→FX 5)X→*FX 6)X→ε 7)F→x 8)F→y 9)F→3 10)F→7 • 被解析文:y+3*7 • 過程:E→TD→FXD→yXD→yεD(=yD) →y+TD→y+FXD→y+3XD→y+3*FXD →y+3*7XD→y+3*7εD(=y+3*7D) →y+3*7ε(=y+3*7:終了)
★LL(1)構文解析過程 ルール: 1)E→TD 2)D→+TD 3)D→ε 4)T→FX 5)X→*FX 6)X→ε 7)F→x 8)F→y 9)F→3 10)F→7 被解析文: x*y+y*3 解答例:E → TD → FXD → xXD → x*FXD → x*yXD → x*yεD=x*yD → x*y+TD → x*y+FXD → x*y+yXD → x*y+y*FXD → x*y+y*3XD → x*y+y*3εD=x*y+y*3D → x*y+y*3ε=x*y+y*3 => 受理
同じ意味のルールを求めなさい 1.<Exp>::=<Term><R> <R>::="+"<Term><R>|ε 2.<Term>::=<Factor>{"*" <Factor> }
★ 同じ意味のルール 1.<Exp>::= <Term> <R> <R>::="+" <Term> <R> | ε 解答例: <R>::="+"<Term><R> → {"+"<Term>}<R> →{"+"<Term>}ε={"+"<Term>} <Exp>::=<Term>{"+"<Term>}
学生番号をマーク 自己責任 例:09-1-037-0543 ⇒ ⑨-⑤④③ 学生番号の上から2桁目 → 0123456 7 8 ⑨ 学生番号の下から3桁目 → 01234⑤6789 学生番号の下から2桁目 → 0123④56789 学生番号の下から1桁目 → 012③456789 学生番号 09-1-037-543 氏名:??? ???
--- 解答欄 --- 問4.112345 6 問4.2 12345 6 問4.3 12345 6 問4.4 12345 6 問4.5 12345 6
First集合を求めなさい ルール: E→TD,T→”a”|”9”, D→”+”D|”-”D|ε ① First(D)={"+" , "-"} ② First(D)={"a" , "9"} ③ First(D)={"+" , "-" , ε} ④ First(D)={"+" , "-"} ⑤ First(D)={"+" , "9" , ε} ⑥正解なし
Director集合を求めなさい ルール:E→TD"$",T→”a”|”9”, D→”+”D|”-”D|ε ① Director(D,"+"D)={"+" , "-"} ② Director(D,"+"D)={"+" , ε} ③ Director(D,"+"D)={"+"} ④ Director(D,"-"D)={"+","-", ε} ⑤ Director(D,"-"D)={"-","a","9"} ⑥正解なし
左括り出し <Var_decl>::=NAME | NAME"="INTEGER ① <Var_decl> ::= NAME | "=" INTEGER ② <Var_decl> ::= NAME "=" [ INTEGER ] ③ <Var_decl> ::= NAME { "=" INTEGER } ④ <Var_decl> ::= NAME [ "=" INTEGER ] ⑤ <Var_decl> ::= NAME [ = INTEGER ] ⑥正解なし
LL(1)構文解析過程 ルール: 1)E→TD 2)D→+TD 3)D→ε 4)T→FX 5)X→*FX 6)X→ε 7)F→x 8)F→y 9)F→3 10)F→7 被解析文: x*y+3 E→TD→FXD→xXD→? ① xεD ② x*FXD ③ *FXXD ④ x+TDD ⑤ x*yD ⑥正解なし
同じ意味のルールを求めなさい <Term>::=<Factor><R> <R>::="*"<Factor><R>|ε ① <Term>::=<Factor>["*"<Factor>] ② <Term>::=<Factor>["*"<Factor><R>] ③ <Term>::=<Factor>"*"<Factor> ④ <Term>::=<Factor>{"*"<Factor>} ⑤ <Factor>::=<Factor>{"*"<Factor>} ⑥正解なし