@@ -32,7 +32,8 @@ toVar v = case v of "True" -> Boolean True
32 _ -> Var v
32 _ -> Var v
34chrTerm :: (Monad m) => ParsecT [Char] u m Expr
34chrTerm :: (Monad m) => ParsecT [Char] u m Expr
35−chrTerm = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\'')) <?> "character"
35+chrTerm = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
38-------- Complex Terms --------
39-------- Complex Terms --------
@@ -67,9 +68,9 @@ appExpr = do
68binaryExpr = binops appExpr anyOp
69binaryExpr = binops appExpr anyOp
70−ifExpr = do string "if" ; forcedWS ; e1 <- expr ; forcedWS
71+ifExpr = do reserved "if" ; whitespace ; e1 <- expr ; whitespace
71− string "then" ; forcedWS ; e2 <- expr ; (forcedWS <?> "an 'else' branch")
72+ reserved "then" ; whitespace ; e2 <- expr ; (whitespace <?> "an 'else' branch")
72− string "else" <?> "an 'else' branch" ; forcedWS ; If e1 e2 <$> expr
73+ reserved "else" <?> "an 'else' branch" ; whitespace ; If e1 e2 <$> expr
74lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
75lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
75 whitespace
76 whitespace
@@ -87,24 +88,24 @@ assignExpr = do
87 fail "matching tuples is not yet supported in this context"
88 fail "matching tuples is not yet supported in this context"
88 else fail $ "Only tuples can be matched in this context, " ++
89 else fail $ "Only tuples can be matched in this context, " ++
89 "not other abstract data types such as lists."
90 "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: " ++
91 "only named variables, named functions, and tuples are okay."
92 "only named variables, named functions, and tuples are okay."
93letExpr = do
94letExpr = do
94− string "let"
95+ reserved "let"
95 brace <- optionMaybe . try $ do
96 brace <- optionMaybe . try $ do
96 whitespace
97 whitespace
97 char '{' <?> "a set of definitions { x = ... ; y = ... }"
98 char '{' <?> "a set of definitions { x = ... ; y = ... }"
98 case brace of
99 case brace of
99− Nothing -> do forcedWS; f <- assignExpr; forcedWS; string "in"; forcedWS;
100+ Nothing -> do whitespace; f <- assignExpr; whitespace; reserved "in"; whitespace
100 Let [f] <$> expr
101 Let [f] <$> expr
101 Just '{' -> do whitespace ; fs <- semiSep1 assignExpr ; whitespace
102 Just '{' -> do whitespace ; fs <- semiSep1 assignExpr ; whitespace
102 string "}" <?> "closing bracket '}'"
103 string "}" <?> "closing bracket '}'"
103− whitespace; string "in"; forcedWS; e <- expr
104+ whitespace; reserved "in"; whitespace; e <- expr
104 return (Let fs e)
105 return (Let fs e)
106caseExpr = do
107caseExpr = do
107− string "case"; forcedWS; e <- expr; forcedWS; string "of"; whitespace
108+ reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
108 Case e <$> brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
109 Case e <$> brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
109 where case_ = do p <- patternExpr; whitespace; arrow; whitespace
110 where case_ = do p <- patternExpr; whitespace; arrow; whitespace
110 (,) p <$> expr
111 (,) p <$> expr
@@ -117,14 +118,14 @@ def = do (f,e) <- assignExpr
118defs1 = do optional freshLine
119defs1 = do optional freshLine
119 d <- datatype <|> def
120 d <- datatype <|> def
120− (d:) <$> many (try (freshLine >> (datatype <|> def)))
121+ (d:) <$> many (try (try freshLine >> (datatype <|> def)))
123 (fss,ess,tss) <- unzip3 <$> defs1
124 (fss,ess,tss) <- unzip3 <$> defs1
124 let (fs,es,ts) = (concat fss, concat ess, concat `liftM` sequence tss)
125 let (fs,es,ts) = (concat fss, concat ess, concat `liftM` sequence tss)
125− optional freshLine ; optional whitespace ; eof
126+ optional freshLine ; optional spaces ; eof
126 return (Let (zip fs es) (Var "main"), liftM (zip fs) ts)
127 return (Let (zip fs es) (Var "main"), liftM (zip fs) ts)
128−toDefs source = case parse defs "Elm code" source of
129+toDefs source = case parse defs "" source of
129 Right result -> Right result
130 Right result -> Right result
130− Left err -> Left $ show err
131+ Left err -> Left $ "Parse error at " ++ show err