Bottom-up parsing Goal of parser : build a derivation Top-down parser : build a derivation by working from the start symbol towards the input. Builds parse tree from root to leaves Builds leftmost derivation Bottom-up parser : build a derivation by working from the input back toward the start symbol Builds parse tree from leaves to root Builds reverse rightmost derivation
Bottom-up parsing The parser looks for a substring of the parse tree's frontier... ...that matches the rhs of a production and ...whose reduction to the non-terminal on the lhs represents on step along the reverse of a rightmost derivation Such a substring is called a handle. Important: Not all substrings that match a rhs are handles.
Bottom-up parsing techniques LR Parsing Also called “Shift-Reduce Parsing” Shift input symbols until a handle is found. Then, reduce the substring to the non-terminal on the lhs of the corresponding production. Operator-precedence parsing Based on shift-reduce parsing. Identifies handles based on precedence rules.
Example: Shift-reduce parsing STACK ACTION $ Shift Grammar: $ id1 Reduce (rule 5) 1. S E 2. E E + E 3. E E * E 4. E num 5. E id $ E Shift $ E + Shift $ E + num Reduce (rule 4) $ E + E Shift $ E + E * Shift $ E + E * id2 Reduce (rule 5) Input to parse: id1 + num * id2 $ E + E * E Reduce (rule 3) $ E + E Reduce (rule 2) $ E Reduce (rule 1) Handles: underlined $ S Accept
Shift-Reduce parsing A shift-reduce parser has 4 actions: Shift -- next input symbol is shifted onto the stack Reduce -- handle is at top of stack pop handle push appropriate lhs Accept -- stop parsing & report success Error -- call error reporting/recovery routine