module Text.ParserCombinators.Parsec.IndentParser.Prim
(
IndentParser,
IndentCharParser,
IndentMode(..),
IndentState,
getIndentMode, setIndentMode,
getIndentPos, setIndentPos,
getState, setState,
runParser, parse, parseFromFile, parseTest,
) where
import Text.ParserCombinators.Parsec hiding
( getState, setState, parseTest, runParser,
parse, parseFromFile,
)
import qualified Text.ParserCombinators.Parsec.Prim as PP
import Control.Monad(fmap)
import Text.ParserCombinators.Parsec.Pos(initialPos)
import System.IO
data IndentMode = NoIndent
| Block
| LineFold
deriving Eq
data IndentState = IndentState {
indentMode :: IndentMode,
indentPos :: SourcePos
}
type IndentParser tok st a = GenParser tok (st, IndentState) a
type IndentCharParser st a = IndentParser Char st a
getState :: IndentParser tok st st
getIndentState :: IndentParser tok st IndentState
getIndentMode :: IndentParser tok st IndentMode
getIndentPos :: IndentParser tok st SourcePos
getState = fmap fst getStatePrim
getIndentState = fmap snd getStatePrim
getIndentMode = fmap indentMode getIndentState
getIndentPos = fmap indentPos getIndentState
setState :: st -> IndentParser tok st ()
setIndentPos :: SourcePos -> IndentParser tok st ()
setIndentMode :: IndentMode -> IndentParser tok st ()
setIndentState :: IndentState -> IndentParser tok st ()
setState st = do indst <- getIndentState
setStatePrim (st,indst)
setIndentState indst = do st <- getState
setStatePrim (st, indst)
setIndentPos sp = do indst <- getIndentState
setIndentState $ indst {indentPos = sp}
setIndentMode indm = do indst <- getIndentState
setIndentState $ indst {indentMode = indm}
runParser :: IndentParser tok st a
-> st
-> IndentMode
-> SourceName
-> [tok]
-> Either ParseError a
runParser p st imode sname = runParserPrim p (st, istate) sname
where istate = IndentState { indentPos = initialPos sname,
indentMode = imode
}
parse :: IndentParser tok () a
-> SourceName
-> [tok]
-> Either ParseError a
parse p = runParser p () NoIndent
parseFromFile :: IndentCharParser () a
-> SourceName
-> IO (Either ParseError a)
parseFromFile p fpath = do str <- readFile fpath
return $ parse p fpath str
parseTest :: Show a =>
IndentParser tok () a
-> [tok]
-> IO ()
parseTest p input = case result of
Left err -> do putStr "Error"; print err
Right a -> do print a
where result = runParser p () NoIndent "" input
getStatePrim = PP.getState
setStatePrim = PP.setState
runParserPrim = PP.runParser