@@ -139,56 +139,87 @@ appExpr = do
139-------- Normal Expressions --------
139-------- Normal Expressions --------
141binaryExpr :: IParser Source.Expr
141binaryExpr :: IParser Source.Expr
142−binaryExpr = Binop.binops appExpr lastExpr anyOp
143+ Binop.binops appExpr lastExpr anyOp
143− where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
145+ lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
144− <|> lambdaExpr
146+ <|> lambdaExpr
146ifExpr :: IParser Source.Expr'
149ifExpr :: IParser Source.Expr'
151+ do try (reserved "if")
147−ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
153+ normal <|> multiIf
149− normal = do
155+ normal = do
150− bool <- expr
156+ bool <- expr
151− padded (reserved "then")
157+ padded (reserved "then")
152− thenBranch <- expr
158+ thenBranch <- expr
159+ whitespace <?> "an 'else' branch"
153− whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
160+ reserved "else" <?> "an 'else' branch"
154− elseBranch <- expr
162+ elseBranch <- expr
155− return $ E.MultiIf
163+ return $ E.MultiIf
156− [ (bool, thenBranch)
164+ [ (bool, thenBranch)
157− , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
165+ , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
160− multiIf = E.MultiIf <$> spaceSep1 iff
169+ E.MultiIf <$> spaceSep1 iff
161− where iff = do string "|" ; whitespace
172+ do string "|" ; whitespace
162− b <- expr ; padded arrow
173+ b <- expr ; padded arrow
163− (,) b <$> expr
174+ (,) b <$> expr
165lambdaExpr :: IParser Source.Expr
177lambdaExpr :: IParser Source.Expr
166−lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
179+ do char '\\' <|> char '\x03BB' <?> "anonymous function"
167− whitespace
180+ whitespace
168− args <- spaceSep1 Pattern.term
181+ args <- spaceSep1 Pattern.term
169− padded arrow
182+ padded arrow
170− body <- expr
183+ body <- expr
171− return (makeFunction args body)
184+ return (makeFunction args body)
173defSet :: IParser [Source.Def]
187defSet :: IParser [Source.Def]
174−defSet = block (do d <- def ; whitespace ; return d)
191+ whitespace
176letExpr :: IParser Source.Expr'
195letExpr :: IParser Source.Expr'
177−letExpr = do
196+letExpr =
197+ do try (reserved "let")
178− reserved "let" ; whitespace
198+ whitespace
179− defs <- defSet
199+ defs <- defSet
180− padded (reserved "in")
200+ padded (reserved "in")
181− E.Let defs <$> expr
201+ E.Let defs <$> expr
183caseExpr :: IParser Source.Expr'
204caseExpr :: IParser Source.Expr'
184−caseExpr = do
205+caseExpr =
185− reserved "case"; e <- padded expr; reserved "of"; whitespace
206+ do try (reserved "case")
186− E.Case e <$> (with <|> without)
210+ E.Case e <$> (with <|> without)
187− where case_ = do p <- Pattern.expr
213+ do p <- Pattern.expr
188− padded arrow
214+ padded arrow
189− (,) p <$> expr
215+ (,) p <$> expr
190− with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
218+ brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
191− without = block (do c <- case_ ; whitespace ; return c)
221+ block (do c <- case_ ; whitespace ; return c)
193expr :: IParser Source.Expr
224expr :: IParser Source.Expr
194expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
225expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
@@ -196,6 +227,7 @@ expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
196 <|> binaryExpr
227 <|> binaryExpr
197 <?> "an expression"
228 <?> "an expression"
199defStart :: IParser [P.RawPattern]
231defStart :: IParser [P.RawPattern]
200defStart =
232defStart =
201 choice [ do p1 <- try Pattern.term
233 choice [ do p1 <- try Pattern.term