From c8e97a9e6ebfefec0db5bc51bd095b3d10dfd078 Mon Sep 17 00:00:00 2001 From: Matthew Hall Date: Fri, 17 Feb 2023 23:45:26 +1300 Subject: Lexing and parsing overhaul --- DSL/BaseParsers.hs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'DSL/BaseParsers.hs') 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 -- cgit v1.2.1