hpaco-lib-0.16.1.0: Text/HPaco/Readers/Paco.hs
module Text.HPaco.Readers.Paco
( readPaco
)
where
import Control.Monad
import Control.Monad.IO.Class
import Text.HPaco.Reader
import Text.HPaco.Readers.Paco.ParserInternals
import Text.HPaco.Readers.Paco.Basics
import Text.HPaco.Readers.Paco.Statements
import Text.HPaco.AST.AST
import Text.HPaco.AST.Statement
import Text.HPaco.AST.Expression
import Control.Exception (throw)
import System.IO (withFile, IOMode (ReadMode))
import System.IO.Strict
import System.FilePath
readPaco :: Reader
readPaco filename =
let pstate = defaultPacoState
{ psBasePath = takeDirectory filename
, psIncludeExtension = renull $ takeExtension filename
, psHandleInclude = readPaco
}
in readPacoWithState pstate filename
where renull "" = Nothing
renull x = Just x
readPacoWithState :: PacoState -> Reader
readPacoWithState pstate filename src = do
result <- runParserT document pstate filename src
either
throw
return
result
document :: Parser AST
document = do
stmts <- statements
eof
pstate <- getState
return $ AST
{ astRootStatement = StatementSequence stmts
, astDefs = psDefs pstate
, astDeps = psDeps pstate
}