[Haskell-cafe] parsec: how to get end location

Martijn van Steenbergen martijn at van.steenbergen.nl
Mon Jun 14 10:15:28 EDT 2010


On 6/14/10 0:10, Roman Cheplyaka wrote:
> Of course most parsers don't consume trailing newlines. But I was
> writing general function to use in many places in the code which would
> recover the end location. In most cases it just subtracts 1 from the
> column number, but what if it just happened so that column number is 1?

Parsers can be composed of lots of functions, but eventually all the 
actual consumption of symbols boils down to calls to 
Text.Parsec.Prim.tokenPrimEx. This is where you need to address your 
problem: find the places in your code where this function is called (or 
the derived tokenPrim or token) and intercept there. Hopefully you have 
defined your own 'satisfy' function and need only change that one.

Once you've found those places, there's multiple ways to solve the 
problem. For example, you could keep track of the last interesting 
(=non-whitespace) position. Or you could parse the whitespace in a 
separate phase.

There is no way to retroactively intercept these calls, which I think is 
a flaw in the design of Parsec. It would have been nice to have a 
'runParsecWith myTokenPrimEx', or better yet capture the Parsec 
primitives in a type class.

Groetjes,

Martijn.


More information about the Haskell-Cafe mailing list