== LL(1) parser == * ì²˜ìŒ í•œ 글ìžë¥¼ ë³´ê³ êµ¬ë¶„í• ìˆ˜ 있어야 함. * LL(1) parserì—서 불가능한 경우 * A ::= AB (left recursiveê°€ ë°œìƒí•˜ê¸° ë•Œë¬¸ì— ì²˜ë¦¬ 불가.) elimination í•„ìš”. * A ::= BC | BD (left common prefix로 첫 글ìžì¸ B하나만으로 ë‘ ê²½ìš°ì˜ êµ¬ë¶„ì´ ë¶ˆê°€.) factorization í•„ìš”. * FIRST(A) : non-terminal Aì˜ ì²« í† í°ì˜ ì§‘í•©. * FOLLOW(A) : non-terminal Aì˜ ë’¤ì— ì˜¬ 수 있는 í† í°ì˜ ì§‘í•©. * LL(1) parserì´ê¸° 위해서는 A ::= B | Cì—서 FIRST(B)와 FIRST(C)ì˜ êµì§‘í•©ì´ ê³µì§‘í•©ì´ì–´ì•¼ 한다. * 만약 FIRST(B)ê°€ empty를 ê°€ì§€ê³ ìžˆì„ ê²½ìš° FOLLOW(A)와 FIRST(C)ì˜ êµì§‘í•©ë„ ê³µì§‘í•©ì´ì–´ì•¼ 한다. * LR parserì—ì„œë„ stackì„ ì‚¬ìš©í–ˆì—ˆëŠ”ë° LL(1) parserì—서 stackì„ ì‚¬ìš©í•˜ëŠ” 것과 비êµí–ˆì„ 때 stackì— ë“¤ì–´ê°€ëŠ” ì •ë³´ì— ì°¨ì´ê°€ 있ìŒ. * LR parserì—서는 ìž…ë ¥ìœ¼ë¡œ 들어온 í† í°ë“¤ì„ stack으로 관리했었는ë°(ì‹¤ì œ ê°’ì¸ 1ì´ë‚˜ + ê°™ì€ê²ƒë“¤) LL(1) parserì˜ tableì€ ì§€ê¸ˆ parsingí•˜ê³ ìž í•˜ëŠ” 심볼(Number나 Factorê°™ì€ê²ƒë“¤)ì´ stackì— ë“¤ì–´ì™€ì•¼ 함. == EBNF == [http://www.aistudy.com/linguistics/chomsky_hierarchy.htm Chomsky Hierarchy ì°¸ê³ ] {{{ < EBNF > Expr ::= Term([+|-] Expr)? Term ::= Factor ([*|/] Term)? Factor :: = (Expr) | Value Value ::= Integer | Double }}} {{{ s : synthesis i : inherit < Synthesis, Inherit > Expr ::= Term (s) expr.isDouble = term.isDouble (i) term.type = if expr.isDouble then double else int Expr1 ::= Term [+-] Expr2 (s) expr1.isDouble = term.isDouble or expr2.isDouble (i) term.type = expr1.isDouble then double else int (i) expr2.type = expr1.isDouble then double else int Factor ::= (Expr) (s) factor.isDouble = expr.isDouble (i) expr.type = factor.isDouble then double else int Factor ::= Value (s) factor.isDouble = value.isDouble (i) value.type = factor.isDouble then double else int Value :: Decimal Integer (s) value.isDouble = false (i) value.type = value.type == double then double else int Value :: Double (s) value.isDouble = true (i) value.type = value.type == double then double else int }}}