https://github.com/bglgwyng/semantic-lang-gen
I wrote(tbh, just packaged) a Haskell library that generates TreeSitter bindings and the corresponding AST type definition from TreeSitter language definition. Writing parsers using a parser combinator is fun, of course. However, with TreeSitter, you can eat free lunches of language tooling.