on 4aec152 help sign in
Idris-dev/src/Idris/REPLParser.hs
181 lines 10 kB history raw
1module Idris.REPLParser(parseCmd) where
3import System.FilePath ((</>))
4import System.Console.ANSI (Color(..))
6import Idris.Colours
7import Idris.AbsSyntax
8import Idris.Core.TT
9import qualified Idris.Parser as P
11import Control.Applicative
12import Control.Monad.State.Strict
14import Text.Parser.Combinators
15import Text.Parser.Char(anyChar)
16import Text.Trifecta(Result, parseString)
17import Text.Trifecta.Delta
19import Debug.Trace
20import Data.List
21import Data.List.Split(splitOn)
22import Data.Char(toLower)
23import qualified Data.ByteString.UTF8 as UTF8
25parseCmd :: IState -> String -> String -> Result Command
26parseCmd i inputname = P.runparser pCmd i inputname
28cmd :: [String] -> P.IdrisParser ()
29cmd xs = do P.lchar ':'; docmd (sortBy (\x y -> compare (length y) (length x)) xs)
30 where docmd [] = fail "No such command"
31 docmd (x:xs) = try (discard (P.symbol x)) <|> docmd xs
33pCmd :: P.IdrisParser Command
34pCmd = do P.whiteSpace; try (do cmd ["q", "quit"]; eof; return Quit)
35 <|> try (do cmd ["h", "?", "help"]; eof; return Help)
36 <|> try (do cmd ["r", "reload"]; eof; return Reload)
37 <|> try (do cmd ["module"]; f <- P.identifier; eof;
38 return (ModImport (toPath f)))
39 <|> try (do cmd ["e", "edit"]; eof; return Edit)
40 <|> try (do cmd ["exec", "execute"]; eof; return Execute)
41 <|> try (do cmd ["c", "compile"]; f <- P.identifier; eof; return (Compile ViaC f))
42 <|> try (do cmd ["jc", "newcompile"]; f <- P.identifier; eof; return (Compile ViaJava f))
43 <|> try (do cmd ["js", "javascript"]; f <- P.identifier; eof; return (Compile ViaJavaScript f))
44 <|> try (do cmd ["proofs"]; eof; return Proofs)
45 <|> try (do cmd ["rmproof"]; n <- P.name; eof; return (RmProof n))
46 <|> try (do cmd ["showproof"]; n <- P.name; eof; return (ShowProof n))
47 <|> try (do cmd ["log"]; i <- P.natural; eof; return (LogLvl (fromIntegral i)))
48 <|> try (do cmd ["l", "load"]; f <- many anyChar; return (Load f))
49 <|> try (do cmd ["cd"]; f <- many anyChar; return (ChangeDirectory f))
50 <|> try (do cmd ["spec"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Spec t))
51 <|> try (do cmd ["hnf"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (HNF t))
52 <|> try (do cmd ["inline"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (TestInline t))
53 <|> try (do cmd ["doc"]; n <- P.fnName; eof; return (DocStr n))
54 <|> try (do cmd ["d", "def"]; some (P.char ' ') ; n <- P.fnName; eof; return (Defn n))
55 <|> try (do cmd ["total"]; do n <- P.fnName; eof; return (TotCheck n))
56 <|> try (do cmd ["t", "type"]; do P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Check t))
57 <|> try (do cmd ["u", "universes"]; eof; return Universes)
58 <|> try (do cmd ["di", "dbginfo"]; n <- P.fnName; eof; return (DebugInfo n))
59 <|> try (do cmd ["i", "info"]; n <- P.fnName; eof; return (Info n))
60 <|> try (do cmd ["miss", "missing"]; n <- P.fnName; eof; return (Missing n))
61 <|> try (do cmd ["dynamic"]; eof; return ListDynamic)
62 <|> try (do cmd ["dynamic"]; l <- many anyChar; return (DynamicLink l))
63 <|> try (do cmd ["color", "colour"]; pSetColourCmd)
64 <|> try (do cmd ["set"]; o <- pOption; return (SetOpt o))
65 <|> try (do cmd ["unset"]; o <- pOption; return (UnsetOpt o))
66 <|> try (do cmd ["s", "search"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Search t))
67 <|> try (do cmd ["cs", "casesplit"]; P.whiteSpace;
68 upd <- option False (do P.lchar '!'; return True)
69 l <- P.natural; n <- P.name;
70 return (CaseSplitAt upd (fromInteger l) n))
71 <|> try (do cmd ["apc", "addproofclause"]; P.whiteSpace;
72 upd <- option False (do P.lchar '!'; return True)
73 l <- P.natural; n <- P.name;
74 return (AddProofClauseFrom upd (fromInteger l) n))
75 <|> try (do cmd ["ac", "addclause"]; P.whiteSpace;
76 upd <- option False (do P.lchar '!'; return True)
77 l <- P.natural; n <- P.name;
78 return (AddClauseFrom upd (fromInteger l) n))
79 <|> try (do cmd ["am", "addmissing"]; P.whiteSpace;
80 upd <- option False (do P.lchar '!'; return True)
81 l <- P.natural; n <- P.name;
82 return (AddMissing upd (fromInteger l) n))
83 <|> try (do cmd ["mw", "makewith"]; P.whiteSpace;
84 upd <- option False (do P.lchar '!'; return True)
85 l <- P.natural; n <- P.name;
86 return (MakeWith upd (fromInteger l) n))
87 <|> try (do cmd ["ps", "proofsearch"]; P.whiteSpace;
88 upd <- option False (do P.lchar '!'; return True)
89 l <- P.natural; n <- P.name;
90 hints <- many P.fnName
91 return (DoProofSearch upd True (fromInteger l) n hints))
92 <|> try (do cmd ["ref", "refine"]; P.whiteSpace;
93 upd <- option False (do P.lchar '!'; return True)
94 l <- P.natural; n <- P.name;
95 hint <- P.fnName
96 return (DoProofSearch upd False (fromInteger l) n [hint]))
97 <|> try (do cmd ["p", "prove"]; n <- P.name; eof; return (Prove n))
98 <|> try (do cmd ["m", "metavars"]; eof; return Metavars)
99 <|> try (do cmd ["a", "addproof"]; do n <- option Nothing (do x <- P.name;
100 return (Just x))
101 eof; return (AddProof n))
102 <|> try (do cmd ["x"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (ExecVal t))
103 <|> try (do cmd ["patt"]; P.whiteSpace; t <- P.fullExpr defaultSyntax; return (Pattelab t))
104 <|> try (do cmd ["errorhandlers"]; eof ; return ListErrorHandlers)
105 <|> try (do cmd ["consolewidth"]; w <- pConsoleWidth ; return (SetConsoleWidth w))
106 <|> try (do cmd ["apropos"]; str <- many anyChar ; return (Apropos str))
107 <|> try (do cmd ["wc", "whocalls"]; P.whiteSpace; n <- P.fnName ; return (WhoCalls n))
108 <|> try (do cmd ["cw", "callswho"]; P.whiteSpace; n <- P.fnName ; return (CallsWho n))
109 <|> try (do cmd ["mkdoc"]; str <- many anyChar; return (MakeDoc str))
110 <|> do P.whiteSpace; do eof; return NOP
111 <|> do t <- P.fullExpr defaultSyntax; return (Eval t)
113 where toPath n = foldl1' (</>) $ splitOn "." n
115pOption :: P.IdrisParser Opt
116pOption = do discard (P.symbol "errorcontext"); return ErrContext
117 <|> do discard (P.symbol "showimplicits"); return ShowImpl
118 <|> do discard (P.symbol "originalerrors"); return ShowOrigErr
119 <|> do discard (P.symbol "autosolve"); return AutoSolve
121pConsoleWidth :: P.IdrisParser ConsoleWidth
122pConsoleWidth = do discard (P.symbol "auto"); return AutomaticWidth
123 <|> do discard (P.symbol "infinite"); return InfinitelyWide
124 <|> do n <- fmap fromInteger P.natural; return (ColsWide n)
126colours :: [(String, Maybe Color)]
127colours = [ ("black", Just Black)
128 , ("red", Just Red)
129 , ("green", Just Green)
130 , ("yellow", Just Yellow)
131 , ("blue", Just Blue)
132 , ("magenta", Just Magenta)
133 , ("cyan", Just Cyan)
134 , ("white", Just White)
135 , ("default", Nothing)
136 ]
138pColour :: P.IdrisParser (Maybe Color)
139pColour = doColour colours
140 where doColour [] = fail "Unknown colour"
141 doColour ((s, c):cs) = (try (P.symbol s) >> return c) <|> doColour cs
143pColourMod :: P.IdrisParser (IdrisColour -> IdrisColour)
144pColourMod = try (P.symbol "vivid" >> return doVivid)
145 <|> try (P.symbol "dull" >> return doDull)
146 <|> try (P.symbol "underline" >> return doUnderline)
147 <|> try (P.symbol "nounderline" >> return doNoUnderline)
148 <|> try (P.symbol "bold" >> return doBold)
149 <|> try (P.symbol "nobold" >> return doNoBold)
150 <|> try (P.symbol "italic" >> return doItalic)
151 <|> try (P.symbol "noitalic" >> return doNoItalic)
152 <|> try (pColour >>= return . doSetColour)
153 where doVivid i = i { vivid = True }
154 doDull i = i { vivid = False }
155 doUnderline i = i { underline = True }
156 doNoUnderline i = i { underline = False }
157 doBold i = i { bold = True }
158 doNoBold i = i { bold = False }
159 doItalic i = i { italic = True }
160 doNoItalic i = i { italic = False }
161 doSetColour c i = i { colour = c }
164colourTypes :: [(String, ColourType)]
165colourTypes = map (\x -> ((map toLower . reverse . drop 6 . reverse . show) x, x)) $
166 enumFromTo minBound maxBound
168pColourType :: P.IdrisParser ColourType
169pColourType = doColourType colourTypes
170 where doColourType [] = fail $ "Unknown colour category. Options: " ++
171 (concat . intersperse ", " . map fst) colourTypes
172 doColourType ((s,ct):cts) = (try (P.symbol s) >> return ct) <|> doColourType cts
174pSetColourCmd :: P.IdrisParser Command
175pSetColourCmd = (do c <- pColourType
176 let defaultColour = IdrisColour Nothing True False False False
177 opts <- sepBy pColourMod (P.whiteSpace)
178 let colour = foldr ($) defaultColour $ reverse opts
179 return $ SetColour c colour)
180 <|> try (P.symbol "on" >> return ColourOn)
181 <|> try (P.symbol "off" >> return ColourOff)