module ParseGlue where import Encoding import Data.List data ParseResult a = OkP a | FailP String type P a = String -> Int -> ParseResult a instance Show a => Show (ParseResult a) where show (OkP r) = show r show (FailP s) = s thenP :: P a -> (a -> P b) -> P b m `thenP` k = \ s l -> case m s l of OkP a -> k a s l FailP s -> FailP s returnP :: a -> P a returnP m _ _ = OkP m failP :: String -> P a failP s s' _ = FailP (s ++ ":" ++ s') data Token = TKmodule | TKdata | TKnewtype | TKforall | TKrec | TKlet | TKin | TKcase | TKof | TKcast | TKnote | TKexternal | TKwild | TKoparen | TKcparen | TKobrace | TKcbrace | TKhash | TKeq | TKcoloncolon | TKstar | TKrarrow | TKlambda | TKbiglambda | TKat | TKdot | TKcolon | TKquestion | TKsemicolon | TKname String | TKcname String | TKinteger Integer | TKrational Rational | TKstring String | TKchar Char | TKEOF -- ugh splitModuleName mn = let decoded = zDecodeString mn parts = filter (notElem '.') $ groupBy (\ c1 c2 -> c1 /= '.' && c2 /= '.') decoded in (take (length parts - 1) parts, last parts)