Explicitly import the Prelude, and add a few types signatures to make
these modules produce better documentation.
import Data.Char
import Text.ParserCombinators.Parsec.Pos( updatePosChar, updatePosString )
import Text.ParserCombinators.Parsec.Prim
import Data.Char
import Text.ParserCombinators.Parsec.Pos( updatePosChar, updatePosString )
import Text.ParserCombinators.Parsec.Prim
(\c -> if f c then Just c else Nothing)
string :: String -> CharParser st String
(\c -> if f c then Just c else Nothing)
string :: String -> CharParser st String
-string s = tokens show updatePosString s
\ No newline at end of file
+string s = tokens show updatePosString s
import Data.List (nub,sortBy)
import Text.ParserCombinators.Parsec.Pos
import Data.List (nub,sortBy)
import Text.ParserCombinators.Parsec.Pos
Expect _ -> 2
Message _ -> 3
Expect _ -> 2
Message _ -> 3
+messageCompare :: Message -> Message -> Ordering
messageCompare msg1 msg2
= compare (messageToEnum msg1) (messageToEnum msg2)
messageCompare msg1 msg2
= compare (messageToEnum msg1) (messageToEnum msg2)
+messageString :: Message -> String
messageString msg
= case msg of SysUnExpect s -> s
UnExpect s -> s
Expect s -> s
Message s -> s
messageString msg
= case msg of SysUnExpect s -> s
UnExpect s -> s
Expect s -> s
Message s -> s
+messageEq :: Message -> Message -> Bool
messageEq msg1 msg2
= (messageCompare msg1 msg2 == EQ)
messageEq msg1 msg2
= (messageCompare msg1 msg2 == EQ)
-----------------------------------------------------------
-- Create parse errors
-----------------------------------------------------------
-----------------------------------------------------------
-- Create parse errors
-----------------------------------------------------------
+newErrorUnknown :: SourcePos -> ParseError
newErrorUnknown pos
= ParseError pos []
newErrorUnknown pos
= ParseError pos []
+newErrorMessage :: Message -> SourcePos -> ParseError
newErrorMessage msg pos
= ParseError pos [msg]
newErrorMessage msg pos
= ParseError pos [msg]
+addErrorMessage :: Message -> ParseError -> ParseError
addErrorMessage msg (ParseError pos msgs)
= ParseError pos (msg:msgs)
addErrorMessage msg (ParseError pos msgs)
= ParseError pos (msg:msgs)
+setErrorPos :: SourcePos -> ParseError -> ParseError
setErrorPos pos (ParseError _ msgs)
= ParseError pos msgs
setErrorPos pos (ParseError _ msgs)
= ParseError pos msgs
+setErrorMessage :: Message -> ParseError -> ParseError
setErrorMessage msg (ParseError pos msgs)
= ParseError pos (msg:filter (not . messageEq msg) msgs)
setErrorMessage msg (ParseError pos msgs)
= ParseError pos (msg:filter (not . messageEq msg) msgs)
, getParserState, setParserState
) where
, getParserState, setParserState
) where
import Text.ParserCombinators.Parsec.Pos
import Text.ParserCombinators.Parsec.Error
import Control.Monad
import Text.ParserCombinators.Parsec.Pos
import Text.ParserCombinators.Parsec.Error
import Control.Monad
-getParserState = updateParserState id
+getParserState :: GenParser tok st (State tok st)
+getParserState = updateParserState id
+
+setParserState :: State tok st -> GenParser tok st (State tok st)
setParserState st = updateParserState (const st)
setParserState st = updateParserState (const st)
+parse :: GenParser tok () a -> SourceName -> [tok] -> Either ParseError a
parse p name input
= runParser p () name input
parse p name input
= runParser p () name input
label p msg
= labels p [msg]
label p msg
= labels p [msg]
+labels :: GenParser tok st a -> [String] -> GenParser tok st a
labels (Parser p) msgs
= Parser (\state ->
case (p state) of
labels (Parser p) msgs
= Parser (\state ->
case (p state) of