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

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to