What I've been doing lately is a parser.
I don't like the idea that you have a write grammar-generate code-compile loop each time you want to add something to a grammar, and you have to rewrite grammars to suit parsers. There seems something wrong with a system that doesn't allow new rules at runtime, and means that you end up with several thousand lines of code for what should be a simple part of a tool.
Therefore I've been playing with something like the Pack Rat technique, but using a 2-3 tree for forward parsing and a stack for backtracking over possible terminals (this is to allow only one subtree- that found by the tree- to need to be stored, but have the capability of going back to previously not explored subtrees whitout such a large table of possible states).
There are three design aims-
- to allow grammars that are simple mappings to abstract syntax
- to allow the grammar to be extensible at runtime (allowing new abstract values for metadata constructs)
- to allow the current parse state to be used for structure aware autocomplete
This is part of an on-going metadata driven toolset for Java programming.. more later.