# The Dangling Else Problem ## General Original grammar: ```rust S -> if E then S S -> if E then S else S S -> T ``` Now: ```rust S -> if E then S S -> if E then L else S L -> if E then L else L L -> T ``` - Insights - Think of **L** as **limited**, in that `L` rule must have an `else`. - We now require the statement **in the middle** must have an `else` paired with it. - Otherwise, if the statement in the middle can have no `else`, the `else` can be assigned to the `if` at the very beginning! - For any rules that have `S` on the LHS, create another version with `L` on the LHS. ## B-Minor Code snippet from Bison grammar file for [[compilers-and-language-design|B-Minor compiler]]. ```c stmt : open_stmt | closed_stmt ; open_stmt : if_stmt_open | for_stmt_open ; closed_stmt : if_stmt_closed | for_stmt_closed | simple_stmt ; if_stmt_open : if_cond stmt | if_cond closed_stmt TOKEN_ELSE if_stmt_open if_stmt_closed : if_cond closed_stmt TOKEN_ELSE closed_stmt for_stmt_open : for_header open_stmt for_stmt_closed : for_header closed_stmt ``` ## Mid-Term This problem appears in mid-term. Simplified. ```rust P -> S S -> id = R R -> R ^ R R -> int ``` Solution: ```rust P -> S S -> id = R R -> L ^ R L -> int R -> int ```