@@ -409,7 +409,7 @@ pFunDecl' syn = try (do push_indent
409 opts' <- pFnOpts
409 opts' <- pFnOpts
410 n_in <- pfName
410 n_in <- pfName
411 let n = expandNS syn n_in
411 let n = expandNS syn n_in
412− ty <- pTSig syn
412+ ty <- pTSig (impOK syn)
413 fc <- pfc
413 fc <- pfc
414 pTerminator
414 pTerminator
415-- ty' <- implicit syn n ty
415-- ty' <- implicit syn n ty
@@ -656,7 +656,7 @@ pSimpleExpr syn =
656 <|> try (pList syn)
656 <|> try (pList syn)
657 <|> try (pAlt syn)
657 <|> try (pAlt syn)
658 <|> try (pIdiom syn)
658 <|> try (pIdiom syn)
659− <|> try (do lchar '('; bracketed syn)
659+ <|> try (do lchar '('; bracketed (noImp syn))
660 <|> try (do c <- pConstant; fc <- pfc
660 <|> try (do c <- pConstant; fc <- pfc
661 return (modifyConst syn fc (PConstant c)))
661 return (modifyConst syn fc (PConstant c)))
662 <|> do reserved "Set"; return PSet
662 <|> do reserved "Set"; return PSet
@@ -793,9 +793,12 @@ mkSet (UN n) = UN ("set_" ++ n)
793mkSet (MN 0 n) = MN 0 ("set_" ++ n)
793mkSet (MN 0 n) = MN 0 ("set_" ++ n)
794mkSet (NS n s) = NS (mkSet n) s
794mkSet (NS n s) = NS (mkSet n) s
796+noImp syn = syn { implicitAllowed = False }
797+impOK syn = syn { implicitAllowed = True }
796pTSig syn = do lchar ':'
799pTSig syn = do lchar ':'
797− cs <- pConstList syn
800+ cs <- if implicitAllowed syn then pConstList syn else return []
798− sc <- pExpr syn
801+ sc <- pExpr syn
799 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
802 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
801pLambda syn = do lchar '\\'
804pLambda syn = do lchar '\\'
@@ -832,12 +835,14 @@ pPi syn =
832 symbol "->"
835 symbol "->"
833 sc <- pExpr syn
836 sc <- pExpr syn
834 return (bindList (PPi (Exp lazy st)) xt sc))
837 return (bindList (PPi (Exp lazy st)) xt sc))
838+ <|> try (if implicitAllowed syn then
835− <|> try (do lazy <- option False (do lchar '|'; return True)
839+ do lazy <- option False (do lchar '|'; return True)
836− st <- pStatic
840+ st <- pStatic
837− lchar '{'; xt <- tyDeclList syn; lchar '}'
841+ lchar '{'; xt <- tyDeclList syn; lchar '}'
838− symbol "->"
842+ symbol "->"
839− sc <- pExpr syn
843+ sc <- pExpr syn
840− return (bindList (PPi (Imp lazy st)) xt sc))
844+ return (bindList (PPi (Imp lazy st)) xt sc)
845+ else fail "No implicit arguments allowed here")
841 <|> try (do lchar '{'; reserved "auto"
846 <|> try (do lchar '{'; reserved "auto"
842 xt <- tyDeclList syn; lchar '}'
847 xt <- tyDeclList syn; lchar '}'
843 symbol "->"
848 symbol "->"
@@ -858,19 +863,19 @@ pPi syn =
859pConstList :: SyntaxInfo -> IParser [PTerm]
864pConstList :: SyntaxInfo -> IParser [PTerm]
860pConstList syn = try (do lchar '('
865pConstList syn = try (do lchar '('
861− tys <- sepBy1 (pExpr' syn) (lchar ',')
866+ tys <- sepBy1 (pExpr' (noImp syn)) (lchar ',')
862 lchar ')'
867 lchar ')'
863 reservedOp "=>"
868 reservedOp "=>"
864 return tys)
869 return tys)
865− <|> try (do t <- pExpr syn
870+ <|> try (do t <- pExpr (noImp syn)
866 reservedOp "=>"
871 reservedOp "=>"
867 return [t])
872 return [t])
868 <|> return []
873 <|> return []
870−tyDeclList syn = try (sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))
875+tyDeclList syn = try (sepBy1 (do x <- pfName; t <- pTSig (noImp syn); return (x,t))
871 (lchar ','))
876 (lchar ','))
872 <|> do ns <- sepBy1 pName (lchar ',')
877 <|> do ns <- sepBy1 pName (lchar ',')
873− t <- pTSig syn
878+ t <- pTSig (noImp syn)
874 return (map (\x -> (x, t)) ns)
879 return (map (\x -> (x, t)) ns)
876tyOptDeclList syn = sepBy1 (do x <- pfName;
881tyOptDeclList syn = sepBy1 (do x <- pfName;
@@ -978,7 +983,7 @@ accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns
978pRecord :: SyntaxInfo -> IParser PDecl
983pRecord :: SyntaxInfo -> IParser PDecl
979pRecord syn = do acc <- pAccessibility
984pRecord syn = do acc <- pAccessibility
980 reserved "record"; fc <- pfc
985 reserved "record"; fc <- pfc
981− tyn_in <- pfName; ty <- pTSig syn
986+ tyn_in <- pfName; ty <- pTSig (impOK syn)
982 let tyn = expandNS syn tyn_in
987 let tyn = expandNS syn tyn_in
983 reserved "where"
988 reserved "where"
984 open_block
989 open_block
@@ -1004,7 +1009,7 @@ pRecord syn = do acc <- pAccessibility
1004pData :: SyntaxInfo -> IParser PDecl
1009pData :: SyntaxInfo -> IParser PDecl
1005pData syn = try (do acc <- pAccessibility
1010pData syn = try (do acc <- pAccessibility
1006 reserved "data"; fc <- pfc
1011 reserved "data"; fc <- pfc
1007− tyn_in <- pfName; ty <- pTSig syn
1012+ tyn_in <- pfName; ty <- pTSig (impOK syn)
1008 let tyn = expandNS syn tyn_in
1013 let tyn = expandNS syn tyn_in
1009 reserved "where"
1014 reserved "where"
1010 open_block
1015 open_block
@@ -1044,7 +1049,7 @@ pConstructor :: SyntaxInfo -> IParser (Name, PTerm, FC)
1044pConstructor syn
1049pConstructor syn
1045 = do cn_in <- pfName; fc <- pfc
1050 = do cn_in <- pfName; fc <- pfc
1046 let cn = expandNS syn cn_in
1051 let cn = expandNS syn cn_in
1047− ty <- pTSig syn
1052+ ty <- pTSig (impOK syn)
1048-- ty' <- implicit syn cn ty
1053-- ty' <- implicit syn cn ty
1049 return (cn, ty, fc)
1054 return (cn, ty, fc)