summaryrefslogtreecommitdiff
path: root/DSL/BaseParsers.hs
diff options
context:
space:
mode:
authorMatthew Hall <hallmatthew314@gmail.com>2023-02-17 23:45:26 +1300
committerMatthew Hall <hallmatthew314@gmail.com>2023-02-17 23:45:26 +1300
commitc8e97a9e6ebfefec0db5bc51bd095b3d10dfd078 (patch)
treeb89d2f152e765dc23724a046915d41e0379f0a5d /DSL/BaseParsers.hs
parent342ba2c6d5e738f4ad5eb03a297a561ce43d6b5f (diff)
Lexing and parsing overhaul
Diffstat (limited to 'DSL/BaseParsers.hs')
-rw-r--r--DSL/BaseParsers.hs19
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