On Tue, Oct 02, 2007 at 11:36:52AM -0300, Alex Queiroz wrote: > Hallo, > > On 10/2/07, Brandon S. Allbery KF8NH <[EMAIL PROTECTED]> wrote: > > > > On Oct 2, 2007, at 9:52 , Alex Queiroz wrote: > > > > > (parseDottedList ls) <|> (parseProperList ls) > > > > > > I've factored out the common left sub-expression in > > > parseLeftList. The problem is that "..." is a valid identifier so when > > > inside the left of the list the parser sees a single dot, it tries to > > > match it with "...", which fails. Can anybody give advice on how to > > > rewrite these list parsing functions? > > > > try (parseDottedList ls) <|> parseProperList ls > > > > Overuse of try is a bad idea because it's slow, but sometimes it's > > the only way to go; it insures backtracking in cases like this. > > > > This does not work. The parser chokes in parseLeftList, because > it finds a single dot which is not the beginning of "...".
I suggest left-factoring.
parseThingyOrEOL =
(space >> parseThingyOrEOL)
<|> (fmap Left parseAtom)
<|> (char '.' >> parseThingyOrEOL >>= \(Left x) -> Right x)
<|> (char ')' >> return (Right nil))
<|> (char '(' >> fmap Left (fix (\ plist -> do obj <- parseThingyOrEOL
case obj of Left x -> fmap
(Cons x) plist
Right x -> return
x)))
etc.
Stefan
signature.asc
Description: Digital signature
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
