We use this in Presto for parsing SQL and generating an immutable AST:
https://github.com/prestodb/presto/blob/master/presto-parser...