on f2bf55d help sign in
Idris-dev/src/Pkg/PParser.hs
81 lines 2.6 kB history raw
1module Pkg.PParser where
3import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)
5import Idris.Core.TT
6import Idris.REPL
7import Idris.AbsSyntaxTree
8import Idris.ParseHelpers
10import Paths_idris
12import Control.Monad.State.Strict
13import Control.Applicative
16type PParser = StateT PkgDesc IdrisInnerParser
18data PkgDesc = PkgDesc { pkgname :: String,
19 libdeps :: [String],
20 objs :: [String],
21 makefile :: Maybe String,
22 idris_opts :: [Opt],
23 sourcedir :: String,
24 modules :: [Name],
25 idris_main :: Name,
26 execout :: Maybe String
27 }
28 deriving Show
30defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing
32parseDesc :: FilePath -> IO PkgDesc
33parseDesc fp = do p <- readFile fp
34 case runparser pPkg defaultPkg fp p of
35 Failure err -> fail (show err)
36 Success x -> return x
38pPkg :: PParser PkgDesc
39pPkg = do reserved "package"; p <- identifier
40 st <- get
41 put (st { pkgname = p })
42 some pClause
43 st <- get
44 eof
45 return st
47pClause :: PParser ()
48pClause = do reserved "executable"; lchar '=';
49 exec <- iName []
50 st <- get
51 put (st { execout = Just (show exec) })
52 <|> do reserved "main"; lchar '=';
53 main <- iName []
54 st <- get
55 put (st { idris_main = main })
56 <|> do reserved "sourcedir"; lchar '=';
57 src <- identifier
58 st <- get
59 put (st { sourcedir = src })
60 <|> do reserved "opts"; lchar '=';
61 opts <- stringLiteral
62 st <- get
63 let args = parseArgs (words opts)
64 put (st { idris_opts = args })
65 <|> do reserved "modules"; lchar '=';
66 ms <- sepBy1 (iName []) (lchar ',')
67 st <- get
68 put (st { modules = modules st ++ ms })
69 <|> do reserved "libs"; lchar '=';
70 ls <- sepBy1 identifier (lchar ',')
71 st <- get
72 put (st { libdeps = libdeps st ++ ls })
73 <|> do reserved "objs"; lchar '=';
74 ls <- sepBy1 identifier (lchar ',')
75 st <- get
76 put (st { objs = libdeps st ++ ls })
77 <|> do reserved "makefile"; lchar '=';
78 mk <- iName []
79 st <- get
80 put (st { makefile = Just (show mk) })