on master help sign in
Merge branch 'ahmadsalim-feature/deppairparsing'
commitb5eb5f6d3fafa0645c88852cdf0eac7f9e98eefc authorEdwin Brady <ecb10@st-andrews.ac.uk> dateThu 24 Mar 2016, 16:56 (11 years ago) parentc994ef3a7f75c5
4 files changed+87−32
CHANGELOG+3 src/Idris/AbsSyntaxTree.hs+34−14 src/Idris/Parser/Expr.hs+47−15 test/proof003/test015.idr+3−3
CHANGELOG+3
@@ -101,6 +101,9 @@ New in 0.10:
101101 Where `CATS` is a whitespace separated list of categoriese. Default is for
102102 all categories to be logged.
103103* New flag `--listlogcats` to list logging categories.`
104+* Dependent pairs now can be specified using a telescope-style syntax, without
105+ requirement of nesting, e.g. it is possible to now write the following:
106+ (a : Type ** n : Nat ** Vect n a)
104107
105108New in 0.9.20:
106109==============
src/Idris/AbsSyntaxTree.hs+34−14
@@ -1879,23 +1879,38 @@ pprintPTerm ppo bnd docArgs infixes = prettySe (ppopt_depth ppo) startPrec bnd
18791879 align . group . vsep . punctuate (ann comma) $
18801880 map (prettySe (decD d) startPrec bnd) elts
18811881 where ann = case pun of
1882− TypeOrTerm -> id
1883− IsType -> annName pairTy
1884− IsTerm -> annName pairCon
1885− prettySe d p bnd (PDPair _ _ pun l t r) =
1886− depth d $
1887− annotated lparen <>
1888− left <+>
1889− annotated (text "**") <+>
1890− prettySe (decD d) startPrec (addBinding bnd) r <>
1891− annotated rparen
1882+ TypeOrTerm -> id
1883+ IsType -> annName pairTy
1884+ IsTerm -> annName pairCon
1885+ prettySe d p bnd dpair@(PDPair _ _ pun l t r)
1886+ | Just elts <- dPairElts dpair
1887+ = depth d . enclose (annotated lparen) (annotated rparen) .
1888+ align . group . vsep . punctuate (space <> annotated (text "**")) $
1889+ ppElts elts bnd
1890+ | otherwise
1891+ = depth d $
1892+ annotated lparen <>
1893+ left <+>
1894+ annotated (text "**") <+>
1895+ prettySe (decD d) startPrec (addBinding bnd) r <>
1896+ annotated rparen
18921897 where annotated = case pun of
1893− IsType -> annName sigmaTy
1894− IsTerm -> annName sigmaCon
1895− TypeOrTerm -> id
1898+ IsType -> annName sigmaTy
1899+ IsTerm -> annName sigmaCon
1900+ TypeOrTerm -> id
1901+
18961902 (left, addBinding) = case (l, pun) of
18971903 (PRef _ _ n, IsType) -> (bindingOf n False <+> text ":" <+> prettySe (decD d) startPrec bnd t, ((n, False) :))
1898− _ -> (prettySe (decD d) startPrec bnd l, id)
1904+ _ -> (prettySe (decD d) startPrec bnd l, id)
1905+
1906+ ppElts [] bs = []
1907+ ppElts [(_, v)] bs = [prettySe (decD d) startPrec bs v]
1908+ ppElts ((PRef _ _ n, t):rs) bs
1909+ | IsType <- pun
1910+ = (bindingOf n False <+> colon <+>
1911+ prettySe (decD d) startPrec bs t) : ppElts rs ((n, False):bs)
1912+ ppElts ((l, t):rs) bs
1913+ = (prettySe (decD d) startPrec bs l) : ppElts rs bs
18991914 prettySe d p bnd (PAlternative ns a as) =
19001915 lparen <> text "|" <> prettyAs <> text "|" <> rparen
19011916 where
@@ -2014,6 +2029,11 @@ pprintPTerm ppo bnd docArgs infixes = prettySe (ppopt_depth ppo) startPrec bnd
20142029 | otherwise = Just [x, y]
20152030 pairElts _ = Nothing
20162031
2032+ dPairElts :: PTerm -> Maybe [(PTerm, PTerm)]
2033+ dPairElts (PDPair _ _ _ l t r) | Just elts <- dPairElts r = Just ((l, t):elts)
2034+ | otherwise = Just [(l, t), (Placeholder, r)]
2035+ dPairElts _ = Nothing
2036+
20172037 natns = "Prelude.Nat."
20182038
20192039 snat :: PPOption -> Maybe Int -> Int -> PTerm -> Maybe Integer
src/Idris/Parser/Expr.hs+47−15
@@ -398,7 +398,7 @@ simpleExpr syn =
398398 <|> do reserved "elim_for"; fc <- getFC; t <- fst <$> fnName; return (PRef fc [] (SN $ ElimN t))
399399 <|> proofExpr syn
400400 <|> tacticsExpr syn
401− <|> try (do reserved "Type"; symbol "*"; return $ PUniverse AllTypes)
401+ <|> try (do reserved "Type*"; return $ PUniverse AllTypes)
402402 <|> do reserved "AnyType"; return $ PUniverse AllTypes
403403 <|> PType <$> reservedFC "Type"
404404 <|> do reserved "UniqueType"; return $ PUniverse UniqueType
@@ -440,16 +440,16 @@ bracketed :: SyntaxInfo -> IdrisParser PTerm
440440bracketed syn = do (FC fn (sl, sc) _) <- getFC
441441 lchar '(' <?> "parenthesized expression"
442442 bracketed' (FC fn (sl, sc) (sl, sc+1)) syn
443+
443444{- |Parses the rest of an expression in braces
444445@
445446Bracketed' ::=
446447 ')'
447448 | Expr ')'
448449 | ExprList ')'
449− | Expr '**' Expr ')'
450+ | DependentPair ')'
450451 | Operator Expr ')'
451452 | Expr Operator ')'
452− | Name ':' Expr '**' Expr ')'
453453 ;
454454@
455455-}
@@ -458,14 +458,7 @@ bracketed' open syn =
458458 do (FC f start (l, c)) <- getFC
459459 lchar ')'
460460 return $ PTrue (spanFC open (FC f start (l, c+1))) TypeOrTerm
461− <|> try (do (ln, lnfc) <- name
462− colonFC <- lcharFC ':'
463− lty <- expr syn
464− starsFC <- reservedOpFC "**"
465− fc <- getFC
466− r <- expr syn
467− close <- lcharFC ')'
468− return (PDPair fc [open, colonFC, starsFC, close] TypeOrTerm (PRef lnfc [] ln) lty r))
461+ <|> try (dependentPair TypeOrTerm [] open syn)
469462 <|> try (do fc <- getFC; o <- operator; e <- expr syn; lchar ')'
470463 -- No prefix operators! (bit of a hack here...)
471464 if (o == "-" || o == "!")
@@ -486,20 +479,59 @@ bracketed' open syn =
486479 <|> do l <- expr syn
487480 bracketedExpr syn open l
488481
482+
483+
484+{-| Parses the rest of a dependent pair after '(' or '(Expr **' -}
485+dependentPair :: PunInfo -> [(PTerm, Maybe (FC, PTerm), FC)] -> FC -> SyntaxInfo -> IdrisParser PTerm
486+dependentPair pun prev openFC syn =
487+ if prev == [] then
488+ nametypePart <|> namePart
489+ else
490+ case pun of
491+ IsType -> nametypePart <|> namePart <|> exprPart True
492+ IsTerm -> exprPart False
493+ TypeOrTerm -> nametypePart <|> namePart <|> exprPart False
494+ where nametypePart = do
495+ (ln, lnfc, colonFC) <- try $ do
496+ (ln, lnfc) <- name
497+ colonFC <- lcharFC ':'
498+ return (ln, lnfc, colonFC)
499+ lty <- expr' syn
500+ starsFC <- reservedOpFC "**"
501+ dependentPair IsType ((PRef lnfc [] ln, Just (colonFC, lty), starsFC):prev) openFC syn
502+ namePart = try $ do
503+ (ln, lnfc) <- name
504+ starsFC <- reservedOpFC "**"
505+ dependentPair pun ((PRef lnfc [] ln, Nothing, starsFC):prev) openFC syn
506+ exprPart isEnd = do
507+ e <- expr syn
508+ sepFCE <-
509+ let stars = (Left <$> reservedOpFC "**")
510+ ending = (Right <$> lcharFC ')')
511+ in if isEnd then ending else stars <|> ending
512+ case sepFCE of
513+ Left starsFC -> dependentPair IsTerm ((e, Nothing, starsFC):prev) openFC syn
514+ Right closeFC ->
515+ return (mkPDPairs pun openFC closeFC (reverse prev) e)
516+ mkPDPairs pun openFC closeFC ((e, cfclty, starsFC):bnds) r =
517+ (PDPair openFC ([openFC] ++ maybe [] ((: []) . fst) cfclty ++ [starsFC, closeFC] ++ (=<<) (\(_,cfclty,sfc) -> maybe [] ((: []) . fst) cfclty ++ [sfc]) bnds)
518+ pun e (maybe Placeholder snd cfclty) (mergePDPairs pun starsFC bnds r))
519+ mergePDPairs pun starsFC' [] r = r
520+ mergePDPairs pun starsFC' ((e, cfclty, starsFC):bnds) r =
521+ PDPair starsFC' [] pun e (maybe Placeholder snd cfclty) (mergePDPairs pun starsFC bnds r)
522+
489523-- | Parse the contents of parentheses, after an expression has been parsed.
490524bracketedExpr :: SyntaxInfo -> FC -> PTerm -> IdrisParser PTerm
491525bracketedExpr syn openParenFC e =
492526 do lchar ')'; return e
493− <|> do exprs <- many (do comma <- lcharFC ','
527+ <|> do exprs <- some (do comma <- lcharFC ','
494528 r <- expr syn
495529 return (r, comma))
496530 closeParenFC <- lcharFC ')'
497531 let hilite = [openParenFC, closeParenFC] ++ map snd exprs
498532 return $ PPair openParenFC hilite TypeOrTerm e (mergePairs exprs)
499533 <|> do starsFC <- reservedOpFC "**"
500− r <- expr syn
501− closeParenFC <- lcharFC ')'
502− return (PDPair starsFC [openParenFC, starsFC, closeParenFC] TypeOrTerm e Placeholder r)
534+ dependentPair IsTerm [(e, Nothing, starsFC)] openParenFC syn
503535 <?> "end of bracketed expression"
504536 where mergePairs :: [(PTerm, FC)] -> PTerm
505537 mergePairs [(t, fc)] = t
test/proof003/test015.idr+3−3
@@ -44,11 +44,11 @@ natToBin (S w) (S k) with (parity k)
4444testBin : Maybe (Binary 8 42)
4545testBin = natToBin _ _
4646
47−pattern syntax bitpair [x] [y] = (_ ** (_ ** (x, y, _)))
48−term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, Refl)))
47+pattern syntax bitpair [x] [y] = (_ ** _ ** (x, y, _))
48+term syntax bitpair [x] [y] = (_ ** _ ** (x, y, Refl))
4949
5050addBit : Bit x -> Bit y -> Bit c ->
51− (bX ** (bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX)))
51+ (bX ** bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX))
5252addBit B0 B0 B0 = bitpair B0 B0
5353addBit B0 B0 B1 = bitpair B0 B1
5454addBit B0 B1 B0 = bitpair B0 B1