grammar: left recursive grammar hack: S -> Assign EOL S -> E$ F -> AF' | Query EOL E -> TE' F' -> not A Assign -> id eq Exp E' -> and TE' | eq A Query -> id qmark | e | id Exp -> Exp and Exp T -> FT' | e | Exp or Exp T' -> or FT' A -> ? | not Exp | e | 0 | lp Exp rp | 1 | id | (E) | true | false terminals: first sets: id :: a-z first(S) = (, id, 0, 1 and :: & first(E) = (, id, 0, 1 or :: | first(E') = and not :: ~ first(T) = (, id, 0, 1 eq :: = first(T') = or qmark :: ? first(F) = (, id, 0, 1 false :: 0 first(F') = not, eq true :: 1 first(A) = (, id, 0, 1 lp :: ( rp :: ) follows sets: EOL :: \n follows(S) = $ follows(E) = ), $ follows(E') = ), $ follows(T) = ), and, or, $ follows(T') = ), and, or, $ follows(F) = ), and, or, $ follows(F') = ), and, or, $ follows(A) = ), and, or, $