on bf4e535 help sign in
Idris-dev/src/Pkg/PParser.hs
103 lines 3.4 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, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)
10import Idris.Core.TT
11import Idris.REPL
12import Idris.AbsSyntaxTree
13import Idris.ParseHelpers
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
37#if MIN_VERSION_base(4,8,0)
38instance {-# OVERLAPPING #-} TokenParsing PParser where
39#else
40instance TokenParsing PParser where
41#endif
42 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
45defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
47parseDesc :: FilePath -> IO PkgDesc
48parseDesc fp = do p <- readFile fp
49 case runparser pPkg defaultPkg fp p of
50 Failure err -> fail (show err)
51 Success x -> return x
53pPkg :: PParser PkgDesc
54pPkg = do reserved "package"; p <- identifier
55 st <- get
56 put (st { pkgname = p })
57 some pClause
58 st <- get
59 eof
60 return st
62pClause :: PParser ()
63pClause = do reserved "executable"; lchar '=';
64 exec <- iName []
65 st <- get
66 put (st { execout = Just (if isWindows
67 then ((show exec) ++ ".exe")
68 else ( show exec )
69 ) })
70 <|> do reserved "main"; lchar '=';
71 main <- iName []
72 st <- get
73 put (st { idris_main = main })
74 <|> do reserved "sourcedir"; lchar '=';
75 src <- identifier
76 st <- get
77 put (st { sourcedir = src })
78 <|> do reserved "opts"; lchar '=';
79 opts <- stringLiteral
80 st <- get
81 let args = pureArgParser (words opts)
82 put (st { idris_opts = args })
83 <|> do reserved "modules"; lchar '=';
84 ms <- sepBy1 (iName []) (lchar ',')
85 st <- get
86 put (st { modules = modules st ++ ms })
87 <|> do reserved "libs"; lchar '=';
88 ls <- sepBy1 identifier (lchar ',')
89 st <- get
90 put (st { libdeps = libdeps st ++ ls })
91 <|> do reserved "objs"; lchar '=';
92 ls <- sepBy1 identifier (lchar ',')
93 st <- get
94 put (st { objs = libdeps st ++ ls })
95 <|> do reserved "makefile"; lchar '=';
96 mk <- iName []
97 st <- get
98 put (st { makefile = Just (show mk) })
99 <|> do reserved "tests"; lchar '=';
100 ts <- sepBy1 (iName []) (lchar ',')
101 st <- get
102 put st { idris_tests = idris_tests st ++ ts }