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]
347 <|> try (pProvider syn)
349 <|> try (do reserved "import"; fp <- identifier
350 fail "imports must be at the top of file")
352pFunDecl :: SyntaxInfo -> IParser [PDecl]
354 = try (do notEndBlock
357 let d' = fmap (desugar syn i) d
360--------- Top Level Declarations ---------
362pDecl' :: SyntaxInfo -> IParser PDecl
365 <|> try (pFunDecl' syn)
367 <|> try (pRecord syn)
368 <|> try (pSyntaxDecl syn)
370pSyntaxDecl :: SyntaxInfo -> IParser PDecl
372 = do s <- pSyntaxRule syn
374 let rs = syntax_rules i
375 let ns = syntax_keywords i
376 let ibc = ibc_write i
377 let ks = map show (names s)
378 setState (i { syntax_rules = s : rs,
379 syntax_keywords = ks ++ ns,
380 ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc
383 return (PSyntax fc s)
385 names (Rule syms _ _) = mapMaybe ename syms
386 ename (Keyword n) = Just n
389pSyntaxRule :: SyntaxInfo -> IParser Syntax
392 sty <- option AnySyntax (do reserved "term"; return TermSyntax
393 <|> do reserved "pattern"; return PatternSyntax)
395 syms <- many1 pSynSym
396 when (all expr syms) $ fail "No keywords in syntax rule"
397 let ns = mapMaybe name syms
398 when (length ns /= length (nub ns))
399 $ fail "Repeated variable in syntax rule"
401 tm <- pTExpr (impOK syn)
403 return (Rule (mkSimple syms) tm sty)
407 name (Expr n) = Just n
410 -- Can't parse two full expressions (i.e. expressions with application) in a row
411 -- so change them both to a simple expression
413 mkSimple (Expr e : es) = SimpleExpr e : mkSimple' es
414 mkSimple xs = mkSimple' xs
416 mkSimple' (Expr e : Expr e1 : es) = SimpleExpr e : SimpleExpr e1 :
418 mkSimple' (e : es) = e : mkSimple' es
421pSynSym :: IParser SSymbol
422pSynSym = try (do lchar '['; n <- pName; lchar ']'
424 <|> try (do lchar '{'; n <- pName; lchar '}'
431pFunDecl' :: SyntaxInfo -> IParser PDecl
432pFunDecl' syn = try (do doc <- option "" (pDocComment '|')
435 let initOpts = if default_total ist
438 opts <- pFnOpts initOpts
439 acc <- pAccessibility
440 opts' <- pFnOpts opts
442 let n = expandNS syn n_in
444 ty <- pTSig (impOK syn)
446-- ty' <- implicit syn n ty
448 return (PTy doc syn fc opts' n ty))
449 <|> try (pPostulate syn)
450 <|> try (pPattern syn)
453pPostulate :: SyntaxInfo -> IParser PDecl
454pPostulate syn = do doc <- option "" (pDocComment '|')
458 let initOpts = if default_total ist
461 opts <- pFnOpts initOpts
462 acc <- pAccessibility
463 opts' <- pFnOpts opts
465 let n = expandNS syn n_in
466 ty <- pTSig (impOK syn)
470 return (PPostulate doc syn fc opts' n ty)
473pUsing :: SyntaxInfo -> IParser [PDecl]
475 do reserved "using"; lchar '('; ns <- usingDeclList syn; lchar ')'
477 let uvars = using syn
478 ds <- many1 (pDecl (syn { using = uvars ++ ns }))
482pParams :: SyntaxInfo -> IParser [PDecl]
484 do reserved "parameters"; lchar '('; ns <- tyDeclList syn; lchar ')'
486 let pvars = syn_params syn
487 ds <- many1 (pDecl syn { syn_params = pvars ++ ns })
490 return [PParams fc ns (concat ds)]
492pMutual :: SyntaxInfo -> IParser [PDecl]
496 let pvars = syn_params syn
497 ds <- many1 (pDecl syn)
500 return [PMutual fc (concat ds)]
502pNamespace :: SyntaxInfo -> IParser [PDecl]
504 do reserved "namespace"; n <- identifier;
506 ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })
508 return [PNamespace n (concat ds)]
510--------- Fixity ---------
512pFixity :: IParser PDecl
513pFixity = do pushIndent
514 f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')
516 let prec = fromInteger i
518 let infixes = idris_infixes istate
519 let fs = map (Fix (f prec)) ops
520 let redecls = map (alreadyDeclared infixes) fs
521 let ill = filter (not . checkValidity) redecls
523 then do setState (istate { idris_infixes = nub $ sort (fs ++ infixes)
524 , ibc_write = map IBCFix fs ++ ibc_write istate
527 return (PFix fc (f prec) ops)
528 else fail $ concatMap (\(f, (x:xs)) -> "Illegal redeclaration of fixity:\n\t\""
529 ++ show f ++ "\" overrides \"" ++ show x ++ "\"") ill
530 where alreadyDeclared :: [FixDecl] -> FixDecl -> (FixDecl, [FixDecl])
531 alreadyDeclared fs f = (f, filter ((extractName f ==) . extractName) fs)
533 checkValidity :: (FixDecl, [FixDecl]) -> Bool
534 checkValidity (f, fs) = all (== f) fs
536 extractName :: FixDecl -> String
537 extractName (Fix _ n) = n
539fixity :: IParser (Int -> Fixity)
540fixity = try (do reserved "infixl"; return Infixl)
541 <|> try (do reserved "infixr"; return Infixr)
542 <|> try (do reserved "infix"; return InfixN)
543 <|> try (do reserved "prefix"; return PrefixN)
545--------- Type classes ---------
547pClass :: SyntaxInfo -> IParser [PDecl]
548pClass syn = do doc <- option "" (pDocComment '|')
549 acc <- pAccessibility
550 reserved "class"; fc <- pfc; cons <- pConstList syn; n_in <- pName
551 let n = expandNS syn n_in
553 reserved "where"; openBlock
554 ds <- many $ pFunDecl syn
556 let allDs = concat ds
557 accData acc n (concatMap declared allDs)
558 return [PClass doc syn fc cons n cs allDs]
560 carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'
565pInstance :: SyntaxInfo -> IParser [PDecl]
566pInstance syn = do reserved "instance"; fc <- pfc
568 (do lchar '['; n_in <- pfName; lchar ']'
569 let n = expandNS syn n_in
573 args <- many (pSimpleExpr syn)
574 let sc = PApp fc (PRef fc cn) (map pexp args)
575 let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc
576 reserved "where"; openBlock
577 ds <- many $ pFunDecl syn
579 return [PInstance syn fc cs cn args t en (concat ds)]
581--------- Expressions ---------
583pExpr syn = do i <- getState
584 buildExpressionParser (table (idris_infixes i)) (pExpr' syn)
586pExpr' :: SyntaxInfo -> IParser PTerm
591pExtExpr :: SyntaxInfo -> IParser PTerm
592pExtExpr syn = do i <- getState
593 pExtensions syn (syntax_rules i)
595pSimpleExtExpr :: SyntaxInfo -> IParser PTerm
596pSimpleExtExpr syn = do i <- getState
597 pExtensions syn (filter simple (syntax_rules i))
599 simple (Rule (Expr x:xs) _ _) = False
600 simple (Rule (SimpleExpr x:xs) _ _) = False
601 simple (Rule [Keyword _] _ _) = True
602 simple (Rule [Symbol _] _ _) = True
603 simple (Rule (_:xs) _ _) = case last xs of
611 <|> try (pMatchApp syn)
612 <|> try (pUnifyLog syn)
614 <|> try (pSimpleExpr syn)
621pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm
622pExtensions syn rules = choice (map (try . pExt syn) (filter valid rules))
624 valid (Rule _ _ AnySyntax) = True
625 valid (Rule _ _ PatternSyntax) = inPattern syn
626 valid (Rule _ _ TermSyntax) = not (inPattern syn)
629data SynMatch = SynTm PTerm | SynBind Name
631pExt :: SyntaxInfo -> Syntax -> IParser PTerm
632pExt syn (Rule ssym ptm _)
633 = do smap <- mapM pSymbol ssym
634 let ns = mapMaybe id smap
635 return (update ns ptm) -- updated with smap
637 pSymbol (Keyword n) = do reserved (show n); return Nothing
638 pSymbol (Expr n) = do tm <- pExpr syn
639 return $ Just (n, SynTm tm)
640 pSymbol (SimpleExpr n) = do tm <- pSimpleExpr syn
641 return $ Just (n, SynTm tm)
642 pSymbol (Binding n) = do b <- pName
643 return $ Just (n, SynBind b)
644 pSymbol (Symbol s) = do symbol s
647 dropn n ((x,t) : xs) | n == x = xs
648 | otherwise = (x,t):dropn n xs
650 updateB ns n = case lookup n ns of
651 Just (SynBind t) -> t
654 update ns (PRef fc n) = case lookup n ns of
657 update ns (PLam n ty sc) = PLam (updateB ns n) (update ns ty) (update (dropn n ns) sc)
658 update ns (PPi p n ty sc) = PPi p (updateB ns n) (update ns ty) (update (dropn n ns) sc)
659 update ns (PLet n ty val sc) = PLet (updateB ns n) (update ns ty) (update ns val)
660 (update (dropn n ns) sc)
661 update ns (PApp fc t args) = PApp fc (update ns t) (map (fmap (update ns)) args)
662 update ns (PCase fc c opts) = PCase fc (update ns c) (map (pmap (update ns)) opts)
663 update ns (PPair fc l r) = PPair fc (update ns l) (update ns r)
664 update ns (PDPair fc l t r) = PDPair fc (update ns l) (update ns t) (update ns r)
665 update ns (PAlternative a as) = PAlternative a (map (update ns) as)
666 update ns (PHidden t) = PHidden (update ns t)
667 update ns (PDoBlock ds) = PDoBlock $ upd ns ds
668 where upd ns (DoExp fc t : ds) = DoExp fc (update ns t) : upd ns ds
669 upd ns (DoBind fc n t : ds) = DoBind fc n (update ns t) : upd (dropn n ns) ds
670 upd ns (DoLet fc n ty t : ds) = DoLet fc n (update ns ty) (update ns t)
671 : upd (dropn n ns) ds
672 upd ns (DoBindP fc i t : ds) = DoBindP fc (update ns i) (update ns t)
674 upd ns (DoLetP fc i t : ds) = DoLetP fc (update ns i) (update ns t)
678pName = do i <- getState
679 iName (syntax_keywords i)
680 <|> do reserved "instance"
682 UN n <- iName (syntax_keywords i)
685-- | Parser for an operator in function position, i.e. enclosed by `()', with an
686-- optional namespace.
687pOpFront = maybeWithNS pOpFrontNoNS False []
688 where pOpFrontNoNS = do lchar '('; o <- operator; lchar ')'; return o
693pTotality :: IParser Bool
695 = do reserved "total"; return True
696 <|> do reserved "partial"; return False
698pAccessibility' :: IParser Accessibility
700 = do reserved "public"; return Public
701 <|> do reserved "abstract"; return Frozen
702 <|> do reserved "private"; return Hidden
704pAccessibility :: IParser (Maybe Accessibility)
706 = do acc <- pAccessibility'; return (Just acc)
709pFnOpts :: [FnOpt] -> IParser [FnOpt]
711 = do reserved "total"; pFnOpts (TotalFn : opts)
712 <|> do reserved "partial"; pFnOpts (PartialFn : (opts \\ [TotalFn]))
713 <|> try (do lchar '%'; reserved "export"; c <- strlit;
714 pFnOpts (CExport c : opts))
715 <|> try (do lchar '%'; reserved "assert_total";
716 pFnOpts (AssertTotal : opts))
717 <|> do lchar '%'; reserved "specialise";
718 lchar '['; ns <- sepBy nameTimes (lchar ','); lchar ']'
719 pFnOpts (Specialise ns : opts)
720 <|> do reserved "implicit"; pFnOpts (Implicit : opts)
722 where nameTimes = do n <- pfName
723 t <- option Nothing (do reds <- natural
724 return (Just (fromInteger reds)))
727addAcc :: Name -> Maybe Accessibility -> IParser ()
728addAcc n a = do i <- getState
729 setState (i { hide_list = (n, a) : hide_list i })
732 reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";
735 opts <- many1 (do notEndBlock
738 return x) -- sepBy1 (pCaseOpt syn) (lchar '|')
741 return (PCase fc scr opts)
744 reserved "proof"; lchar '{'
745 ts <- endBy (pTactic syn) (lchar ';')
750 reserved "tactics"; lchar '{'
751 ts <- endBy (pTactic syn) (lchar ';')
756 try (do symbol "!["; t <- pTerm; lchar ']'; return $ PQuote t)
757 <|> do lchar '?'; x <- pName; return (PMetavar x)
758 <|> do lchar '%'; fc <- pfc; reserved "instance"; return (PResolveTC fc)
759 <|> do reserved "refl"; fc <- pfc;
760 tm <- option Placeholder (do lchar '{'; t <- pExpr syn; lchar '}';
763-- <|> do reserved "return"; fc <- pfc; return (PReturn fc)
767 <|> try (do x <- pfName
770 <|> try (do lchar '!'; x <- pfName
772 return (PInferRef fc x))
774 <|> try (pComprehension syn)
777 <|> try (do lchar '('
778 bracketed (noImp syn))
779 <|> try (do c <- pConstant
781 return (modifyConst syn fc (PConstant c)))
782 <|> do reserved "Type"; return PType
783 <|> try (do symbol "()"
786 <|> try (do symbol "_|_"
789 <|> do lchar '_'; return Placeholder
790 <|> pSimpleExtExpr syn
794 <|> try (do e <- pExpr syn; lchar ')'; return e)
795-- <|> try (do reserved "typed"
796-- e <- pExpr syn; symbol ":"; t <- pExpr syn; lchar ')'
797-- return (PTyped e t))
798 <|> try (do fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'
799 return $ PLam (MN 1000 "ARG") Placeholder
800 (PApp fc (PRef fc (UN o)) [pexp (PRef fc (MN 1000 "ARG")),
802 <|> try (do fc <- pfc; e <- pSimpleExpr syn; o <- operator; lchar ')'
803 return $ PLam (MN 1000 "ARG") Placeholder
804 (PApp fc (PRef fc (UN o)) [pexp e,
805 pexp (PRef fc (MN 1000 "ARG"))]))
807pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)
808pCaseOpt syn = do lhs <- pExpr (syn { inPattern = True })
809 symbol "=>"; rhs <- pExpr syn
812-- bit of a hack here. If the integer doesn't fit in an Int, treat it as a
813-- big integer, otherwise try fromInteger and the constants as alternatives.
814-- a better solution would be to fix fromInteger to work with Integer, as the
815-- name suggests, rather than Int
817modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm
818modifyConst syn fc (PConstant (BI x))
819 | not (inPattern syn)
821 (PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (BI (fromInteger x)))]
823 | otherwise = PAlternative False consts
825 consts = [ PConstant (BI x)
826 , PConstant (I (fromInteger x))
827 , PConstant (B8 (fromInteger x))
828 , PConstant (B16 (fromInteger x))
829 , PConstant (B32 (fromInteger x))
830 , PConstant (B64 (fromInteger x))
832modifyConst syn fc x = x
835pList syn = do lchar '['; fc <- pfc; xs <- sepBy (pExpr syn) (lchar ','); lchar ']'
836 return (mkList fc xs)
838 mkList fc [] = PRef fc (UN "Nil")
839 mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)]
841pPair syn = try (do l <- pExpr syn
846 [Left r] -> return (PPair fc l r)
847 [Right r] -> return (PDPair fc l Placeholder r))
848 <|> try (do x <- ntuple
851 <|> do ln <- pName; lchar ':'
857 return (PDPair fc (PRef fc ln) lty r)
859 restTuple = do lchar ')'; return []
864 <|> do reservedOp "**"
868 ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','
870 return (PPair fc l rest))
871 <|> (do l <- pExpr syn; fc <- pfc; lchar ','
873 return (PPair fc l r))
875pAlt syn = do symbol "(|"; alts <- sepBy1 (pExpr' syn) (lchar ','); symbol "|)"
876 return (PAlternative False alts)
884pMatchApp syn = do ty <- pSimpleExpr syn
888 return (PLet (MN 0 "match")
891 (PRef fc (MN 0 "match")))
893pUnifyLog syn = do lchar '%'; reserved "unifyLog";
894 tm <- pSimpleExpr syn
895 return (PUnifyLog tm)
897pApp syn = do f <- pSimpleExpr syn
899 args <- many1 (do notEndApp
902 return (dslify i $ PApp fc f args)
904 dslify i (PApp fc (PRef _ f) [a])
905 | [d] <- lookupCtxt f (idris_dsls i)
906 = desugar (syn { dsl_info = d }) i (getTm a)
909pArg :: SyntaxInfo -> IParser PArg
910pArg syn = try (pImplicitArg syn)
911 <|> try (pConstraintArg syn)
912 <|> do e <- pSimpleExpr syn
915pImplicitArg syn = do lchar '{'
918 v <- option (PRef fc n) (do lchar '='
923pConstraintArg syn = do symbol "@{"
929 = do reserved "record"
931 fields <- sepBy1 pFieldType (lchar ',')
934 rec <- option Nothing (do e <- pSimpleExpr syn
938 return (PLam (MN 0 "fldx") Placeholder
939 (applyAll fc fields (PRef fc (MN 0 "fldx"))))
940 Just v -> return (applyAll fc fields v)
941 where pFieldType = do n <- pfName
946 applyAll fc ((n, e) : es) x
947 = applyAll fc es (PApp fc (PRef fc (mkType n)) [pexp e, pexp x])
949mkType (UN n) = UN ("set_" ++ n)
950mkType (MN 0 n) = MN 0 ("set_" ++ n)
951mkType (NS n s) = NS (mkType n) s
953noImp syn = syn { implicitAllowed = False }
954impOK syn = syn { implicitAllowed = True }
956pTSig syn = do lchar ':'; pTExpr syn
958pTExpr syn = do cs <- if implicitAllowed syn then pConstList syn else return []
960 return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)
962pLambda syn = do lchar '\\'
963 try (do xt <- tyOptDeclList syn
966 return (bindList PLam xt sc)
967 <|> (do ps <- sepBy (do fc <- pfc
969 return (fc, e)) (lchar ',')
972 return (pmList (zip [0..] ps) sc)))
973 where pmList [] sc = sc
974 pmList ((i, (fc, x)) : xs) sc
975 = PLam (MN i "lamp") Placeholder
976 (PCase fc (PRef fc (MN i "lamp"))
980 do reserved "rewrite"
983 giving <- option Nothing
984 (do symbol "==>"; tm <- pExpr' syn
986 reserved "in"; sc <- pExpr syn
988 (PApp fc (PRef fc (UN "sym")) [pexp prf]) sc
991pLet syn = try (do reserved "let"; n <- pName;
992 ty <- option Placeholder (do lchar ':'; pExpr' syn)
995 reserved "in"; sc <- pExpr syn
996 return (PLet n ty v sc))
997 <|> (do reserved "let"; fc <- pfc; pat <- pExpr' (syn { inPattern = True } )
998 symbol "="; v <- pExpr syn
999 reserved "in"; sc <- pExpr syn
1000 return (PCase fc v [(pat, sc)]))
1003 try (do lazy <- if implicitAllowed syn -- laziness is top level only
1004 then option False (do lchar '|'; return True)
1007 lchar '('; xt <- tyDeclList syn; lchar ')'
1008 doc <- option "" (pDocComment '^')
1011 return (bindList (PPi (Exp lazy st doc)) xt sc))
1012 <|> try (if implicitAllowed syn
1013 then do lazy <- option False (do lchar '|'
1017 xt <- tyDeclList syn
1021 return (bindList (PPi (Imp lazy st "")) xt sc)
1022 else fail "No implicit arguments allowed here")
1023 <|> try (do lchar '{'
1025 xt <- tyDeclList syn
1029 return (bindList (PPi
1030 (TacImp False Dynamic (PTactics [Trivial]) "")) xt sc))
1031 <|> try (do lchar '{'
1033 script <- pSimpleExpr syn
1034 xt <- tyDeclList syn
1038 return (bindList (PPi (TacImp False Dynamic script "")) xt sc))
1039 <|> do --lazy <- option False (do lchar '|'; return True)
1046 return (PPi (Exp False Static "") (MN 42 "__pi_arg") t sc)
1048pConstList :: SyntaxInfo -> IParser [PTerm]
1049pConstList syn = try (do lchar '('
1050 tys <- sepBy1 (pExpr' (noImp syn)) (lchar ',')
1054 <|> try (do t <- pExpr (noImp syn)
1060 = try (sepBy1 (usingDecl syn) (lchar ','))
1061 <|> do ns <- sepBy1 pName (lchar ',')
1062 t <- pTSig (noImp syn)
1063 return (map (\x -> UImplicit x t) ns)
1065usingDecl syn = try (do x <- pfName
1066 t <- pTSig (noImp syn)
1067 return (UImplicit x t))
1070 return (UConstraint c xs)
1072tyDeclList syn = try (sepBy1 (do x <- pfName
1073 t <- pTSig (noImp syn)
1076 <|> do ns <- sepBy1 pName (lchar ',')
1077 t <- pTSig (noImp syn)
1078 return (map (\x -> (x, t)) ns)
1080tyOptDeclList syn = sepBy1 (do x <- pfName;
1081 t <- option Placeholder (do lchar ':'
1086bindList b [] sc = sc
1087bindList b ((n, t):bs) sc = b n t (bindList b bs sc)
1094 qs <- sepBy1 (pDo syn) (lchar ',')
1096 return (PDoBlock (map addGuard qs ++
1097 [DoExp fc (PApp fc (PRef fc (UN "return"))
1099 where addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc (UN "guard"))
1107 ds <- many1 (do notEndBlock
1113 return (PDoBlock ds)
1116 = try (do reserved "let"
1118 ty <- option Placeholder (do lchar ':'
1123 return (DoLet fc i ty e))
1124 <|> try (do reserved "let"
1129 return (DoLetP fc i sc))
1130 <|> try (do i <- pName
1134 return (DoBind fc i e))
1135 <|> try (do i <- pExpr' syn
1139 return (DoBindP fc i e))
1140 <|> try (do e <- pExpr syn
1142 return (DoExp fc e))
1149 return (PIdiom fc e)
1151pConstant :: IParser Const
1152pConstant = do reserved "Integer";return (AType (ATInt ITBig))
1153 <|> do reserved "Int"; return (AType (ATInt ITNative))
1154 <|> do reserved "Char"; return (AType (ATInt ITChar))
1155 <|> do reserved "Float"; return (AType ATFloat)
1156 <|> do reserved "String"; return StrType
1157 <|> do reserved "Ptr"; return PtrType
1158 <|> do reserved "Bits8"; return (AType (ATInt (ITFixed IT8)))
1159 <|> do reserved "Bits16"; return (AType (ATInt (ITFixed IT16)))
1160 <|> do reserved "Bits32"; return (AType (ATInt (ITFixed IT32)))
1161 <|> do reserved "Bits64"; return (AType (ATInt (ITFixed IT64)))
1162 <|> do reserved "Bits8x16"; return (AType (ATInt (ITVec IT8 16)))
1163 <|> do reserved "Bits16x8"; return (AType (ATInt (ITVec IT16 8)))
1164 <|> do reserved "Bits32x4"; return (AType (ATInt (ITVec IT32 4)))
1165 <|> do reserved "Bits64x2"; return (AType (ATInt (ITVec IT64 2)))
1166 <|> try (do f <- float; return $ Fl f)
1167 <|> try (do i <- natural; return $ BI i)
1168 <|> try (do s <- strlit; return $ Str s)
1169 <|> try (do c <- chlit; return $ Ch c)
1171pStatic :: IParser Static
1172pStatic = do lchar '['
1179 = [[prefix "-" (\fc x -> PApp fc (PRef fc (UN "-"))
1180 [pexp (PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (BI 0))]), pexp x])]]
1181 ++ toTable (reverse fixes) ++
1183 [binary "=" PEq AssocLeft],
1184 [binary "->" (\fc x y -> PPi expl (MN 42 "__pi_arg") x y) AssocRight]]
1186toTable fs = map (map toBin)
1187 (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)
1188 where toBin (Fix (PrefixN _) op) = prefix op
1189 (\fc x -> PApp fc (PRef fc (UN op)) [pexp x])
1191 = binary op (\fc x y -> PApp fc (PRef fc (UN op)) [pexp x,pexp y]) (assoc f)
1192 assoc (Infixl _) = AssocLeft
1193 assoc (Infixr _) = AssocRight
1194 assoc (InfixN _) = AssocNone
1196binary name f = Infix (do fc <- pfc
1198 doc <- option "" (pDocComment '^')
1200prefix name f = Prefix (do reservedOp name
1203backtick = Infix (do lchar '`'; n <- pfName
1206 return (\x y -> PApp fc (PRef fc n) [pexp x, pexp y])) AssocNone
1208--------- Data declarations ---------
1210-- (works for classes too - 'abstract' means the data/class is visible but members not)
1211accData :: Maybe Accessibility -> Name -> [Name] -> IParser ()
1212accData (Just Frozen) n ns = do addAcc n (Just Frozen)
1213 mapM_ (\n -> addAcc n (Just Hidden)) ns
1214accData a n ns = do addAcc n a
1215 mapM_ (`addAcc` a) ns
1217pRecord :: SyntaxInfo -> IParser PDecl
1218pRecord syn = do doc <- option "" (pDocComment '|')
1219 acc <- pAccessibility
1223 ty <- pTSig (impOK syn)
1224 let tyn = expandNS syn tyn_in
1228 (cdoc, cn, cty, _) <- pConstructor syn
1232 accData acc tyn [cn]
1233 let rsyn = syn { syn_namespace = show (nsroot tyn) :
1235 let fns = getRecNames rsyn cty
1236 mapM_ (\n -> addAcc n acc) fns
1237 return $ PRecord doc rsyn fc tyn ty cdoc cn cty
1239 getRecNames syn (PPi _ n _ sc) = [expandNS syn n, expandNS syn (mkType n)]
1240 ++ getRecNames syn sc
1241 getRecNames _ _ = []
1243 toFreeze (Just Frozen) = Just Hidden
1246pDataI = do reserved "data"; return False
1247 <|> do reserved "codata"; return True
1249pData :: SyntaxInfo -> IParser PDecl
1250pData syn = try (do doc <- option "" (pDocComment '|')
1251 acc <- pAccessibility
1255 ty <- pTSig (impOK syn)
1256 let tyn = expandNS syn tyn_in
1257 option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1261 cons <- many (do notEndBlock
1262 c <- pConstructor syn
1264 return c) -- (lchar '|')
1267 accData acc tyn (map (\ (_, n, _, _) -> n) cons)
1268 return $ PData doc syn fc co (PDatadecl tyn ty cons)))
1269 <|> try (do doc <- option "" (pDocComment '|')
1271 acc <- pAccessibility
1276 let ty = bindArgs (map (const PType) args) PType
1277 let tyn = expandNS syn tyn_in
1278 option (PData doc syn fc co (PLaterdecl tyn ty)) (do
1279 try (lchar '=') <|> do reserved "where"
1280 let kw = (if co then "co" else "") ++ "data "
1281 let n = show tyn_in ++ " "
1283 let as = concat (intersperse " " $ map show args) ++ " "
1284 let ns = concat (intersperse " -> " $ map ((\x -> "(" ++ x ++ " : Type)") . show) args)
1285 let ss = concat (intersperse " -> " $ map (const "Type") args)
1286 let fix1 = s ++ as ++ " = ..."
1287 let fix2 = s ++ ": " ++ ns ++ " -> Type where\n ..."
1288 let fix3 = s ++ ": " ++ ss ++ " -> Type where\n ..."
1289 fail $ fixErrorMsg "unexpected \"where\"" [fix1, fix2, fix3]
1291 cons <- sepBy1 (pSimpleCon syn) (lchar '|')
1293 let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)
1294 cons' <- mapM (\ (doc, x, cargs, cfc) ->
1295 do let cty = bindArgs cargs conty
1296 return (doc, x, cty, cfc)) cons
1297 accData acc tyn (map (\ (_, n, _, _) -> n) cons')
1298 return $ PData doc syn fc co (PDatadecl tyn ty cons')))
1301 mkPApp fc t xs = PApp fc t (map pexp xs)
1303bindArgs :: [PTerm] -> PTerm -> PTerm
1304bindArgs xs t = foldr (PPi expl (MN 0 "t")) t xs
1306pConstructor :: SyntaxInfo -> IParser (String, Name, PTerm, FC)
1308 = do doc <- option "" (pDocComment '|')
1309 cn_in <- pfName; fc <- pfc
1310 let cn = expandNS syn cn_in
1311 ty <- pTSig (impOK syn)
1312-- ty' <- implicit syn cn ty
1313 return (doc, cn, ty, fc)
1316pSimpleCon :: SyntaxInfo -> IParser (String, Name, [PTerm], FC)
1318 = do cn_in <- pfName
1319 let cn = expandNS syn cn_in
1321 args <- many (do notEndApp
1323 doc <- option "" (pDocComment '^')
1324 return (doc, cn, args, fc)
1326--------- DSL syntax overloading ---------
1328pDSL :: SyntaxInfo -> IParser PDecl
1329pDSL syn = do reserved "dsl"
1333 bs <- many1 (do notEndBlock
1337 popIndent; closeBlock
1338 let dsl = mkDSL bs (dsl_info syn)
1341 setState (i { idris_dsls = addDef n dsl (idris_dsls i) })
1343 where mkDSL bs dsl = let var = lookup "variable" bs
1344 first = lookup "index_first" bs
1345 next = lookup "index_next" bs
1346 leto = lookup "let" bs
1347 lambda = lookup "lambda" bs in
1348 initDSL { dsl_var = var,
1349 index_first = first,
1351 dsl_lambda = lambda,
1354checkDSL :: DSL -> IParser ()
1355checkDSL dsl = return ()
1357pOverload :: SyntaxInfo -> IParser (String, PTerm)
1358pOverload syn = do o <- identifier <|> do reserved "let"
1360 if o `notElem` overloadable
1361 then fail $ show o ++ " is not an overloading"
1366 where overloadable = ["let","lambda","index_first","index_next","variable"]
1368--------- Pattern match clauses ---------
1370pPattern :: SyntaxInfo -> IParser PDecl
1371pPattern syn = do fc <- pfc
1372 clause <- pClause syn
1373 return (PClauses fc [] (MN 2 "_") [clause]) -- collect together later
1375pCAF :: SyntaxInfo -> IParser PDecl
1376pCAF syn = do reserved "let"
1377 n_in <- pfName; let n = expandNS syn n_in
1382 return (PCAF fc n t)
1384pArgExpr syn = let syn' = syn { inPattern = True } in
1385 try (pHSimpleExpr syn') <|> pSimpleExtExpr syn'
1387pRHS :: SyntaxInfo -> Name -> IParser PTerm
1388pRHS syn n = do lchar '='; pExpr syn
1390 name <- option n' (do symbol "{"; n <- pfName; symbol "}";
1393 return (addLet name rhs)
1394 <|> do reserved "impossible"; return PImpossible
1395 where mkN (UN x) = UN (x++"_lemma_1")
1396 mkN (NS x n) = NS (mkN x) n
1399 addLet nm (PLet n ty val rhs) = PLet n ty val (addLet nm rhs)
1400 addLet nm (PCase fc t cs) = PCase fc t (map addLetC cs)
1401 where addLetC (l, r) = (l, addLet nm r)
1402 addLet nm rhs = (PLet (UN "value") Placeholder rhs (PMetavar nm))
1404pClause :: SyntaxInfo -> IParser PClause
1406 = try (do pushIndent
1407 n_in <- pfName; let n = expandNS syn n_in
1408 cargs <- many (pConstraintArg syn)
1409 iargs <- many (pImplicitArg (syn { inPattern = True } ))
1411 args <- many (try (pImplicitArg (syn { inPattern = True } ))
1412 <|> (fmap pexp (pArgExpr syn)))
1413 wargs <- many (pWExpr syn)
1416 let ctxt = tt_ctxt ist
1417 let wsyn = syn { syn_namespace = [] }
1418 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1423 let capp = PApp fc (PRef fc n)
1424 (iargs ++ cargs ++ args)
1426 setState (ist { lastParse = Just n })
1427 return $ PClause fc n capp wargs rhs wheres)
1428 <|> try (do pushIndent
1429 ty <- pSimpleExpr syn
1432 n_in <- pfName; let n = expandNS syn n_in
1435 let ctxt = tt_ctxt ist
1436 let wsyn = syn { syn_namespace = [] }
1437 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1442 let capp = PLet (MN 0 "match")
1445 (PRef fc (MN 0 "match"))
1447 setState (ist { lastParse = Just n })
1448 return $ PClause fc n capp [] rhs wheres)
1449 <|> try (do pushIndent
1450 wargs <- many1 (pWExpr syn)
1452 n <- case lastParse ist of
1454 Nothing -> fail "Invalid clause"
1457 let ctxt = tt_ctxt ist
1458 let wsyn = syn { syn_namespace = [] }
1459 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1464 return $ PClauseR fc wargs rhs wheres)
1466 <|> try (do pushIndent
1467 n_in <- pfName; let n = expandNS syn n_in
1468 cargs <- many (pConstraintArg syn)
1469 iargs <- many (pImplicitArg (syn { inPattern = True } ))
1471 args <- many (try (pImplicitArg (syn { inPattern = True } ))
1472 <|> (fmap pexp (pArgExpr syn)))
1473 wargs <- many (pWExpr syn)
1474 let capp = PApp fc (PRef fc n)
1475 (iargs ++ cargs ++ args)
1477 setState (ist { lastParse = Just n })
1479 wval <- pSimpleExpr syn
1481 ds <- many1 $ pFunDecl syn
1482 let withs = map (fillLHSD n capp wargs) $ concat ds
1485 return $ PWith fc n capp wargs wval withs)
1487 <|> try (do wargs <- many1 (pWExpr syn)
1490 wval <- pSimpleExpr syn
1492 ds <- many1 $ pFunDecl syn
1493 let withs = concat ds
1495 return $ PWithR fc wargs wval withs)
1500 let n = expandNS syn (UN op)
1503 wargs <- many (pWExpr syn)
1505 let wsyn = syn { syn_namespace = [] }
1506 (wheres, nmap) <- choice [do x <- pWhereblock n wsyn
1512 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1513 setState (ist { lastParse = Just n })
1514 return $ PClause fc n capp wargs rhs wheres
1516 <|> do l <- pArgExpr syn
1518 let n = expandNS syn (UN op)
1521 wargs <- many (pWExpr syn)
1523 wval <- pSimpleExpr syn
1525 ds <- many1 $ pFunDecl syn
1528 let capp = PApp fc (PRef fc n) [pexp l, pexp r]
1529 let withs = map (fillLHSD n capp wargs) $ concat ds
1530 setState (ist { lastParse = Just n })
1531 return $ PWith fc n capp wargs wval withs
1533 fillLHS n capp owargs (PClauseR fc wargs v ws)
1534 = PClause fc n capp (owargs ++ wargs) v ws
1535 fillLHS n capp owargs (PWithR fc wargs v ws)
1536 = PWith fc n capp (owargs ++ wargs) v
1537 (map (fillLHSD n capp (owargs ++ wargs)) ws)
1540 fillLHSD n c a (PClauses fc o fn cs) = PClauses fc o fn (map (fillLHS n c a) cs)
1541 fillLHSD n c a x = x
1543pWExpr :: SyntaxInfo -> IParser PTerm
1544pWExpr syn = do lchar '|'
1547pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])
1549 = do reserved "where"; openBlock
1550 ds <- many1 $ pDecl syn
1551 let dns = concatMap (concatMap declared) ds
1553 return (concat ds, map (\x -> (x, decoration syn x)) dns)
1555pCodegen :: IParser Codegen
1556pCodegen = try (do reserved "C"; return ViaC)
1557 <|> try (do reserved "Java"; return ViaJava)
1558 <|> try (do reserved "JavaScript"; return ViaJavaScript)
1559 <|> try (do reserved "Node"; return ViaNode)
1560 <|> try (do reserved "LLVM"; return ViaLLVM)
1561 <|> try (do reserved "Bytecode"; return Bytecode)
1563pDirective :: SyntaxInfo -> IParser [PDecl]
1564pDirective syn = try (do lchar '%'; reserved "lib"; cgn <- pCodegen; lib <- strlit;
1565 return [PDirective (do addLib cgn lib
1566 addIBC (IBCLib cgn lib))])
1567 <|> try (do lchar '%'; reserved "link"; cgn <- pCodegen; obj <- strlit;
1568 return [PDirective (do datadir <- liftIO getDataDir
1569 o <- liftIO $ findInPath [".", datadir] obj
1570 addIBC (IBCObj cgn o)
1571 addObjectFile cgn o)])
1572 <|> try (do lchar '%'; reserved "include"; cgn <- pCodegen; hdr <- strlit;
1573 return [PDirective (do addHdr cgn hdr
1574 addIBC (IBCHeader cgn hdr))])
1575 <|> try (do lchar '%'; reserved "hide"; n <- iName []
1576 return [PDirective (do setAccessibility n Hidden
1577 addIBC (IBCAccess n Hidden))])
1578 <|> try (do lchar '%'; reserved "freeze"; n <- iName []
1579 return [PDirective (do setAccessibility n Frozen
1580 addIBC (IBCAccess n Frozen))])
1581 <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'
1582 return [PDirective (do i <- getIState
1583 putIState (i { default_access = acc }))])
1584 <|> try (do lchar '%'; reserved "default"; tot <- pTotality
1586 setState (i { default_total = tot } )
1587 return [PDirective (do i <- getIState
1588 putIState (i { default_total = tot }))])
1589 <|> try (do lchar '%'; reserved "logging"; i <- natural;
1590 return [PDirective (setLogLevel (fromInteger i))])
1591 <|> try (do lchar '%'; reserved "dynamic"; libs <- sepBy1 strlit (lchar ',');
1592 return [PDirective (do added <- addDyLib libs
1594 Left lib -> addIBC (IBCDyLib (lib_name lib))
1597 <|> try (do lchar '%'; reserved "language"; ext <- reserved "TypeProviders";
1598 return [PDirective (addLangExt TypeProviders)])
1600pProvider :: SyntaxInfo -> IParser [PDecl]
1601pProvider syn = do lchar '%'; reserved "provide";
1602 lchar '('; n <- pfName; t <- pTSig syn; lchar ')'
1606 return [PProvider syn fc n t e]
1608pTransform :: SyntaxInfo -> IParser [PDecl]
1609pTransform syn = do lchar '%'; reserved "transform";
1610 -- leave it unchecked, until we work out what this should
1612-- safety <- option True (do reserved "unsafe"
1618 return [PTransform fc False lhs rhs]
1620pTactic :: SyntaxInfo -> IParser PTactic
1621pTactic syn = do reserved "intro"; ns <- sepBy pName (lchar ',')
1623 <|> do reserved "intros"; return Intros
1624 <|> try (do reserved "refine"; n <- pName
1626 return $ Refine n imps)
1627 <|> do reserved "refine"; n <- pName
1629 return $ Refine n []
1630 <|> do reserved "mrefine"; n <- pName
1632 return $ MatchRefine n
1633 <|> do reserved "rewrite"; t <- pExpr syn;
1635 return $ Rewrite (desugar syn i t)
1636 <|> do reserved "equiv"; t <- pExpr syn;
1638 return $ Equiv (desugar syn i t)
1639 <|> try (do reserved "let"; n <- pName; lchar ':';
1640 ty <- pExpr' syn; lchar '='; t <- pExpr syn;
1642 return $ LetTacTy n (desugar syn i ty) (desugar syn i t))
1643 <|> try (do reserved "let"; n <- pName; lchar '=';
1646 return $ LetTac n (desugar syn i t))
1647 <|> do reserved "focus"; n <- pName
1649 <|> do reserved "exact"; t <- pExpr syn;
1651 return $ Exact (desugar syn i t)
1652 <|> do reserved "applyTactic"; t <- pExpr syn;
1654 return $ ApplyTactic (desugar syn i t)
1655 <|> do reserved "reflect"; t <- pExpr syn;
1657 return $ Reflect (desugar syn i t)
1658 <|> do reserved "fill"; t <- pExpr syn;
1660 return $ Fill (desugar syn i t)
1661 <|> do reserved "try"; t <- pTactic syn;
1671 <|> do reserved "compute"; return Compute
1672 <|> do reserved "trivial"; return Trivial
1673 <|> do reserved "solve"; return Solve
1674 <|> do reserved "attack"; return Attack
1675 <|> do reserved "state"; return ProofState
1676 <|> do reserved "term"; return ProofTerm
1677 <|> do reserved "undo"; return Undo
1678 <|> do reserved "qed"; return Qed
1679 <|> do reserved "abandon"; return Abandon
1680 <|> do lchar ':'; reserved "q"; return Abandon
1682 imp = do lchar '?'; return False
1683 <|> 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