@@ -103,7 +103,14 @@ dotSep1 p = (:) <$> p <*> many (try (char '.') >> p)
103spaceSep1 :: IParser a -> IParser [a]
103spaceSep1 :: IParser a -> IParser [a]
104spaceSep1 p = (:) <$> p <*> spacePrefix p
104spaceSep1 p = (:) <$> p <*> spacePrefix p
106+spacePrefix p = constrainedSpacePrefix p (\_ -> return ())
108+constrainedSpacePrefix p constraint =
106−spacePrefix p = many (try (whitespace >> indented >> p))
110+ n <- whitespace
108followedBy a b = do x <- a ; b ; return x
115followedBy a b = do x <- a ; b ; return x
@@ -150,38 +157,43 @@ accessible expr = do
152spaces :: IParser String
159spaces :: IParser String
153−spaces = many1 ((multiComment <|> string " " <?> "") >> return ' ') <?> "spaces"
160+spaces = concat <$> many1 (multiComment <|> string " ") <?> "spaces"
155−forcedWS :: IParser [String]
162+forcedWS :: IParser String
156−forcedWS = try (do { spaces; many nl_space }) <|> try (many1 nl_space)
163+forcedWS = choice [ try $ (++) <$> spaces <*> (concat <$> many nl_space)
164+ , try $ concat <$> many1 nl_space ]
157− where nl_space = try $ many1 newline >> spaces
165+ where nl_space = try ((++) <$> (concat <$> many1 newline) <*> spaces)
159-- Just eats whitespace until the next meaningful character.
167-- Just eats whitespace until the next meaningful character.
160−dumbWhitespace :: IParser ()
168+dumbWhitespace :: IParser String
161−dumbWhitespace = many (spaces <|> newline) >> return ()
169+dumbWhitespace = concat <$> many (spaces <|> newline)
163−whitespace :: IParser ()
171+whitespace :: IParser String
164−whitespace = optional forcedWS <?> ""
172+whitespace = option "" forcedWS <?> "whitespace"
166freshLine :: IParser [[String]]
174freshLine :: IParser [[String]]
167freshLine = try (many1 newline >> many space_nl) <|> try (many1 space_nl) <?> ""
175freshLine = try (many1 newline >> many space_nl) <|> try (many1 space_nl) <?> ""
168 where space_nl = try $ spaces >> many1 newline
176 where space_nl = try $ spaces >> many1 newline
170newline :: IParser String
178newline :: IParser String
171−newline = simpleNewline <|> lineComment <?> ""
179+newline = simpleNewline <|> lineComment <?> "newline"
173simpleNewline :: IParser String
181simpleNewline :: IParser String
174simpleNewline = try (string "\r\n") <|> string "\n"
182simpleNewline = try (string "\r\n") <|> string "\n"
176lineComment :: IParser String
184lineComment :: IParser String
177−lineComment = do try (string "--")
185+lineComment = do
178− manyTill anyChar $ simpleNewline <|> (eof >> return "\n")
187+ comment <- manyTill anyChar $ simpleNewline <|> (eof >> return "\n")
188+ return ("--" ++ comment)
180multiComment :: IParser String
190multiComment :: IParser String
181multiComment = do { try (string "{-"); closeComment }
191multiComment = do { try (string "{-"); closeComment }
183closeComment :: IParser String
193closeComment :: IParser String
184−closeComment = manyTill anyChar . choice $
195+ comment <- manyTill anyChar . choice $
185 [ try (string "-}") <?> "close comment"
196 [ try (string "-}") <?> "close comment"
186 , do { try $ string "{-"; closeComment; closeComment }
197 , do { try $ string "{-"; closeComment; closeComment }
199+ return ("{-" ++ comment ++ "-}")