
On Tue, Oct 02, 2007 at 11:36:52AM -0300, Alex Queiroz wrote:
Hallo,
On 10/2/07, Brandon S. Allbery KF8NH
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