@@ -2,7 +2,13 @@
2#if !(MIN_VERSION_base(4,8,0))
2#if !(MIN_VERSION_base(4,8,0))
3{-# LANGUAGE OverlappingInstances #-}
3{-# LANGUAGE OverlappingInstances #-}
5−
5+-- ------------------------------------------------------------- [ PParser.hs ]
7+-- Copyright : (c) The Idris Community.
8+-- License : see LICENSE
10+-- The parser for Idris ipkg files.
11+-- -------------------------------------------------------------------- [ EOH ]
6module Pkg.PParser where
12module Pkg.PParser where
8import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)
14import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)
@@ -18,21 +24,20 @@ import Control.Applicative
19import Util.System
25import Util.System
22type PParser = StateT PkgDesc IdrisInnerParser
27type PParser = StateT PkgDesc IdrisInnerParser
24−data PkgDesc = PkgDesc { pkgname :: String,
29+data PkgDesc = PkgDesc {
25− libdeps :: [String],
31+ , libdeps :: [String]
26− objs :: [String],
32+ , objs :: [String]
27− makefile :: Maybe String,
33+ , makefile :: Maybe String
28− idris_opts :: [Opt],
34+ , idris_opts :: [Opt]
29− sourcedir :: String,
35+ , sourcedir :: String
30− modules :: [Name],
36+ , modules :: [Name]
31− idris_main :: Name,
37+ , idris_main :: Name
32− execout :: Maybe String,
38+ , execout :: Maybe String
33− idris_tests :: [Name]
39+ , idris_tests :: [Name]
35− deriving Show
40+ } deriving (Show)
37instance HasLastTokenSpan PParser where
42instance HasLastTokenSpan PParser where
38 getLastTokenSpan = return Nothing
43 getLastTokenSpan = return Nothing
@@ -44,23 +49,25 @@ instance TokenParsing PParser where
45 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
50 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
47−
52+defaultPkg :: PkgDesc
48defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
53defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
50parseDesc :: FilePath -> IO PkgDesc
55parseDesc :: FilePath -> IO PkgDesc
51−parseDesc fp = do p <- readFile fp
56+parseDesc fp = do
52− case runparser pPkg defaultPkg fp p of
58+ case runparser pPkg defaultPkg fp p of
53− Failure err -> fail (show err)
59+ Failure err -> fail (show err)
54− Success x -> return x
60+ Success x -> return x
56pPkg :: PParser PkgDesc
62pPkg :: PParser PkgDesc
57−pPkg = do reserved "package"; p <- fst <$> identifier
64+ reserved "package"; p <- fst <$> identifier
58− st <- get
65+ st <- get
59− put (st { pkgname = p })
66+ put (st { pkgname = p })
60− some pClause
67+ some pClause
61− st <- get
68+ st <- get
63− return st
70+ return st
65pClause :: PParser ()
72pClause :: PParser ()
66pClause = do reserved "executable"; lchar '=';
73pClause = do reserved "executable"; lchar '=';
@@ -80,6 +87,11 @@ pClause = do reserved "executable"; lchar '=';
81 let args = pureArgParser (words opts)
88 let args = pureArgParser (words opts)
82 put (st { idris_opts = args })
89 put (st { idris_opts = args })
90+ <|> do reserved "pkgs"; lchar '=';
91+ ps <- sepBy1 (fst <$> identifier) (lchar ',')
93+ let pkgs = pureArgParser $ map (\x -> unwords ["-p", x]) ps
94+ put (st {idris_opts = idris_opts st ++ pkgs})
83 <|> do reserved "modules"; lchar '=';
95 <|> do reserved "modules"; lchar '=';
84 ms <- sepBy1 (fst <$> iName []) (lchar ',')
96 ms <- sepBy1 (fst <$> iName []) (lchar ',')
@@ -101,3 +113,4 @@ pClause = do reserved "executable"; lchar '=';
101 st <- get
113 st <- get
102 put st { idris_tests = idris_tests st ++ ts }
114 put st { idris_tests = idris_tests st ++ ts }
116+-- -------------------------------------------------------------------- [ EOF ]