[Haskell-cafe] Parsing problem

Daniel Fischer daniel.is.fischer at web.de
Thu Jun 26 16:55:16 EDT 2008


Am Donnerstag, 26. Juni 2008 12:40 schrieb Eric:
> Hi all,
>
> I'm using the Parsec library to parse the following grammar
>
> expr = atom+
> atom = integer | var | (expr)
>
> The input to the parser is a list of (Token, SourcePos). I have the
> following code for atom:
>
> atom
>   =  try variable <|> try integerr <|>
>      do{sat(== Reserved "("); (e,pos) <- expression;  sat(==Reserved
> ")"); return (e,pos)}
>
> sat p = do  (t,pos) <- item
>             if p t then return(t,pos) else pzero
>
> When I run the code on the input "(_ineg_ 0)" the parser fails, but
> removing
>
> sat(==Reserved ")")
>
> and it succeeds. Can any one see why?
>
> E.
>

I can't be absolutely sure without seeing your code for item and expression, 
possibly also variable and integerr, but I'm rather sure it's a case of a 
missing 'try'. 
I'd expect 'expression' using something like
many1 atom
, then when parsing the tokens of "(_ineg_ 0)", which, ignoring the SourcePos 
are [Reserved "(", Varid "_ineg_", INum 0, Reserved ")"], as it should be, 
variable and integerr fail, so the third branch is entered, 
sat (== Reserved "(") succeeds, the Varid and INum are parsed and finally only 
[Reserved ")"] is left over, on which atom is tried again. variable and 
integerr again fail gracefully, so sat (== Reserved "(") is tried on it, 
which fails, but unfortunately not gracefully, because item returns 
(Consumed _) and thus the overall failure consumes. Because of that, many1 
atom fails and the overall parse fails.

Can't be exactly that, though because then removing sat (== Reserved ")") 
shouldn't help. 
Anyway, I need at least the failure message, better the complete code, to 
diagnose.

Cheers,
Daniel



More information about the Haskell-Cafe mailing list