on 54e4e41 help sign in
Idris-dev/src/Pkg/PParser.hs
106 lines 3.5 kB history raw
1{-# LANGUAGE CPP #-}
2#if !(MIN_VERSION_base(4,8,0))
3{-# LANGUAGE OverlappingInstances #-}
4#endif
6module Pkg.PParser where
8import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)
10import Idris.Core.TT
11import Idris.REPL
12import Idris.AbsSyntaxTree
13import Idris.ParseHelpers hiding (stringLiteral)
14import Idris.CmdOptions
16import Control.Monad.State.Strict
17import Control.Applicative
19import Util.System
22type PParser = StateT PkgDesc IdrisInnerParser
24data PkgDesc = PkgDesc { pkgname :: String,
25 libdeps :: [String],
26 objs :: [String],
27 makefile :: Maybe String,
28 idris_opts :: [Opt],
29 sourcedir :: String,
30 modules :: [Name],
31 idris_main :: Name,
32 execout :: Maybe String,
33 idris_tests :: [Name]
34 }
35 deriving Show
37instance HasLastTokenSpan PParser where
38 getLastTokenSpan = return Nothing
40#if MIN_VERSION_base(4,8,0)
41instance {-# OVERLAPPING #-} TokenParsing PParser where
42#else
43instance TokenParsing PParser where
44#endif
45 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
48defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
50parseDesc :: FilePath -> IO PkgDesc
51parseDesc fp = do p <- readFile fp
52 case runparser pPkg defaultPkg fp p of
53 Failure err -> fail (show err)
54 Success x -> return x
56pPkg :: PParser PkgDesc
57pPkg = do reserved "package"; p <- fst <$> identifier
58 st <- get
59 put (st { pkgname = p })
60 some pClause
61 st <- get
62 eof
63 return st
65pClause :: PParser ()
66pClause = do reserved "executable"; lchar '=';
67 exec <- fst <$> iName []
68 st <- get
69 put (st { execout = Just (if isWindows
70 then ((show exec) ++ ".exe")
71 else ( show exec )
72 ) })
73 <|> do reserved "main"; lchar '=';
74 main <- fst <$> iName []
75 st <- get
76 put (st { idris_main = main })
77 <|> do reserved "sourcedir"; lchar '=';
78 src <- fst <$> identifier
79 st <- get
80 put (st { sourcedir = src })
81 <|> do reserved "opts"; lchar '=';
82 opts <- stringLiteral
83 st <- get
84 let args = pureArgParser (words opts)
85 put (st { idris_opts = args })
86 <|> do reserved "modules"; lchar '=';
87 ms <- sepBy1 (fst <$> iName []) (lchar ',')
88 st <- get
89 put (st { modules = modules st ++ ms })
90 <|> do reserved "libs"; lchar '=';
91 ls <- sepBy1 (fst <$> identifier) (lchar ',')
92 st <- get
93 put (st { libdeps = libdeps st ++ ls })
94 <|> do reserved "objs"; lchar '=';
95 ls <- sepBy1 (fst <$> identifier) (lchar ',')
96 st <- get
97 put (st { objs = libdeps st ++ ls })
98 <|> do reserved "makefile"; lchar '=';
99 mk <- fst <$> iName []
100 st <- get
101 put (st { makefile = Just (show mk) })
102 <|> do reserved "tests"; lchar '=';
103 ts <- sepBy1 (fst <$> iName []) (lchar ',')
104 st <- get
105 put st { idris_tests = idris_tests st ++ ts }