[Haskell-cafe] Parsing R5RS Scheme with Parsec

Alex Queiroz asandroq at gmail.com
Tue Oct 2 09:52:53 EDT 2007


     For fun and learning I'm trying to parse R5RS Scheme with Parsec.
The code to parse lists follows:

-- Lists

parseLeftList :: Parser [SchDatum]
parseLeftList = do
  char '('
  many parseDatum >>= return . filter (/=  SchAtmosphere)

parseDottedList :: [SchDatum] -> Parser SchDatum
parseDottedList ls = do
  char '.'
  many1 parseAtmosphere
  d <- parseDatum
  many parseAtmosphere
  char ')'
  return $ SchDottedList ls d

parseProperList :: [SchDatum] -> Parser SchDatum
parseProperList ls = do
  char ')'
  return $ SchList ls

parseList :: Parser SchDatum
parseList = do
  ls <- parseLeftList
  (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?


More information about the Haskell-Cafe mailing list