diff options
| author | Matthew Hall <hallmatthew314@gmail.com> | 2023-02-17 23:45:26 +1300 |
|---|---|---|
| committer | Matthew Hall <hallmatthew314@gmail.com> | 2023-02-17 23:45:26 +1300 |
| commit | c8e97a9e6ebfefec0db5bc51bd095b3d10dfd078 (patch) | |
| tree | b89d2f152e765dc23724a046915d41e0379f0a5d /DSL/BaseParsers.hs | |
| parent | 342ba2c6d5e738f4ad5eb03a297a561ce43d6b5f (diff) | |
Lexing and parsing overhaul
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 |
