@@ -32,7 +32,8 @@ toVar v = case v of "True" -> Boolean True
3232 _ -> Var v
3333
3434chrTerm :: (Monad m) => ParsecT [Char] u m Expr
35−chrTerm = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\'')) <?> "character"
35+chrTerm = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
36+ <?> "character"
3637
3738
3839-------- Complex Terms --------
@@ -67,9 +68,9 @@ appExpr = do
6768
6869binaryExpr = binops appExpr anyOp
6970
70−ifExpr = do string "if" ; forcedWS ; e1 <- expr ; forcedWS
71− string "then" ; forcedWS ; e2 <- expr ; (forcedWS <?> "an 'else' branch")
72− string "else" <?> "an 'else' branch" ; forcedWS ; If e1 e2 <$> expr
71+ifExpr = do reserved "if" ; whitespace ; e1 <- expr ; whitespace
72+ reserved "then" ; whitespace ; e2 <- expr ; (whitespace <?> "an 'else' branch")
73+ reserved "else" <?> "an 'else' branch" ; whitespace ; If e1 e2 <$> expr
7374
7475lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
7576 whitespace
@@ -87,24 +88,24 @@ assignExpr = do
8788 fail "matching tuples is not yet supported in this context"
8889 else fail $ "Only tuples can be matched in this context, " ++
8990 "not other abstract data types such as lists."
90− _ -> fail $ "Variables in assign statement are not acceptable: " ++
91+ _ -> fail $ "Left-hand side of assign statement is not acceptable: " ++
9192 "only named variables, named functions, and tuples are okay."
9293
9394letExpr = do
94− string "let"
95+ reserved "let"
9596 brace <- optionMaybe . try $ do
9697 whitespace
9798 char '{' <?> "a set of definitions { x = ... ; y = ... }"
9899 case brace of
99− Nothing -> do forcedWS; f <- assignExpr; forcedWS; string "in"; forcedWS;
100+ Nothing -> do whitespace; f <- assignExpr; whitespace; reserved "in"; whitespace
100101 Let [f] <$> expr
101102 Just '{' -> do whitespace ; fs <- semiSep1 assignExpr ; whitespace
102103 string "}" <?> "closing bracket '}'"
103− whitespace; string "in"; forcedWS; e <- expr
104+ whitespace; reserved "in"; whitespace; e <- expr
104105 return (Let fs e)
105106
106107caseExpr = do
107− string "case"; forcedWS; e <- expr; forcedWS; string "of"; whitespace
108+ reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
108109 Case e <$> brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
109110 where case_ = do p <- patternExpr; whitespace; arrow; whitespace
110111 (,) p <$> expr
@@ -117,14 +118,14 @@ def = do (f,e) <- assignExpr
117118
118119defs1 = do optional freshLine
119120 d <- datatype <|> def
120− (d:) <$> many (try (freshLine >> (datatype <|> def)))
121+ (d:) <$> many (try (try freshLine >> (datatype <|> def)))
121122
122123defs = do
123124 (fss,ess,tss) <- unzip3 <$> defs1
124125 let (fs,es,ts) = (concat fss, concat ess, concat `liftM` sequence tss)
125− optional freshLine ; optional whitespace ; eof
126+ optional freshLine ; optional spaces ; eof
126127 return (Let (zip fs es) (Var "main"), liftM (zip fs) ts)
127128
128−toDefs source = case parse defs "Elm code" source of
129+toDefs source = case parse defs "" source of
129130 Right result -> Right result
130− Left err -> Left $ show err
131+ Left err -> Left $ "Parse error at " ++ show err