TODO ==== # normalize grammars - separate rules into non-terminals and terminals - extract strings and regexes from non-terminal rules into their own terminals, in order to separate lexing from parsing # refine - add concept of throwaway terminals (tokens that won't appear in constructed AST)