testcase { input "if (bar!) baz!;"; output "IfThen:{id:{x:{b x:{a r}}} id:{x:{b x:{a z}}}}"; s = Expr ";" Expr = IfThen | IfThenElse | id:: id "!" id = [a-z] | x:: [a-z] id IfThen = IfThen:: "if" "(" Expr ")" Expr /ws IfThenElse = IfThenElse:: "if" "(" Expr ")" NotIfThenExpr "else" Expr /ws NotIfThenExpr = (Expr & [a-z]+) SpaceIfThen = (~[])*// !IfThen ws = [\n ]** }