
(b) i like my combinator grammars to be reversible, so that a single grammar specification can be used for both parsing and unparsing/pretty-printing. that means i have to define the details myself anyway.
the latest such experiment is not necessarily the simplest variant,
for instance, it explicitly gives semantic functions and their inverses, which i've found to be useable compromise in practice. but if you apply a bit of generic programming to associate an ast node with its constructor and children (or if you use an "untyped" representation of the ast, like 'data AST = Node ConstructorTag [AST]'), with constructor tags that can be compared for equality, you can avoid even that bit of duplication. also, i should have mentioned that the same idea, of using a single grammar specification in parse or unparse mode, opens up a variety of other application possibilities. i already touched upon syntax-directed editing (use a zipper combined with i/o to allow interactive navigation of the ast; associate each type of ast node with its grammar rule; unparse the current node with its rule to display it, let the user edit, then parse the input with the rule for the current node, and continue navigation). another interesting option is to use combinator grammars to specify dialogue protocols: if one annotates the positions in grammar rules where activity switches between dialogue partners, such as server and client communicating according to some protocol, then both server and client can run the same grammar code, in complementary modes, using the switch points to move from producing to expecting dialogue, and vice versa. i've attached a silly little example, using which: $ runhaskell Dialogue.hs server HTTP/1.1 200 Content-Length: 15 Content-Type: text/plain this is a text $ runhaskell Dialogue.hs server | runhaskell.exe Dialogue.hs client this is a text as i said, many opportunities, and i've sometimes wondered why noone else seems to use this technique. perhaps i'll get around to writing it up some day, after all these years.. claus