| Have you looked at UUParsingLib [1]? https://hackage.haskell.org/package/uu-parsinglib To quote: New version of the Utrecht University parser combinator library, which provides online, error correction, annotation free, applicative style parser combinators. In addition to this we provide a monadic and an idomatic interface. Parsers do analyse themselves to avoid commonly made errors. So you get online parsing which means you can extract partial results available. You get error correction which accumulate errors and lets you get partial results ranked on the cumulative severity of errors happened. You also get a choice of Applicative interface which lets you build parsers that are mostly context-free (but see [2]) and monadic interface which allows you to have context-dependent parsing, online (you may report errors in Ada-like languages "function f ... begin end function g" on the "g" identifier online). The implementation above also automatically factor prefixes and does not do repeated scanning after, say, rollback. Would that somehow make your thirst less parching? [2] https://byorgey.wordpress.com/2012/01/05/parsing-context-sen... PS
My experience with ANTLR is quite the opposite, in the case of VHDL, at the very least (preprocessors required for Verilog aren't even expressible in ANTLR). Either I had to do a lot of work over ANTLR grammar to make it faster and lose a lot of conciseness or it is slow as snail, getting as slow as 4K bytes of source code per second. PPS
With parser combinators I can have an ability to test just parts of grammar in REPL and speed is much more predictable, if not faster. PPPS
I even encountered superlinear optimization gain produced by Glorious Haskell Compiler for some implementation of parser combinators: the parsing time for grammar that must have quadratic parsing time (over the length of input) has leading power of about 1.3. In other words, instead of T=O(L^2) (ghci, code interpreted without optimization, and C#, both gave this) I got T=O(L^1.3) (ghc -O3). |