@@ -2,7 +2,13 @@
22#if !(MIN_VERSION_base(4,8,0))
33{-# LANGUAGE OverlappingInstances #-}
44#endif
5−
5+-- ------------------------------------------------------------- [ PParser.hs ]
6+-- Module : PParser.hs
7+-- Copyright : (c) The Idris Community.
8+-- License : see LICENSE
9+--
10+-- The parser for Idris ipkg files.
11+-- -------------------------------------------------------------------- [ EOH ]
612module Pkg.PParser where
713
814import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)
@@ -18,21 +24,20 @@ import Control.Applicative
1824
1925import Util.System
2026
21−
2227type PParser = StateT PkgDesc IdrisInnerParser
2328
24−data 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
29+data PkgDesc = PkgDesc {
30+ pkgname :: String
31+ , libdeps :: [String]
32+ , objs :: [String]
33+ , makefile :: Maybe String
34+ , idris_opts :: [Opt]
35+ , sourcedir :: String
36+ , modules :: [Name]
37+ , idris_main :: Name
38+ , execout :: Maybe String
39+ , idris_tests :: [Name]
40+ } deriving (Show)
3641
3742instance HasLastTokenSpan PParser where
3843 getLastTokenSpan = return Nothing
@@ -44,23 +49,25 @@ instance TokenParsing PParser where
4449#endif
4550 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
4651
47−
52+defaultPkg :: PkgDesc
4853defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
4954
5055parseDesc :: FilePath -> IO PkgDesc
51−parseDesc fp = do p <- readFile fp
52− case runparser pPkg defaultPkg fp p of
53− Failure err -> fail (show err)
54− Success x -> return x
56+parseDesc fp = do
57+ p <- readFile fp
58+ case runparser pPkg defaultPkg fp p of
59+ Failure err -> fail (show err)
60+ Success x -> return x
5561
5662pPkg :: PParser PkgDesc
57−pPkg = 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
63+pPkg = do
64+ reserved "package"; p <- fst <$> identifier
65+ st <- get
66+ put (st { pkgname = p })
67+ some pClause
68+ st <- get
69+ eof
70+ return st
6471
6572pClause :: PParser ()
6673pClause = do reserved "executable"; lchar '=';
@@ -80,6 +87,11 @@ pClause = do reserved "executable"; lchar '=';
8087 st <- get
8188 let args = pureArgParser (words opts)
8289 put (st { idris_opts = args })
90+ <|> do reserved "pkgs"; lchar '=';
91+ ps <- sepBy1 (fst <$> identifier) (lchar ',')
92+ st <- get
93+ let pkgs = pureArgParser $ map (\x -> unwords ["-p", x]) ps
94+ put (st {idris_opts = idris_opts st ++ pkgs})
8395 <|> do reserved "modules"; lchar '=';
8496 ms <- sepBy1 (fst <$> iName []) (lchar ',')
8597 st <- get
@@ -101,3 +113,4 @@ pClause = do reserved "executable"; lchar '=';
101113 st <- get
102114 put st { idris_tests = idris_tests st ++ ts }
103115
116+-- -------------------------------------------------------------------- [ EOF ]