diff options
Diffstat (limited to 'DSL/BaseParsers.hs')
| -rw-r--r-- | DSL/BaseParsers.hs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/DSL/BaseParsers.hs b/DSL/BaseParsers.hs index 403ca42..b4b5234 100644 --- a/DSL/BaseParsers.hs +++ b/DSL/BaseParsers.hs @@ -69,6 +69,13 @@ infixl 3 `alt` alt :: Parser t a -> Parser t a -> Parser t a alt (Parser p) (Parser q) = Parser $ \ inp -> p inp <|> q inp +chain :: Parser s [t] -> Parser t a -> Parser s a +chain p q = do + ts <- p + case parse q ts of + Nothing -> flunk + Just (_, x) -> result x + ----------------------------------------------------------------------------- phrase :: Parser t a -> Parser t a @@ -77,8 +84,14 @@ phrase = (<* eof) recover :: a -> Parser t a -> Parser t a recover x p = p <|> pure x -optional :: Parser t a -> Parser t (Maybe a) -optional = recover Nothing . fmap Just +optionalMaybe :: Parser t a -> Parser t (Maybe a) +optionalMaybe = recover Nothing . fmap Just + +optionalEither :: e -> Parser t a -> Parser t (Either e a) +optionalEither e = recover (Left e) . fmap Right + +optional :: Parser t a -> Parser t () +optional p = () <$ optionalMaybe p assert :: (a -> Bool) -> Parser t a -> Parser t a assert f p = do @@ -108,7 +121,7 @@ atLeast :: Int -> Parser t a -> Parser t [a] atLeast i p = exactly i p <> mult p atMost :: Int -> Parser t a -> Parser t [a] -atMost i = fmap catMaybes . exactly i . optional +atMost i = fmap catMaybes . exactly i . optionalMaybe between :: Int -> Int -> Parser t a -> Parser t [a] between x y p = exactly (min x y) p <> atMost (abs $ x - y) p |
