The Text.ParserCombinators.ReadPrec/Text.ParserCominators.ReadP split
adds a bit of lifting cruft, so lets try to sweep that away.
parseVar = Var <$> lift (munch1 isAlpha)
parseBinOp s prc op = prec prc $ do
a <- step readPrec
- lift $ do
- skipSpaces
- string s
- skipSpaces
+ spaced $ string s
b <- readPrec
return (BinOp op a b)
parseCall = do
(skipSpaces >> char ',' >> skipSpaces)
return (Call func params)
parseIf = do
- lift $ skipSpaces >> string "if" >> skipSpaces
+ spaced $ string "if"
cond <- readPrec
- lift $ skipSpaces >> string "then" >> skipSpaces
+ spaced $ string "then"
thenE <- readPrec
- lift $ skipSpaces >> string "else" >> skipSpaces
+ spaced $ string "else"
elseE <- readPrec
return (If cond thenE elseE)
+ spaced f = lift $ skipSpaces >> f >> skipSpaces
data Prototype = Prototype String [String]
deriving Show