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 }