
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.