@@ -139,56 +139,87 @@ appExpr = do
139139-------- Normal Expressions --------
140140
141141binaryExpr :: IParser Source.Expr
142−binaryExpr = Binop.binops appExpr lastExpr anyOp
143− where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
144− <|> lambdaExpr
142+binaryExpr =
143+ Binop.binops appExpr lastExpr anyOp
144+ where
145+ lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
146+ <|> lambdaExpr
147+
145148
146149ifExpr :: IParser Source.Expr'
147−ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
148− where
149− normal = do
150− bool <- expr
151− padded (reserved "then")
152− thenBranch <- expr
153− whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
154− elseBranch <- expr
155− return $ E.MultiIf
156− [ (bool, thenBranch)
157− , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
158− ]
159−
160− multiIf = E.MultiIf <$> spaceSep1 iff
161− where iff = do string "|" ; whitespace
162− b <- expr ; padded arrow
163− (,) b <$> expr
150+ifExpr =
151+ do try (reserved "if")
152+ whitespace
153+ normal <|> multiIf
154+ where
155+ normal = do
156+ bool <- expr
157+ padded (reserved "then")
158+ thenBranch <- expr
159+ whitespace <?> "an 'else' branch"
160+ reserved "else" <?> "an 'else' branch"
161+ whitespace
162+ elseBranch <- expr
163+ return $ E.MultiIf
164+ [ (bool, thenBranch)
165+ , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
166+ ]
167+
168+ multiIf =
169+ E.MultiIf <$> spaceSep1 iff
170+ where
171+ iff =
172+ do string "|" ; whitespace
173+ b <- expr ; padded arrow
174+ (,) b <$> expr
175+
164176
165177lambdaExpr :: IParser Source.Expr
166−lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
167− whitespace
168− args <- spaceSep1 Pattern.term
169− padded arrow
170− body <- expr
171− return (makeFunction args body)
178+lambdaExpr =
179+ do char '\\' <|> char '\x03BB' <?> "anonymous function"
180+ whitespace
181+ args <- spaceSep1 Pattern.term
182+ padded arrow
183+ body <- expr
184+ return (makeFunction args body)
185+
172186
173187defSet :: IParser [Source.Def]
174−defSet = block (do d <- def ; whitespace ; return d)
188+defSet =
189+ block $
190+ do d <- def
191+ whitespace
192+ return d
193+
175194
176195letExpr :: IParser Source.Expr'
177−letExpr = do
178− reserved "let" ; whitespace
179− defs <- defSet
180− padded (reserved "in")
181− E.Let defs <$> expr
196+letExpr =
197+ do try (reserved "let")
198+ whitespace
199+ defs <- defSet
200+ padded (reserved "in")
201+ E.Let defs <$> expr
202+
182203
183204caseExpr :: IParser Source.Expr'
184−caseExpr = do
185− reserved "case"; e <- padded expr; reserved "of"; whitespace
186− E.Case e <$> (with <|> without)
187− where case_ = do p <- Pattern.expr
188− padded arrow
189− (,) p <$> expr
190− with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
191− without = block (do c <- case_ ; whitespace ; return c)
205+caseExpr =
206+ do try (reserved "case")
207+ e <- padded expr
208+ reserved "of"
209+ whitespace
210+ E.Case e <$> (with <|> without)
211+ where
212+ case_ =
213+ do p <- Pattern.expr
214+ padded arrow
215+ (,) p <$> expr
216+
217+ with =
218+ brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
219+
220+ without =
221+ block (do c <- case_ ; whitespace ; return c)
222+
192223
193224expr :: IParser Source.Expr
194225expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
@@ -196,6 +227,7 @@ expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
196227 <|> binaryExpr
197228 <?> "an expression"
198229
230+
199231defStart :: IParser [P.RawPattern]
200232defStart =
201233 choice [ do p1 <- try Pattern.term