1{-# LANGUAGE PatternGuards, ScopedTypeVariables #-}
2-- | Parse the full Idris language.
3module Idris.Parser where
17import Util.DynamicLinker
24import Text.Parsec.Error
25import Text.Parsec.Expr
26import Text.Parsec.Language
27import Text.Parsec.String
28import qualified Text.Parsec.Token as PTok
31import Data.List.Split(splitOn)
32import Control.Monad.State
33import Control.Monad.Error
38type TokenParser a = PTok.TokenParser a
40type IParser = GenParser Char IState
42lexer :: TokenParser IState
45whiteSpace = PTok.whiteSpace lexer
46lexeme = PTok.lexeme lexer
47symbol = PTok.symbol lexer
48natural = PTok.natural lexer
49parens = PTok.parens lexer
51comma = PTok.comma lexer
52identifier = PTok.identifier lexer
53reserved = PTok.reserved lexer
54operator = PTok.operator lexer
55reservedOp = PTok.reservedOp lexer
56integer = PTok.integer lexer
57float = PTok.float lexer
58strlit = PTok.stringLiteral lexer
59chlit = PTok.charLiteral lexer
62fixErrorMsg :: String -> [String] -> String
63fixErrorMsg msg fixes = msg ++ ", possible fixes:\n" ++ (concat $ intersperse "\n\nor\n\n" fixes)
67loadModule :: FilePath -> Idris String
69 = idrisCatch (do i <- getIState
70 let file = takeWhile (/= ' ') f
71 ibcsd <- valIBCSubDir i
72 ids <- allImportDirs i
73 fp <- liftIO $ findImport ids ibcsd file
74 if file `elem` imported i
75 then iLOG $ "Already read " ++ file
76 else do putIState (i { imported = file : imported i })
78 IDR fn -> loadSource False fn
79 LIDR fn -> loadSource True fn
81 idrisCatch (loadIBC fn)
82 (\c -> do iLOG $ fn ++ " failed " ++ show c
84 IDR sfn -> loadSource False sfn
85 LIDR sfn -> loadSource True sfn)
86 let (dir, fh) = splitFileName file
87 return (dropExtension fh))
88 (\e -> do let msg = show e
89 setErrLine (getErrLine msg)
93loadSource :: Bool -> FilePath -> Idris ()
95 = do iLOG ("Reading " ++ f)
97 let def_total = default_total i
98 file_in <- liftIO $ readFile f
99 file <- if lidr then tclift $ unlit f file_in else return file_in
100 (mname, modules, rest, pos) <- parseImports f file
102 putIState (i { default_access = Hidden })
103 mapM_ loadModule modules
104 clearIBC -- start a new .ibc file
105 mapM_ (addIBC . IBCImport) modules
106 ds' <- parseProg (defaultSyntax {syn_namespace = reverse mname })
108 unless (null ds') $ do
109 let ds = namespaces mname ds'
110 logLvl 3 (dumpDecls ds)
112 logLvl 10 (show (toAlist (idris_implicits i)))
113 logLvl 3 (show (idris_infixes i))
114 -- Now add all the declarations to the context
116 when v $ iputStrLn $ "Type checking " ++ f
117 elabDecls toplevel ds
119 -- simplify every definition do give the totality checker
121 mapM_ (\n -> do logLvl 5 $ "Simplifying " ++ show n
122 updateContext (simplifyCasedef n))
123 (map snd (idris_totcheck i))
124 -- build size change graph from simplified definitions
125 iLOG "Totality checking"
127 mapM_ buildSCG (idris_totcheck i)
128 mapM_ checkDeclTotality (idris_totcheck i)
129 iLOG ("Finished " ++ f)
130 ibcsd <- valIBCSubDir i
131 let ibc = ibcPathNoFallback ibcsd f
132 iLOG "Universe checking"
135 addHides (hide_list i)
138 idrisCatch (do writeIBC f ibc; clearIBC)
139 (\c -> return ()) -- failure is harmless
141 putIState (i { default_total = def_total,
146 namespaces [] ds = ds
147 namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]
149addHides :: [(Name, Maybe Accessibility)] -> Idris ()
150addHides xs = do i <- getIState
151 let defh = default_access i
152 let (hs, as) = partition isNothing xs
155 (map (\ (n, _) -> (n, defh)) hs ++
156 map (\ (n, Just a) -> (n, a)) as)
157 where isNothing (_, Nothing) = True
160 doHide (n, a) = do setAccessibility n a
161 addIBC (IBCAccess n a)
163parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"
164parseTac i = runParser (do t <- pTactic defaultSyntax
166 return t) i "(proof)"
168parseImports :: FilePath -> String -> Idris ([String], [String], String, SourcePos)
169parseImports fname input
171 case runParser (do whiteSpace
176 return ((mname, ps, rest, pos), i)) i fname input of
177 Left err -> fail (show err)
178 Right (x, i) -> do putIState i
181pHeader :: IParser [String]
182pHeader = try (do reserved "module"; i <- identifier; option ';' (lchar ';')
183 return (parseName i))
185 where parseName x = case span (/='.') x of
187 (x, '.':y) -> x : parseName y
189pushIndent :: IParser ()
190pushIndent = do pos <- getPosition
192 setState (ist { indent_stack = sourceColumn pos :
195lastIndent :: IParser Int
196lastIndent = do ist <- getState
197 case indent_stack ist of
202indent = liftM sourceColumn getPosition
204popIndent :: IParser ()
205popIndent = do ist <- getState
206 let (x : xs) = indent_stack ist
207 setState (ist { indent_stack = xs })
209openBlock :: IParser ()
210openBlock = do lchar '{'
212 setState (ist { brace_stack = Nothing : brace_stack ist })
213 <|> do ist <- getState
215 setState (ist { brace_stack = Just lvl : brace_stack ist })
217closeBlock :: IParser ()
218closeBlock = do ist <- getState
219 bs <- case brace_stack ist of
220 [] -> eof >> return []
221 Nothing : xs -> (lchar '}' >> return xs) <|> (eof >> return [])
222 Just lvl : xs -> (do i <- indent
224-- trace (show (take 10 inp, i, lvl)) $
225 if i >= lvl && take 1 inp /= ")"
226 then fail "Not end of block"
227 else return xs) <|> (eof >> return [])
228 setState (ist { brace_stack = bs })
230pTerminator = do lchar ';'; popIndent
231 <|> do c <- indent; l <- lastIndent
234 else fail "Not a terminator"
236 if "}" `isPrefixOf` i || ")" `isPrefixOf` i
238 else fail "Not a terminator"
242 = do lchar '|'; return ()
243 <|> do c <- indent; l <- lastIndent
244 unless (c <= l) $ fail "Not a terminator"
248 = do lchar ';'; return ()
249 <|> do c <- indent; l <- lastIndent
250 unless (c <= l) $ fail "Not a terminator"
253 unless (h `elem` ["}", ")", "|"]) $ fail "Not a terminator"
256notEndApp = do c <- indent; l <- lastIndent
258 when (c <= l) $ fail "Terminator"
260notEndBlock = do ist <- getState
261 case brace_stack ist of
262 Just lvl : xs -> do i <- indent
264 when (i < lvl || ")" `isPrefixOf` inp) $ fail "End of block"
267-- | Use Parsec's internal state to construct a source code position
269pfc = do s <- getPosition
270 let (dir, file) = splitFileName (sourceName s)
271 let f = if dir == addTrailingPathSeparator "." then file else sourceName s
272 return $ FC f (sourceLine s)
274pImport :: IParser String
275pImport = do reserved "import"; f <- identifier; option ';' (lchar ';')
277 where toPath n = foldl1' (</>) $ splitOn "." n
279-- | A program is a list of declarations, possibly with associated
280-- documentation strings.
281parseProg :: SyntaxInfo -> FilePath -> String -> SourcePos ->
283parseProg syn fname input pos
285 case runParser (do setPosition pos
287 ps <- many (pDecl syn)
290 return (concat ps, i')) i fname input of
291 Left err -> do iputStrLn (show err)
293 Right (x, i) -> do putIState i
296-- | Collect 'PClauses' with the same function name
297collect :: [PDecl] -> [PDecl]
298collect (c@(PClauses _ o _ _) : ds)
299 = clauses (cname c) [] (c : ds)
300 where clauses j@(Just n) acc (PClauses fc _ _ [PClause fc' n' l ws r w] : ds)
301 | n == n' = clauses j (PClause fc' n' l ws r (collect w) : acc) ds
302 clauses j@(Just n) acc (PClauses fc _ _ [PWith fc' n' l ws r w] : ds)
303 | n == n' = clauses j (PWith fc' n' l ws r (collect w) : acc) ds
304 clauses (Just n) acc xs = PClauses (getfc c) o n (reverse acc) : collect xs
305 clauses Nothing acc (x:xs) = collect xs
306 clauses Nothing acc [] = []
308 cname (PClauses fc _ _ [PClause _ n _ _ _ _]) = Just n
309 cname (PClauses fc _ _ [PWith _ n _ _ _ _]) = Just n
310 cname (PClauses fc _ _ [PClauseR _ _ _ _]) = Nothing
311 cname (PClauses fc _ _ [PWithR _ _ _ _]) = Nothing
312 getfc (PClauses fc _ _ _) = fc
314collect (PParams f ns ps : ds) = PParams f ns (collect ps) : collect ds
315collect (PMutual f ms : ds) = PMutual f (collect ms) : collect ds
316collect (PNamespace ns ps : ds) = PNamespace ns (collect ps) : collect ds
317collect (PClass doc f s cs n ps ds : ds')
318 = PClass doc f s cs n ps (collect ds) : collect ds'
319collect (PInstance f s cs n ps t en ds : ds')
320 = PInstance f s cs n ps t en (collect ds) : collect ds'
321collect (d : ds) = d : collect ds
324pFullExpr :: SyntaxInfo -> IParser PTerm
326 = do x <- pExpr syn; eof;
328 return $ desugar syn i x
330-- | Parse a top-level declaration
331pDecl :: SyntaxInfo -> IParser [PDecl]
332pDecl syn = do notEndBlock
337 let d' = fmap (desugar syn i) d
345 <|> do d <- pDSL syn; return [d]
348 <|> try (do reserved "import"; fp <- identifier
349 fail "imports must be at the top of file")
351pFunDecl :: SyntaxInfo -> IParser [PDecl]
353 = try (do notEndBlock
356 let d' = fmap (desugar syn i) d
359--------- Top Level Declarations ---------
361pDecl' :: SyntaxInfo -> IParser PDecl
364 <|> try (pFunDecl' syn)
366 <|> try (pRecord syn)
367 <|> try (pSyntaxDecl syn)
369pSyntaxDecl :: SyntaxInfo -> IParser PDecl
371 = do s <- pSyntaxRule syn
373 let rs = syntax_rules i
374 let ns = syntax_keywords i
375 let ibc = ibc_write i
376 let ks = map show (names s)
377 setState (i { syntax_rules = s : rs,
378 syntax_keywords = ks ++ ns,
379 ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc
382 return (PSyntax fc s)
384 names (Rule syms _ _) = mapMaybe ename syms
385 ename (Keyword n) = Just n
388pSyntaxRule :: SyntaxInfo -> IParser Syntax
391 sty <- option AnySyntax (do reserved "term"; return TermSyntax
392 <|> do reserved "pattern"; return PatternSyntax)
394 syms <- many1 pSynSym
395 when (all expr syms) $ fail "No keywords in syntax rule"
396 let ns = mapMaybe name syms
397 when (length ns /= length (nub ns))
398 $ fail "Repeated variable in syntax rule"
400 tm <- pTExpr (impOK syn)
402 return (Rule (mkSimple syms) tm sty)
406 name (Expr n) = Just n
409 -- Can't parse two full expressions (i.e. expressions with application) in a row
410 -- so change them both to a simple expression
412 mkSimple (Expr e : es) = SimpleExpr e : mkSimple' es
413 mkSimple xs = mkSimple' xs
415 mkSimple' (Expr e : Expr e1 : es) = SimpleExpr e : SimpleExpr e1 :
417 mkSimple' (e : es) = e : mkSimple' es
420pSynSym :: IParser SSymbol
421pSynSym = try (do lchar '['; n <- pName; lchar ']'
423 <|> try (do lchar '{'; n <- pName; lchar '}'
430pFunDecl' :: SyntaxInfo -> IParser PDecl
431pFunDecl' syn = try (do doc <- option "" (pDocComment '|')
434 let initOpts = if default_total ist
437 opts <- pFnOpts initOpts
438 acc <- pAccessibility
439 opts' <- pFnOpts opts
441 let n = expandNS syn n_in
443 ty <- pTSig (impOK syn)
445-- ty' <- implicit syn n ty
447 return (PTy doc syn fc opts' n ty))
448 <|> try (pPostulate syn)
449 <|> try (pPattern syn)
452pPostulate :: SyntaxInfo -> IParser PDecl
453pPostulate syn = do doc <- option "" (pDocComment '|')
457 let initOpts = if default_total ist
460 opts <- pFnOpts initOpts
461 acc <- pAccessibility
462 opts' <- pFnOpts opts
464 let n = expandNS syn n_in
465 ty <- pTSig (impOK syn)
469 return (PPostulate doc syn fc opts' n ty)
472pUsing :: SyntaxInfo -> IParser [PDecl]
474 do reserved "using"; lchar '('; ns <- usingDeclList syn; lchar ')'
476 let uvars = using syn
477 ds <- many1 (pDecl (syn { using = uvars ++ ns }))
481pParams :: SyntaxInfo -> IParser [PDecl]
483 do reserved "parameters"; lchar '('; ns <- tyDeclList syn; lchar ')'
485 let pvars = syn_params syn
486 ds <- many1 (pDecl syn { syn_params = pvars ++ ns })
489 return [PParams fc ns (concat ds)]
491pMutual :: SyntaxInfo -> IParser [PDecl]
495 let pvars = syn_params syn
496 ds <- many1 (pDecl syn)
499 return [PMutual fc (concat ds)]
501pNamespace :: SyntaxInfo -> IParser [PDecl]
503 do reserved "namespace"; n <- identifier;
505 ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })
507 return [PNamespace n (concat ds)]
509--------- Fixity ---------
511pFixity :: IParser PDecl
512pFixity = do pushIndent
513 f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
515 let prec = fromInteger i
517 let infixes = idris_infixes istate
518 let fs = map (Fix (f prec)) ops
519 let redecls = map (alreadyDeclared infixes) fs
520 let ill = filter (not . checkValidity) redecls
522 then do setState (istate { idris_infixes = nub $ sort (fs ++ infixes)
523 , ibc_write = map IBCFix fs ++ ibc_write istate
526 return (PFix fc (f prec) ops)
527 else fail $ concatMap (\(f, (x:xs)) -> "Illegal redeclaration of fixity:\n\t\""
528 ++ show f ++ "\" overrides \"" ++ show x ++ "\"") ill
529 where alreadyDeclared :: [FixDecl] -> FixDecl -> (FixDecl, [FixDecl])
530 alreadyDeclared fs f = (f, filter ((extractName f ==) . extractName) fs)
532 checkValidity :: (FixDecl, [FixDecl]) -> Bool
533 checkValidity (f, fs) = all (== f) fs
535 extractName :: FixDecl -> String
536 extractName (Fix _ n) = n
538fixity :: IParser (Int -> Fixity)
539fixity = try (do reserved "infixl"; return Infixl)
540 <|> try (do reserved "infixr"; return Infixr)
541 <|> try (do reserved "infix"; return InfixN)
542 <|> try (do reserved "prefix"; return PrefixN)
544--------- Type classes ---------
546pClass :: SyntaxInfo -> IParser [PDecl]
547pClass syn = do doc <- option "" (pDocComment '|')
548 acc <- pAccessibility
549 reserved "class"; fc <- pfc; cons <- pConstList syn; n_in <- pName
550 let n = expandNS syn n_in
552 reserved "where"; openBlock
553 ds <- many $ pFunDecl syn
555 let allDs = concat ds
556 accData acc n (concatMap declared allDs)
557 return [PClass doc syn fc cons n cs allDs]
559 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
564pInstance :: SyntaxInfo -> IParser [PDecl]
565pInstance syn = do reserved "instance"; fc <- pfc
567 (do lchar '['; n_in <- pfName; lchar ']'
568 let n = expandNS syn n_in
572 args <- many (pSimpleExpr syn)
573 let sc = PApp fc (PRef fc cn) (map pexp args)
574 let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc
575 reserved "where"; openBlock
576 ds <- many $ pFunDecl syn
578 return [PInstance syn fc cs cn args t en (concat ds)]
580--------- Expressions ---------
582pExpr syn = do i <- getState
583 buildExpressionParser (table (idris_infixes i)) (pExpr' syn)
585pExpr' :: SyntaxInfo -> IParser PTerm
590pExtExpr :: SyntaxInfo -> IParser PTerm
591pExtExpr syn = do i <- getState
592 pExtensions syn (syntax_rules i)
594pSimpleExtExpr :: SyntaxInfo -> IParser PTerm
595pSimpleExtExpr syn = do i <- getState
596 pExtensions syn (filter simple (syntax_rules i))
598 simple (Rule (Expr x:xs) _ _) = False
599 simple (Rule (SimpleExpr x:xs) _ _) = False
600 simple (Rule [Keyword _] _ _) = True
601 simple (Rule [Symbol _] _ _) = True
602 simple (Rule (_:xs) _ _) = case last xs of
610 <|> try (pMatchApp syn)
611 <|> try (pUnifyLog syn)
613 <|> try (pSimpleExpr syn)
620pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
621pExtensions syn rules = choice (map (try . pExt syn) (filter valid rules))
623 valid (Rule _ _ AnySyntax) = True
624 valid (Rule _ _ PatternSyntax) = inPattern syn
625 valid (Rule _ _ TermSyntax) = not (inPattern syn)
628data SynMatch = SynTm PTerm | SynBind Name
630pExt :: SyntaxInfo -> Syntax -> IParser PTerm
631pExt syn (Rule ssym ptm _)
632 = do smap <- mapM pSymbol ssym
633 let ns = mapMaybe id smap
634 return (update ns ptm) -- updated with smap
636 pSymbol (Keyword n) = do reserved (show n); return Nothing
637 pSymbol (Expr n) = do tm <- pExpr syn
638 return $ Just (n, SynTm tm)
639 pSymbol (SimpleExpr n) = do tm <- pSimpleExpr syn
640 return $ Just (n, SynTm tm)
641 pSymbol (Binding n) = do b <- pName
642 return $ Just (n, SynBind b)
643 pSymbol (Symbol s) = do symbol s
646 dropn n ((x,t) : xs) | n == x = xs
647 | otherwise = (x,t):dropn n xs
649 updateB ns n = case lookup n ns of
650 Just (SynBind t) -> t
653 update ns (PRef fc n) = case lookup n ns of
656 update ns (PLam n ty sc) = PLam (updateB ns n) (update ns ty) (update (dropn n ns) sc)
657 update ns (PPi p n ty sc) = PPi p (updateB ns n) (update ns ty) (update (dropn n ns) sc)
658 update ns (PLet n ty val sc) = PLet (updateB ns n) (update ns ty) (update ns val)
659 (update (dropn n ns) sc)
660 update ns (PApp fc t args) = PApp fc (update ns t) (map (fmap (update ns)) args)
661 update ns (PCase fc c opts) = PCase fc (update ns c) (map (pmap (update ns)) opts)
662 update ns (PPair fc l r) = PPair fc (update ns l) (update ns r)
663 update ns (PDPair fc l t r) = PDPair fc (update ns l) (update ns t) (update ns r)
664 update ns (PAlternative a as) = PAlternative a (map (update ns) as)
665 update ns (PHidden t) = PHidden (update ns t)
666 update ns (PDoBlock ds) = PDoBlock $ upd ns ds
667 where upd ns (DoExp fc t : ds) = DoExp fc (update ns t) : upd ns ds
668 upd ns (DoBind fc n t : ds) = DoBind fc n (update ns t) : upd (dropn n ns) ds
669 upd ns (DoLet fc n ty t : ds) = DoLet fc n (update ns ty) (update ns t)
670 : upd (dropn n ns) ds
671 upd ns (DoBindP fc i t : ds) = DoBindP fc (update ns i) (update ns t)
673 upd ns (DoLetP fc i t : ds) = DoLetP fc (update ns i) (update ns t)
677pName = do i <- getState
678 iName (syntax_keywords i)
679 <|> do reserved "instance"
681 UN n <- iName (syntax_keywords i)
684-- | Parser for an operator in function position, i.e. enclosed by `()', with an
685-- optional namespace.
686pOpFront = maybeWithNS pOpFrontNoNS False []
687 where pOpFrontNoNS = do lchar '('; o <- operator; lchar ')'; return o
692pTotality :: IParser Bool
694 = do reserved "total"; return True
695 <|> do reserved "partial"; return False
697pAccessibility' :: IParser Accessibility
699 = do reserved "public"; return Public
700 <|> do reserved "abstract"; return Frozen
701 <|> do reserved "private"; return Hidden
703pAccessibility :: IParser (Maybe Accessibility)
705 = do acc <- pAccessibility'; return (Just acc)
708pFnOpts :: [FnOpt] -> IParser [FnOpt]
710 = do reserved "total"; pFnOpts (TotalFn : opts)
711 <|> do reserved "partial"; pFnOpts (PartialFn : (opts \\ [TotalFn]))
712 <|> try (do lchar '%'; reserved "export"; c <- strlit;
713 pFnOpts (CExport c : opts))
714 <|> do lchar '%'; reserved "assert_total"; pFnOpts (AssertTotal : opts)
715 <|> do lchar '%'; reserved "specialise";
716 lchar '['; ns <- sepBy pfName (lchar ','); lchar ']'
717 pFnOpts (Specialise ns : opts)
718 <|> do reserved "implicit"; pFnOpts (Implicit : opts)
721addAcc :: Name -> Maybe Accessibility -> IParser ()
722addAcc n a = do i <- getState
723 setState (i { hide_list = (n, a) : hide_list i })
726 reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
729 opts <- many1 (do notEndBlock
732 return x) -- sepBy1 (pCaseOpt syn) (lchar '|')
735 return (PCase fc scr opts)
738 reserved "proof"; lchar '{'
739 ts <- endBy (pTactic syn) (lchar ';')
744 reserved "tactics"; lchar '{'
745 ts <- endBy (pTactic syn) (lchar ';')
750 try (do symbol "!["; t <- pTerm; lchar ']'; return $ PQuote t)
751 <|> do lchar '?'; x <- pName; return (PMetavar x)
752 <|> do lchar '%'; fc <- pfc; reserved "instance"; return (PResolveTC fc)
753 <|> do reserved "refl"; fc <- pfc;
754 tm <- option Placeholder (do lchar '{'; t <- pExpr syn; lchar '}';
757-- <|> do reserved "return"; fc <- pfc; return (PReturn fc)
761 <|> try (do x <- pfName
764 <|> try (do lchar '!'; x <- pfName
766 return (PInferRef fc x))
768 <|> try (pComprehension syn)
771 <|> try (do lchar '('
772 bracketed (noImp syn))
773 <|> try (do c <- pConstant
775 return (modifyConst syn fc (PConstant c)))
776 <|> do reserved "Type"; return PType
777 <|> try (do symbol "()"
780 <|> try (do symbol "_|_"
783 <|> do lchar '_'; return Placeholder
784 <|> pSimpleExtExpr syn
788 <|> try (do e <- pExpr syn; lchar ')'; return e)
789-- <|> try (do reserved "typed"
790-- e <- pExpr syn; symbol ":"; t <- pExpr syn; lchar ')'
791-- return (PTyped e t))
792 <|> try (do fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
793 return $ PLam (MN 1000 "ARG") Placeholder
794 (PApp fc (PRef fc (UN o)) [pexp (PRef fc (MN 1000 "ARG")),
796 <|> try (do fc <- pfc; e <- pSimpleExpr syn; o <- operator; lchar ')'
797 return $ PLam (MN 1000 "ARG") Placeholder
798 (PApp fc (PRef fc (UN o)) [pexp e,
799 pexp (PRef fc (MN 1000 "ARG"))]))
801pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)
802pCaseOpt syn = do lhs <- pExpr (syn { inPattern = True })
803 symbol "=>"; rhs <- pExpr syn
806-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
807-- big integer, otherwise try fromInteger and the constants as alternatives.
808-- a better solution would be to fix fromInteger to work with Integer, as the
809-- name suggests, rather than Int
811modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm
812modifyConst syn fc (PConstant (BI x))
813 | not (inPattern syn)
815 (PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (BI (fromInteger x)))]
817 | otherwise = PAlternative False consts
819 consts = [ PConstant (BI x)
820 , PConstant (I (fromInteger x))
821 , PConstant (B8 (fromInteger x))
822 , PConstant (B16 (fromInteger x))
823 , PConstant (B32 (fromInteger x))
824 , PConstant (B64 (fromInteger x))
826modifyConst syn fc x = x
829pList syn = do lchar '['; fc <- pfc; xs <- sepBy (pExpr syn) (lchar ','); lchar ']'
830 return (mkList fc xs)
832 mkList fc [] = PRef fc (UN "Nil")
833 mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)]
835pPair syn = try (do l <- pExpr syn
840 [Left r] -> return (PPair fc l r)
841 [Right r] -> return (PDPair fc l Placeholder r))
842 <|> try (do x <- ntuple
845 <|> do ln <- pName; lchar ':'
851 return (PDPair fc (PRef fc ln) lty r)
853 restTuple = do lchar ')'; return []
858 <|> do reservedOp "**"
862 ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','
864 return (PPair fc l rest))
865 <|> (do l <- pExpr syn; fc <- pfc; lchar ','
867 return (PPair fc l r))
869pAlt syn = do symbol "(|"; alts <- sepBy1 (pExpr' syn) (lchar ','); symbol "|)"
870 return (PAlternative False alts)
878pMatchApp syn = do ty <- pSimpleExpr syn
882 return (PLet (MN 0 "match")
885 (PRef fc (MN 0 "match")))
887pUnifyLog syn = do lchar '%'; reserved "unifyLog";
888 tm <- pSimpleExpr syn
889 return (PUnifyLog tm)
891pApp syn = do f <- pSimpleExpr syn
893 args <- many1 (do notEndApp
896 return (dslify i $ PApp fc f args)
898 dslify i (PApp fc (PRef _ f) [a])
899 | [d] <- lookupCtxt f (idris_dsls i)
900 = desugar (syn { dsl_info = d }) i (getTm a)
903pArg :: SyntaxInfo -> IParser PArg
904pArg syn = try (pImplicitArg syn)
905 <|> try (pConstraintArg syn)
906 <|> do e <- pSimpleExpr syn
909pImplicitArg syn = do lchar '{'
912 v <- option (PRef fc n) (do lchar '='
917pConstraintArg syn = do symbol "@{"
923 = do reserved "record"
925 fields <- sepBy1 pFieldType (lchar ',')
928 rec <- option Nothing (do e <- pSimpleExpr syn
932 return (PLam (MN 0 "fldx") Placeholder
933 (applyAll fc fields (PRef fc (MN 0 "fldx"))))
934 Just v -> return (applyAll fc fields v)
935 where pFieldType = do n <- pfName
940 applyAll fc ((n, e) : es) x
941 = applyAll fc es (PApp fc (PRef fc (mkType n)) [pexp e, pexp x])
943mkType (UN n) = UN ("set_" ++ n)
944mkType (MN 0 n) = MN 0 ("set_" ++ n)
945mkType (NS n s) = NS (mkType n) s
947noImp syn = syn { implicitAllowed = False }
948impOK syn = syn { implicitAllowed = True }
950pTSig syn = do lchar ':'; pTExpr syn
952pTExpr syn = do cs <- if implicitAllowed syn then pConstList syn else return []
954 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
956pLambda syn = do lchar '\\'
957 try (do xt <- tyOptDeclList syn
960 return (bindList PLam xt sc)
961 <|> (do ps <- sepBy (do fc <- pfc
963 return (fc, e)) (lchar ',')
966 return (pmList (zip [0..] ps) sc)))
967 where pmList [] sc = sc
968 pmList ((i, (fc, x)) : xs) sc
969 = PLam (MN i "lamp") Placeholder
970 (PCase fc (PRef fc (MN i "lamp"))
974 do reserved "rewrite"
977 giving <- option Nothing
978 (do symbol "==>"; tm <- pExpr' syn
980 reserved "in"; sc <- pExpr syn
982 (PApp fc (PRef fc (UN "sym")) [pexp prf]) sc
985pLet syn = try (do reserved "let"; n <- pName;
986 ty <- option Placeholder (do lchar ':'; pExpr' syn)
989 reserved "in"; sc <- pExpr syn
990 return (PLet n ty v sc))
991 <|> (do reserved "let"; fc <- pfc; pat <- pExpr' (syn { inPattern = True } )
992 symbol "="; v <- pExpr syn
993 reserved "in"; sc <- pExpr syn
994 return (PCase fc v [(pat, sc)]))
997 try (do lazy <- if implicitAllowed syn -- laziness is top level only
998 then option False (do lchar '|'; return True)
1001 lchar '('; xt <- tyDeclList syn; lchar ')'
1002 doc <- option "" (pDocComment '^')
1005 return (bindList (PPi (Exp lazy st doc)) xt sc))
1006 <|> try (if implicitAllowed syn
1007 then do lazy <- option False (do lchar '|'
1011 xt <- tyDeclList syn
1015 return (bindList (PPi (Imp lazy st "")) xt sc)
1016 else fail "No implicit arguments allowed here")
1017 <|> try (do lchar '{'
1019 xt <- tyDeclList syn
1023 return (bindList (PPi
1024 (TacImp False Dynamic (PTactics [Trivial]) "")) xt sc))
1025 <|> try (do lchar '{'
1027 script <- pSimpleExpr syn
1028 xt <- tyDeclList syn
1032 return (bindList (PPi (TacImp False Dynamic script "")) xt sc))
1033 <|> do --lazy <- option False (do lchar '|'; return True)
1040 return (PPi (Exp False Static "") (MN 42 "__pi_arg") t sc)
1042pConstList :: SyntaxInfo -> IParser [PTerm]
1043pConstList syn = try (do lchar '('
1044 tys <- sepBy1 (pExpr' (noImp syn)) (lchar ',')
1048 <|> try (do t <- pExpr (noImp syn)
1054 = try (sepBy1 (usingDecl syn) (lchar ','))
1055 <|> do ns <- sepBy1 pName (lchar ',')
1056 t <- pTSig (noImp syn)
1057 return (map (\x -> UImplicit x t) ns)
1059usingDecl syn = try (do x <- pfName
1060 t <- pTSig (noImp syn)
1061 return (UImplicit x t))
1064 return (UConstraint c xs)
1066tyDeclList syn = try (sepBy1 (do x <- pfName
1067 t <- pTSig (noImp syn)
1070 <|> do ns <- sepBy1 pName (lchar ',')
1071 t <- pTSig (noImp syn)
1072 return (map (\x -> (x, t)) ns)
1074tyOptDeclList syn = sepBy1 (do x <- pfName;
1075 t <- option Placeholder (do lchar ':'
1080bindList b [] sc = sc
1081bindList b ((n, t):bs) sc = b n t (bindList b bs sc)
1088 qs <- sepBy1 (pDo syn) (lchar ',')
1090 return (PDoBlock (map addGuard qs ++
1091 [DoExp fc (PApp fc (PRef fc (UN "return"))
1093 where addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc (UN "guard"))
1101 ds <- many1 (do notEndBlock
1107 return (PDoBlock ds)
1110 = try (do reserved "let"
1112 ty <- option Placeholder (do lchar ':'
1117 return (DoLet fc i ty e))
1118 <|> try (do reserved "let"
1123 return (DoLetP fc i sc))
1124 <|> try (do i <- pName
1128 return (DoBind fc i e))
1129 <|> try (do i <- pExpr' syn
1133 return (DoBindP fc i e))
1134 <|> try (do e <- pExpr syn
1136 return (DoExp fc e))
1143 return (PIdiom fc e)
1145pConstant :: IParser Const
1146pConstant = do reserved "Integer";return (AType (ATInt ITBig))
1147 <|> do reserved "Int"; return (AType (ATInt ITNative))
1148 <|> do reserved "Char"; return (AType (ATInt ITChar))
1149 <|> do reserved "Float"; return (AType ATFloat)
1150 <|> do reserved "String"; return StrType
1151 <|> do reserved "Ptr"; return PtrType
1152 <|> do reserved "Bits8"; return (AType (ATInt (ITFixed IT8)))
1153 <|> do reserved "Bits16"; return (AType (ATInt (ITFixed IT16)))
1154 <|> do reserved "Bits32"; return (AType (ATInt (ITFixed IT32)))
1155 <|> do reserved "Bits64"; return (AType (ATInt (ITFixed IT64)))
1156 <|> do reserved "Bits8x16"; return (AType (ATInt (ITVec IT8 16)))
1157 <|> do reserved "Bits16x8"; return (AType (ATInt (ITVec IT16 8)))
1158 <|> do reserved "Bits32x4"; return (AType (ATInt (ITVec IT32 4)))
1159 <|> do reserved "Bits64x2"; return (AType (ATInt (ITVec IT64 2)))
1160 <|> try (do f <- float; return $ Fl f)
1161 <|> try (do i <- natural; return $ BI i)
1162 <|> try (do s <- strlit; return $ Str s)
1163 <|> try (do c <- chlit; return $ Ch c)
1165pStatic :: IParser Static
1166pStatic = do lchar '['
1173 = [[prefix "-" (\fc x -> PApp fc (PRef fc (UN "-"))
1174 [pexp (PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (BI 0))]), pexp x])]]
1175 ++ toTable (reverse fixes) ++
1177 [binary "=" PEq AssocLeft],
1178 [binary "->" (\fc x y -> PPi expl (MN 42 "__pi_arg") x y) AssocRight]]
1180toTable fs = map (map toBin)
1181 (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)
1182 where toBin (Fix (PrefixN _) op) = prefix op
1183 (\fc x -> PApp fc (PRef fc (UN op)) [pexp x])
1185 = binary op (\fc x y -> PApp fc (PRef fc (UN op)) [pexp x,pexp y]) (assoc f)
1186 assoc (Infixl _) = AssocLeft
1187 assoc (Infixr _) = AssocRight
1188 assoc (InfixN _) = AssocNone
1190binary name f = Infix (do fc <- pfc
1192 doc <- option "" (pDocComment '^')
1194prefix name f = Prefix (do reservedOp name
1197backtick = Infix (do lchar '`'; n <- pfName
1200 return (\x y -> PApp fc (PRef fc n) [pexp x, pexp y])) AssocNone
1202--------- Data declarations ---------
1204-- (works for classes too - 'abstract' means the data/class is visible but members not)
1205accData :: Maybe Accessibility -> Name -> [Name] -> IParser ()
1206accData (Just Frozen) n ns = do addAcc n (Just Frozen)
1207 mapM_ (\n -> addAcc n (Just Hidden)) ns
1208accData a n ns = do addAcc n a
1209 mapM_ (`addAcc` a) ns
1211pRecord :: SyntaxInfo -> IParser PDecl
1212pRecord syn = do doc <- option "" (pDocComment '|')
1213 acc <- pAccessibility
1217 ty <- pTSig (impOK syn)
1218 let tyn = expandNS syn tyn_in
1222 (cdoc, cn, cty, _) <- pConstructor syn
1226 accData acc tyn [cn]
1227 let rsyn = syn { syn_namespace = show (nsroot tyn) :
1229 let fns = getRecNames rsyn cty
1230 mapM_ (\n -> addAcc n acc) fns
1231 return $ PRecord doc rsyn fc tyn ty cdoc cn cty
1233 getRecNames syn (PPi _ n _ sc) = [expandNS syn n, expandNS syn (mkType n)]
1234 ++ getRecNames syn sc
1235 getRecNames _ _ = []
1237 toFreeze (Just Frozen) = Just Hidden
1240pDataI = do reserved "data"; return False
1241 <|> do reserved "codata"; return True
1243pData :: SyntaxInfo -> IParser PDecl
1244pData syn = try (do doc <- option "" (pDocComment '|')
1245 acc <- pAccessibility
1249 ty <- pTSig (impOK syn)
1250 let tyn = expandNS syn tyn_in
1251 option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1255 cons <- many (do notEndBlock
1256 c <- pConstructor syn
1258 return c) -- (lchar '|')
1261 accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1262 return $ PData doc syn fc co (PDatadecl tyn ty cons)))
1263 <|> try (do doc <- option "" (pDocComment '|')
1265 acc <- pAccessibility
1270 let ty = bindArgs (map (const PType) args) PType
1271 let tyn = expandNS syn tyn_in
1272 option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1273 try (lchar '=') <|> do reserved "where"
1274 let kw = (if co then "co" else "") ++ "data "
1275 let n = show tyn_in ++ " "
1277 let as = concat (intersperse " " $ map show args) ++ " "
1278 let ns = concat (intersperse " -> " $ map ((\x -> "(" ++ x ++ " : Type)") . show) args)
1279 let ss = concat (intersperse " -> " $ map (const "Type") args)
1280 let fix1 = s ++ as ++ " = ..."
1281 let fix2 = s ++ ": " ++ ns ++ " -> Type where\n ..."
1282 let fix3 = s ++ ": " ++ ss ++ " -> Type where\n ..."
1283 fail $ fixErrorMsg "unexpected \"where\"" [fix1, fix2, fix3]
1285 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
1287 let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
1288 cons' <- mapM (\ (doc, x, cargs, cfc) ->
1289 do let cty = bindArgs cargs conty
1290 return (doc, x, cty, cfc)) cons
1291 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
1292 return $ PData doc syn fc co (PDatadecl tyn ty cons')))
1295 mkPApp fc t xs = PApp fc t (map pexp xs)
1297bindArgs :: [PTerm] -> PTerm -> PTerm
1298bindArgs xs t = foldr (PPi expl (MN 0 "t")) t xs
1300pConstructor :: SyntaxInfo -> IParser (String, Name, PTerm, FC)
1302 = do doc <- option "" (pDocComment '|')
1303 cn_in <- pfName; fc <- pfc
1304 let cn = expandNS syn cn_in
1305 ty <- pTSig (impOK syn)
1306-- ty' <- implicit syn cn ty
1307 return (doc, cn, ty, fc)
1310pSimpleCon :: SyntaxInfo -> IParser (String, Name, [PTerm], FC)
1312 = do cn_in <- pfName
1313 let cn = expandNS syn cn_in
1315 args <- many (do notEndApp
1317 doc <- option "" (pDocComment '^')
1318 return (doc, cn, args, fc)
1320--------- DSL syntax overloading ---------
1322pDSL :: SyntaxInfo -> IParser PDecl
1323pDSL syn = do reserved "dsl"
1327 bs <- many1 (do notEndBlock
1331 popIndent; closeBlock
1332 let dsl = mkDSL bs (dsl_info syn)
1335 setState (i { idris_dsls = addDef n dsl (idris_dsls i) })
1337 where mkDSL bs dsl = let var = lookup "variable" bs
1338 first = lookup "index_first" bs
1339 next = lookup "index_next" bs
1340 leto = lookup "let" bs
1341 lambda = lookup "lambda" bs in
1342 initDSL { dsl_var = var,
1343 index_first = first,
1345 dsl_lambda = lambda,
1348checkDSL :: DSL -> IParser ()
1349checkDSL dsl = return ()
1351pOverload :: SyntaxInfo -> IParser (String, PTerm)
1352pOverload syn = do o <- identifier <|> do reserved "let"
1354 if o `notElem` overloadable
1355 then fail $ show o ++ " is not an overloading"
1360 where overloadable = ["let","lambda","index_first","index_next","variable"]
1362--------- Pattern match clauses ---------
1364pPattern :: SyntaxInfo -> IParser PDecl
1365pPattern syn = do fc <- pfc
1366 clause <- pClause syn
1367 return (PClauses fc [] (MN 2 "_") [clause]) -- collect together later
1369pCAF :: SyntaxInfo -> IParser PDecl
1370pCAF syn = do reserved "let"
1371 n_in <- pfName; let n = expandNS syn n_in
1376 return (PCAF fc n t)
1378pArgExpr syn = let syn' = syn { inPattern = True } in
1379 try (pHSimpleExpr syn') <|> pSimpleExtExpr syn'
1381pRHS :: SyntaxInfo -> Name -> IParser PTerm
1382pRHS syn n = do lchar '='; pExpr syn
1383 <|> do symbol "?="; rhs <- pExpr syn;
1385 <|> do reserved "impossible"; return PImpossible
1386 where mkN (UN x) = UN (x++"_lemma_1")
1387 mkN (NS x n) = NS (mkN x) n
1390 addLet (PLet n ty val rhs) = PLet n ty val (addLet rhs)
1391 addLet (PCase fc t cs) = PCase fc t (map addLetC cs)
1392 where addLetC (l, r) = (l, addLet r)
1393 addLet rhs = (PLet (UN "value") Placeholder rhs (PMetavar n'))
1395pClause :: SyntaxInfo -> IParser PClause
1397 = try (do pushIndent
1398 n_in <- pfName; let n = expandNS syn n_in
1399 cargs <- many (pConstraintArg syn)
1400 iargs <- many (pImplicitArg (syn { inPattern = True } ))
1402 args <- many (try (pImplicitArg (syn { inPattern = True } ))
1403 <|> (fmap pexp (pArgExpr syn)))
1404 wargs <- many (pWExpr syn)
1407 let ctxt = tt_ctxt ist
1408 let wsyn = syn { syn_namespace = [] }
1409 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1414 let capp = PApp fc (PRef fc n)
1415 (iargs ++ cargs ++ args)
1417 setState (ist { lastParse = Just n })
1418 return $ PClause fc n capp wargs rhs wheres)
1419 <|> try (do pushIndent
1420 ty <- pSimpleExpr syn
1423 n_in <- pfName; let n = expandNS syn n_in
1426 let ctxt = tt_ctxt ist
1427 let wsyn = syn { syn_namespace = [] }
1428 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1433 let capp = PLet (MN 0 "match")
1436 (PRef fc (MN 0 "match"))
1438 setState (ist { lastParse = Just n })
1439 return $ PClause fc n capp [] rhs wheres)
1440 <|> try (do pushIndent
1441 wargs <- many1 (pWExpr syn)
1443 n <- case lastParse ist of
1445 Nothing -> fail "Invalid clause"
1448 let ctxt = tt_ctxt ist
1449 let wsyn = syn { syn_namespace = [] }
1450 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1455 return $ PClauseR fc wargs rhs wheres)
1457 <|> try (do pushIndent
1458 n_in <- pfName; let n = expandNS syn n_in
1459 cargs <- many (pConstraintArg syn)
1460 iargs <- many (pImplicitArg (syn { inPattern = True } ))
1462 args <- many (try (pImplicitArg (syn { inPattern = True } ))
1463 <|> (fmap pexp (pArgExpr syn)))
1464 wargs <- many (pWExpr syn)
1465 let capp = PApp fc (PRef fc n)
1466 (iargs ++ cargs ++ args)
1468 setState (ist { lastParse = Just n })
1470 wval <- pSimpleExpr syn
1472 ds <- many1 $ pFunDecl syn
1473 let withs = map (fillLHSD n capp wargs) $ concat ds
1476 return $ PWith fc n capp wargs wval withs)
1478 <|> try (do wargs <- many1 (pWExpr syn)
1481 wval <- pSimpleExpr syn
1483 ds <- many1 $ pFunDecl syn
1484 let withs = concat ds
1486 return $ PWithR fc wargs wval withs)
1491 let n = expandNS syn (UN op)
1494 wargs <- many (pWExpr syn)
1496 let wsyn = syn { syn_namespace = [] }
1497 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1503 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1504 setState (ist { lastParse = Just n })
1505 return $ PClause fc n capp wargs rhs wheres
1507 <|> do l <- pArgExpr syn
1509 let n = expandNS syn (UN op)
1512 wargs <- many (pWExpr syn)
1514 wval <- pSimpleExpr syn
1516 ds <- many1 $ pFunDecl syn
1519 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1520 let withs = map (fillLHSD n capp wargs) $ concat ds
1521 setState (ist { lastParse = Just n })
1522 return $ PWith fc n capp wargs wval withs
1524 fillLHS n capp owargs (PClauseR fc wargs v ws)
1525 = PClause fc n capp (owargs ++ wargs) v ws
1526 fillLHS n capp owargs (PWithR fc wargs v ws)
1527 = PWith fc n capp (owargs ++ wargs) v
1528 (map (fillLHSD n capp (owargs ++ wargs)) ws)
1531 fillLHSD n c a (PClauses fc o fn cs) = PClauses fc o fn (map (fillLHS n c a) cs)
1532 fillLHSD n c a x = x
1534pWExpr :: SyntaxInfo -> IParser PTerm
1535pWExpr syn = do lchar '|'
1538pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])
1540 = do reserved "where"; openBlock
1541 ds <- many1 $ pDecl syn
1542 let dns = concatMap (concatMap declared) ds
1544 return (concat ds, map (\x -> (x, decoration syn x)) dns)
1546pCodegen :: IParser Codegen
1547pCodegen = try (do reserved "C"; return ViaC)
1548 <|> try (do reserved "Java"; return ViaJava)
1549 <|> try (do reserved "JavaScript"; return ViaJavaScript)
1550 <|> try (do reserved "Node"; return ViaNode)
1551 <|> try (do reserved "LLVM"; return ViaLLVM)
1552 <|> try (do reserved "Bytecode"; return Bytecode)
1554pDirective :: SyntaxInfo -> IParser [PDecl]
1555pDirective syn = try (do lchar '%'; reserved "lib"; cgn <- pCodegen; lib <- strlit;
1556 return [PDirective (do addLib cgn lib
1557 addIBC (IBCLib cgn lib))])
1558 <|> try (do lchar '%'; reserved "link"; cgn <- pCodegen; obj <- strlit;
1559 return [PDirective (do datadir <- liftIO getDataDir
1560 o <- liftIO $ findInPath [".", datadir] obj
1561 addIBC (IBCObj cgn o)
1562 addObjectFile cgn o)])
1563 <|> try (do lchar '%'; reserved "include"; cgn <- pCodegen; hdr <- strlit;
1564 return [PDirective (do addHdr cgn hdr
1565 addIBC (IBCHeader cgn hdr))])
1566 <|> try (do lchar '%'; reserved "hide"; n <- iName []
1567 return [PDirective (do setAccessibility n Hidden
1568 addIBC (IBCAccess n Hidden))])
1569 <|> try (do lchar '%'; reserved "freeze"; n <- iName []
1570 return [PDirective (do setAccessibility n Frozen
1571 addIBC (IBCAccess n Frozen))])
1572 <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'
1573 return [PDirective (do i <- getIState
1574 putIState (i { default_access = acc }))])
1575 <|> try (do lchar '%'; reserved "default"; tot <- pTotality
1577 setState (i { default_total = tot } )
1578 return [PDirective (do i <- getIState
1579 putIState (i { default_total = tot }))])
1580 <|> try (do lchar '%'; reserved "logging"; i <- natural;
1581 return [PDirective (setLogLevel (fromInteger i))])
1582 <|> try (do lchar '%'; reserved "dynamic"; libs <- sepBy1 strlit (lchar ',');
1583 return [PDirective (do added <- addDyLib libs
1585 Left lib -> addIBC (IBCDyLib (lib_name lib))
1588 <|> try (do lchar '%'; reserved "language"; ext <- reserved "TypeProviders";
1589 return [PDirective (addLangExt TypeProviders)])
1591pProvider :: SyntaxInfo -> IParser [PDecl]
1592pProvider syn = do lchar '%'; reserved "provide";
1593 lchar '('; n <- pfName; t <- pTSig syn; lchar ')'
1597 return [PProvider syn fc n t e]
1599pTactic :: SyntaxInfo -> IParser PTactic
1600pTactic syn = do reserved "intro"; ns <- sepBy pName (lchar ',')
1602 <|> do reserved "intros"; return Intros
1603 <|> try (do reserved "refine"; n <- pName
1605 return $ Refine n imps)
1606 <|> do reserved "refine"; n <- pName
1608 return $ Refine n []
1609 <|> do reserved "mrefine"; n <- pName
1611 return $ MatchRefine n
1612 <|> do reserved "rewrite"; t <- pExpr syn;
1614 return $ Rewrite (desugar syn i t)
1615 <|> do reserved "equiv"; t <- pExpr syn;
1617 return $ Equiv (desugar syn i t)
1618 <|> try (do reserved "let"; n <- pName; lchar ':';
1619 ty <- pExpr' syn; lchar '='; t <- pExpr syn;
1621 return $ LetTacTy n (desugar syn i ty) (desugar syn i t))
1622 <|> try (do reserved "let"; n <- pName; lchar '=';
1625 return $ LetTac n (desugar syn i t))
1626 <|> do reserved "focus"; n <- pName
1628 <|> do reserved "exact"; t <- pExpr syn;
1630 return $ Exact (desugar syn i t)
1631 <|> do reserved "applyTactic"; t <- pExpr syn;
1633 return $ ApplyTactic (desugar syn i t)
1634 <|> do reserved "reflect"; t <- pExpr syn;
1636 return $ Reflect (desugar syn i t)
1637 <|> do reserved "fill"; t <- pExpr syn;
1639 return $ Fill (desugar syn i t)
1640 <|> do reserved "try"; t <- pTactic syn;
1650 <|> do reserved "compute"; return Compute
1651 <|> do reserved "trivial"; return Trivial
1652 <|> do reserved "solve"; return Solve
1653 <|> do reserved "attack"; return Attack
1654 <|> do reserved "state"; return ProofState
1655 <|> do reserved "term"; return ProofTerm
1656 <|> do reserved "undo"; return Undo
1657 <|> do reserved "qed"; return Qed
1658 <|> do reserved "abandon"; return Abandon
1659 <|> do lchar ':'; reserved "q"; return Abandon
1661 imp = do lchar '?'; return False
1662 <|> do lchar '_'; return True
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list