on fca147b help sign in
Idris-dev/src/Pkg/PParser.hs
93 lines 3.0 kB history raw
1{-# LANGUAGE OverlappingInstances #-}
3module Pkg.PParser where
5import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)
7import Idris.Core.TT
8import Idris.REPL
9import Idris.AbsSyntaxTree
10import Idris.ParseHelpers
11import Idris.CmdOptions
13import Paths_idris
15import Control.Monad.State.Strict
16import Control.Applicative
19type PParser = StateT PkgDesc IdrisInnerParser
21data PkgDesc = PkgDesc { pkgname :: String,
22 libdeps :: [String],
23 objs :: [String],
24 makefile :: Maybe String,
25 idris_opts :: [Opt],
26 sourcedir :: String,
27 modules :: [Name],
28 idris_main :: Name,
29 execout :: Maybe String,
30 idris_tests :: [Name]
31 }
32 deriving Show
34instance TokenParsing PParser where
35 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
38defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
40parseDesc :: FilePath -> IO PkgDesc
41parseDesc fp = do p <- readFile fp
42 case runparser pPkg defaultPkg fp p of
43 Failure err -> fail (show err)
44 Success x -> return x
46pPkg :: PParser PkgDesc
47pPkg = do reserved "package"; p <- identifier
48 st <- get
49 put (st { pkgname = p })
50 some pClause
51 st <- get
52 eof
53 return st
55pClause :: PParser ()
56pClause = do reserved "executable"; lchar '=';
57 exec <- iName []
58 st <- get
59 put (st { execout = Just (show exec) })
60 <|> do reserved "main"; lchar '=';
61 main <- iName []
62 st <- get
63 put (st { idris_main = main })
64 <|> do reserved "sourcedir"; lchar '=';
65 src <- identifier
66 st <- get
67 put (st { sourcedir = src })
68 <|> do reserved "opts"; lchar '=';
69 opts <- stringLiteral
70 st <- get
71 let args = pureArgParser (words opts)
72 put (st { idris_opts = args })
73 <|> do reserved "modules"; lchar '=';
74 ms <- sepBy1 (iName []) (lchar ',')
75 st <- get
76 put (st { modules = modules st ++ ms })
77 <|> do reserved "libs"; lchar '=';
78 ls <- sepBy1 identifier (lchar ',')
79 st <- get
80 put (st { libdeps = libdeps st ++ ls })
81 <|> do reserved "objs"; lchar '=';
82 ls <- sepBy1 identifier (lchar ',')
83 st <- get
84 put (st { objs = libdeps st ++ ls })
85 <|> do reserved "makefile"; lchar '=';
86 mk <- iName []
87 st <- get
88 put (st { makefile = Just (show mk) })
89 <|> do reserved "tests"; lchar '=';
90 ts <- sepBy1 (iName []) (lchar ',')
91 st <- get
92 put st { idris_tests = idris_tests st ++ ts }