1 / 45

構文解析(1)

構文解析(1). 構文解析 文法規則. 構文解析木. a=bb+34        字句解析        構文解析. Assignment. a. =. bb. +. 34. =. LeftHandSide. Arithmetic_expression. NAME. NAME. INTEGER. term. term. +. primary. primary. NAME. INTEGER. 構文. <Program>::=<Main_function>

umika
Download Presentation

構文解析(1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 構文解析(1) 構文解析 文法規則

  2. 構文解析木 a=bb+34        字句解析        構文解析 Assignment a = bb + 34 = LeftHandSide Arithmetic_expression NAME NAME INTEGER term term + primary primary NAME INTEGER

  3. 構文 <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> “)”

  4. 構文解析(例) bb+34        字句解析      構文解析 Arithmetic_expression bb + 34 + Arithmetic_term Arithmetic_term NAME INTEGER Arithmetic_factor Arithmetic_factor Unsigned_factor Unsigned_factor NAME INTEGER

  5. 構文解析の問題点1:左再帰性 例: E ::= E “+” T | T   最左導出を行うと, E→E→E→... となり,停止しない 1.規則の変形(右再帰へ) E ::= TD D ::= “+”TD | ε 2.EBNFを用いる(閉包の利用) E ::= T {“+”T} 中括弧でスター閉包を表す

  6. 構文解析の問題点2:バックトラック ルール:E→T”+”T|T”-”T,T→”a” “-“ もあるとき E T T “+” プログラムが複雑 計算時間がかかる “+” と “-” が異なる ⇒ バックトラック 入力=    “a”      “-”       “a”

  7. 文法規則を推測する 事例から構文規則を推測する 例: write(a,bc,d);   ↓ <WRITE> ::=  “write” “(“ NAME { “,” NAME } “)” または <WRITE> ::=  “write” “(“ [ EXP ] { “,” EXP } “)” 変数1つは必ず 入れなければならない 式を書いてもよい

  8. プログラム ⇒ 文法規則 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>

  9. 予測的下降構文解析 • LL構文解析   (Left to right scan & Left most parsing) LL(k)文法ーk個まで先読み可 • LL(1)文法ー1個のみ先読み可    左辺が同じルールが2つ以上あるとき,   1つだけ先読みすればどの右辺を選択すればよいか決定できる. • 左辺が同じルールの右辺の先頭トークン(終端記号)が同じものがない. (注)以後,入力の最後に$があるものとする

  10. 例:先頭が異なる終端記号なら(字句解析で決定できるID,CONSTを含む)どの規則を使うか決定できる例:先頭が異なる終端記号なら(字句解析で決定できるID,CONSTを含む)どの規則を使うか決定できる • primary ::= ID | CONST |   “(“ expression “)” • state ::= ID “:=“ expression |   “if” expression “then” state |    “read” “(“ ID “)” 先頭が ID 先頭が CONST 先頭が ID 先頭が ( 先頭が if 先頭が read

  11. 先頭が非終端記号 先頭が read 例    A ::= BC | DE B ::= “read” “(“ ID “)” D ::= “write” “(“ ID “)” • First集合=先頭になる可能性のある終端記号の集合 • First(B)={“read”} First(D)={“write”} Firstが異なるので,1トークンの先読みで選択可 • LL(1)の条件=右辺のFirstが異なる 先頭が write

  12. εルール(右辺がεのとき) 先頭 “y” 例    S ::= A “x” A ::= “y” | ε • S => A “x” => “y” “x” (Aの先頭=First)   または S => A “x” => “x” (Aの後ろに来るトークン=Follow) 先頭 “x”

  13. 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}

  14. 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)=?

  15. ★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" }

  16. Follow(後ろに現れる終端記号集合) • Follow(A)={b|S=>αAbγ} 例: S ::= b | BC B::=c | ε C::=d Follow(S)={$} (注)入力の最後に$があるものとする. Follow(C)={$} Follow(B)=First(C)={d}

  17. 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}

  18. 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)=?

  19. ★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" }

  20. LL(1)文法 トークンを一つ先読みすれば,バックトラックなしで構文解析できる.        ↓ 次のトークンによって,どのルールを使えばよいか決まる.        ↓ あるルールの先頭に来る可能性のあるトークンの集まり=FIRST集合とすると,   選択可能なルールではFIRST集合に交わりがない(共通集合がない)

  21. LL(1)でない <logical_factor>::=<name> “==”<name> <logical_factor>::=<name> “<”<name> <logical_factor>::=<name> “>”<name> a<b 1<name>"=="  一致しないバックトラック a"<"  2 <name>"<"  一致=解析を進める <name>"<"

  22. LL(1)である ルールを一つにまとめれば,ルールの中の選択に変わり,バックトラックがなくなる <logical_factor>::=<name> ("=="|"<"|">")<name> a>b <name>"<"をルールの中で選択=バックトラックなし a"<"

  23. 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)である

  24. 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)でない

  25. 最左導出 • ルール:E→T”+”T,T→”a” E T T “+” “a” “a” 入力=     “a”      “+”       “a”

  26. バックトラック • ルール:E→T”+”T|T”-”T,T→”a” “-“ もあるとき E T T “+” “+” と “-” が異なる ⇒ バックトラック 入力=    “a”      “-”       “a”

  27. 先読み:バックトラックをなくす • ルール:E→TD ,D→”+”T|”-”T,T→”a” E 左辺が同じ=> 右辺の一番左が異なる T D T “-” 入力の“-”を見て(先読みし) D → “-” T を選択 入力=    “a”      “-”       “a”

  28. 左括り出し:バックトラックをなくす • <IF>→”if” “(“ <LE> “)” <STATE>    <LE>→<AE> |          <AE> “<” <AE> |          <AE> “>” <AE> 左括り出し ↓ • <LE> →<AE> <D>   <D> → ε |           “<“<AE> |           “>”<AE> First=右辺の一番左の終端記号 First(ε)={ε} First(“<“<AE>)={”<“} First(“>”<AE>)={”>”}

  29. 課題4.2:左括りだし 1.<Var_decl>::=NAME | NAME"="INTEGER 2.<factor>::=NAME | NAME"[" <Expression>| NAME"--"| NAME"++" 3.<Expression>::=<Exp>|               <Exp> "=" <Expression>

  30. ★ 左括りだし 3.<Expression>::=<Exp>|               <Exp> "=" <Expression> 解答例: <Expression>::=<Exp>["="<Expression>]

  31. 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)である

  32. 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)でない

  33. 一つ先読み: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:終了)

  34. ★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  => 受理

  35. 同じ意味のルールを求めなさい 1.<Exp>::=<Term><R>   <R>::="+"<Term><R>|ε 2.<Term>::=<Factor>{"*" <Factor> }

  36. ★ 同じ意味のルール 1.<Exp>::= <Term> <R>   <R>::="+" <Term> <R> | ε 解答例: <R>::="+"<Term><R> → {"+"<Term>}<R>     →{"+"<Term>}ε={"+"<Term>} <Exp>::=<Term>{"+"<Term>}

  37. 小テスト 解答方法

  38. 学生番号をマーク    自己責任    例:09-1-037-0543  ⇒  ⑨-⑤④③   学生番号の上から2桁目 → 0123456 7 8 ⑨   学生番号の下から3桁目 → 01234⑤6789   学生番号の下から2桁目 → 0123④56789   学生番号の下から1桁目 → 012③456789   学生番号 09-1-037-543 氏名:???  ???

  39. --- 解答欄 ---   問4.112345 6   問4.2  12345 6   問4.3  12345 6   問4.4  12345 6   問4.5  12345 6

  40. 小テスト

  41. First集合を求めなさい   ルール: E→TD,T→”a”|”9”, D→”+”D|”-”D|ε  ① First(D)={"+" , "-"}  ② First(D)={"a" , "9"}  ③ First(D)={"+" , "-" , ε}  ④ First(D)={"+" , "-"}  ⑤ First(D)={"+" , "9" , ε}  ⑥正解なし

  42. 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"} ⑥正解なし

  43. 左括り出し <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 ]  ⑥正解なし

  44. 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                        ⑥正解なし

  45. 同じ意味のルールを求めなさい   <Term>::=<Factor><R>   <R>::="*"<Factor><R>|ε  ① <Term>::=<Factor>["*"<Factor>]  ② <Term>::=<Factor>["*"<Factor><R>]  ③ <Term>::=<Factor>"*"<Factor>  ④ <Term>::=<Factor>{"*"<Factor>}  ⑤ <Factor>::=<Factor>{"*"<Factor>}  ⑥正解なし

More Related