14. Memoization Table column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
15. Memoization Table semantic value column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
16. Memoization Table column number column 1 2 3 4 5 6 7 8 Add 7,7 X 4,7 X X Mul 3,5 X 4,7 X X Prim 3,5 X 4,7 X X Dec X 3,5 X 4,7 X X input 2 * ( 3 + 4 )
17.
18.
19. マッチの様子? 1 - 3 - 5 Expr Expr Num input Num Num Expr ← Expr '-' Num / Num Num ← [1-9][0-9]*
20.
21.
22.
23.
24.
25.
26.
27.
28.
29. マッチの様子 ( 再び ) 1 - 3 - 5 Expr (Grow1) Num input Num Num(Seed) Expr (Grow2) Expr Expr ← Expr '-' Num / Num (input: '1-3-5')
30. MemoizationTable の様子 LR ? LR ! Fail 3,2 3,2 seed parse! Expr ← Expr '-' Num / Num Num ← [1-9][0-9]* ; input: '3-4' 4,4 3-4,4 Growing! column 1 2 3 4 Expr Num input 3 - 4
31.
32.
33. Table behavior of parsing Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! キャッシュが見つかってしまう! column 1 2 3 4 X Expr Num input 4 - 3
34.
35.
36.
37.
38. Adding Support for Indirect Left Recursion memo<pair<rule,pos> , pair<LR, optional<svalue>>> struct LR { AST seed; Rule rule Head head; LR * next; }; struct Head { Rule rule; RuleSet involvedSet,evalSet; }
39. Indirect Left Recursion X ← Expr Expr ← X '-' Num / Num (Input: '4-3') LR ? LR ? LR ! Fail 4,2 4,2 4,2 seed parse! [email_address] X,{Expr} 4-3,4 3,4 4-3,4 growing! column 1 2 3 4 X Expr Num input 4 - 3
40.
41. parse_ident(ID, Pos) { Entry * m = MEMO(ID, Pos); if (m==NULL) { MEMO(R, P) = new MEMOENTRY(P, TAG_LR); m->ans = EVAL(R.Body); if (m->lr.detected && ans!=NULL) return GROWLR(R, P, m); else return m; return m; } else { // エントリが見つかった場合 } }