on 7afa310 help sign in
Idris-dev/src/Pkg/PParser.hs
96 lines 3.2 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 Control.Monad.State.Strict
14import Control.Applicative
16import System.Info (os)
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 (if os `elem` ["win32", "mingw32", "cygwin32"]
60 then ((show exec) ++ ".exe")
61 else ( show exec )
62 ) })
63 <|> do reserved "main"; lchar '=';
64 main <- iName []
65 st <- get
66 put (st { idris_main = main })
67 <|> do reserved "sourcedir"; lchar '=';
68 src <- identifier
69 st <- get
70 put (st { sourcedir = src })
71 <|> do reserved "opts"; lchar '=';
72 opts <- stringLiteral
73 st <- get
74 let args = pureArgParser (words opts)
75 put (st { idris_opts = args })
76 <|> do reserved "modules"; lchar '=';
77 ms <- sepBy1 (iName []) (lchar ',')
78 st <- get
79 put (st { modules = modules st ++ ms })
80 <|> do reserved "libs"; lchar '=';
81 ls <- sepBy1 identifier (lchar ',')
82 st <- get
83 put (st { libdeps = libdeps st ++ ls })
84 <|> do reserved "objs"; lchar '=';
85 ls <- sepBy1 identifier (lchar ',')
86 st <- get
87 put (st { objs = libdeps st ++ ls })
88 <|> do reserved "makefile"; lchar '=';
89 mk <- iName []
90 st <- get
91 put (st { makefile = Just (show mk) })
92 <|> do reserved "tests"; lchar '=';
93 ts <- sepBy1 (iName []) (lchar ',')
94 st <- get
95 put st { idris_tests = idris_tests st ++ ts }