Underneath the hood, Comby uses no tree definition, but turns patterns into an executable routine (a language-aware parser) where the tree structure is implicit in this executable routine. In theory, the syntax matched by this routine could dump a serialized parse tree, but this isn’t implemented :-). With this design, Comby sacrifices this ability to recognize many predefined language constructs in order to support a more freeform pattern writing and matching process. This loses precision for deeply recognizing all of a program’s structures, and may fall short of your needs depending on your use case.
ast-grep is worth checking out too: https://ast-grep.github.io/
Some very quick, superficial differences:
ast-grep
uses tree-sitter for understanding languagesast-grep
is written in Rustast-grep
uses YAML for configast-grep
more normal--flags
comby
doesn’t use tree-sitter and does it’s own thing… not sure what to think of this approachcomby
is written in OCamlcomby
uses TOML for configcomby
uses-single-dash-flags
both have online playgrounds for testing
I personally hate YAML, so it’s
comby
for me! (For now.)Also, here’s what Comby says about its approach to matching: https://comby.dev/docs/faq
Fair enough. I hate YAML too, but I’m stuck with Python for now and Comby doesn’t handle indentation too well (it’s in their FAQ).
Oh, yeah makes sense. Thankfully, I’m refactoring Go!
I found ast-grep inconvenient to match several consecutive lines of python whereas comby handles this reasonably fine.