@@ -234,6 +234,14 @@ internalExpr syn =
234 <|> app syn
234 <|> app syn
235 <?> "expression"
235 <?> "expression"
237+{- | Parses the "impossible" keyword
239+Impossible ::= 'impossible'
242+impossible :: IdrisParser PTerm
243+impossible = PImpossible <$ reserved "impossible"
237{- | Parses a case expression
245{- | Parses a case expression
239CaseExpr ::=
247CaseExpr ::=
@@ -250,13 +258,13 @@ caseExpr syn = do reserved "case"; fc <- getFC
250{- | Parses a case in a case expression
258{- | Parses a case in a case expression
252CaseOption ::=
260CaseOption ::=
253− Expr '=>' Expr Terminator
261+ Expr (Impossible | '=>' Expr) Terminator
257caseOption :: SyntaxInfo -> IdrisParser (PTerm, PTerm)
265caseOption :: SyntaxInfo -> IdrisParser (PTerm, PTerm)
258caseOption syn = do lhs <- expr (syn { inPattern = True })
266caseOption syn = do lhs <- expr (syn { inPattern = True })
259− r <- PImpossible <$ reserved "impossible" <|> do symbol "=>"; expr syn
267+ r <- impossible <|> symbol "=>" *> expr syn
260 return (lhs, r)
268 return (lhs, r)
261 <?> "case option"
269 <?> "case option"
@@ -732,8 +740,8 @@ typeExpr syn = do cs <- if implicitAllowed syn then constraintList syn else retu
732{- | Parses a lambda expression
740{- | Parses a lambda expression
734Lambda ::=
742Lambda ::=
735− '\\' TypeOptDeclList '=>' Expr
743+ '\\' TypeOptDeclList LambdaTail
736− | '\\' SimpleExprList '=>' Expr
744+ | '\\' SimpleExprList LambdaTail
@@ -742,21 +750,22 @@ SimpleExprList ::=
742 | SimpleExpr ',' SimpleExprList
750 | SimpleExpr ',' SimpleExprList
746lambda :: SyntaxInfo -> IdrisParser PTerm
759lambda :: SyntaxInfo -> IdrisParser PTerm
747lambda syn = do lchar '\\' <?> "lambda expression"
760lambda syn = do lchar '\\' <?> "lambda expression"
748 (do xt <- try $ tyOptDeclList syn
761 (do xt <- try $ tyOptDeclList syn
749 fc <- getFC
762 fc <- getFC
750− sc <- PImpossible <$ reserved "impossible" <|> do
763+ sc <- lambdaTail
753 return (bindList (PLam fc) xt sc)) <|> do
764 return (bindList (PLam fc) xt sc)) <|> do
754 ps <- sepBy (do fc <- getFC
765 ps <- sepBy (do fc <- getFC
755 e <- simpleExpr (syn { inPattern = True })
766 e <- simpleExpr (syn { inPattern = True })
756 return (fc, e)) (lchar ',')
767 return (fc, e)) (lchar ',')
757− sc <- PImpossible <$ reserved "impossible" <|> do
768+ sc <- lambdaTail
760 return (pmList (zip [0..] ps) sc)
769 return (pmList (zip [0..] ps) sc)
761 <?> "lambda expression"
770 <?> "lambda expression"
762 where pmList :: [(Int, (FC, PTerm))] -> PTerm -> PTerm
771 where pmList :: [(Int, (FC, PTerm))] -> PTerm -> PTerm
@@ -765,6 +774,8 @@ lambda syn = do lchar '\\' <?> "lambda expression"
765 = PLam fc (sMN i "lamp") Placeholder
774 = PLam fc (sMN i "lamp") Placeholder
766 (PCase fc (PRef fc (sMN i "lamp"))
775 (PCase fc (PRef fc (sMN i "lamp"))
767 [(x, pmList xs sc)])
776 [(x, pmList xs sc)])
777+ lambdaTail :: IdrisParser PTerm
778+ lambdaTail = impossible <|> symbol "=>" *> expr syn
769{- | Parses a term rewrite expression
780{- | Parses a term rewrite expression