module Hermod.ReCon.Common.Parser (parseIdentifier, parseIntValue, parseNatValue, parseBinRel) where import Hermod.ReCon.Common.Types (BinRel (..), IntValue, NatValue, Parser, VariableIdentifier) import Data.Char (isAlpha, isAlphaNum) import Data.Functor import qualified Data.Text as Text import Text.Megaparsec import Text.Megaparsec.Char (string) import Text.Megaparsec.Char.Lexer (decimal, signed) isSubscriptDigit :: Char -> Bool isSubscriptDigit :: Char -> Bool isSubscriptDigit Char c = Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool >= Char '₀' Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char '₉' parseIdentifier :: Parser VariableIdentifier parseIdentifier :: Parser Text parseIdentifier = String -> Text Text.pack (String -> Text) -> ParsecT Void Text Identity String -> Parser Text forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ((:) (Char -> String -> String) -> ParsecT Void Text Identity Char -> ParsecT Void Text Identity (String -> String) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ParsecT Void Text Identity Char ParsecT Void Text Identity (Token Text) firstChar ParsecT Void Text Identity (String -> String) -> ParsecT Void Text Identity String -> ParsecT Void Text Identity String forall a b. ParsecT Void Text Identity (a -> b) -> ParsecT Void Text Identity a -> ParsecT Void Text Identity b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> ParsecT Void Text Identity Char -> ParsecT Void Text Identity String forall (m :: * -> *) a. MonadPlus m => m a -> m [a] many ParsecT Void Text Identity Char ParsecT Void Text Identity (Token Text) nextChar) Parser Text -> String -> Parser Text forall e s (m :: * -> *) a. MonadParsec e s m => m a -> String -> m a <?> String "identifier" where firstChar :: ParsecT Void Text Identity (Token Text) firstChar = (Token Text -> Bool) -> ParsecT Void Text Identity (Token Text) forall e s (m :: * -> *). MonadParsec e s m => (Token s -> Bool) -> m (Token s) satisfy (\Token Text c -> Char -> Bool isAlpha Char Token Text c Bool -> Bool -> Bool || Char Token Text c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool == Char '_') nextChar :: ParsecT Void Text Identity (Token Text) nextChar = (Token Text -> Bool) -> ParsecT Void Text Identity (Token Text) forall e s (m :: * -> *). MonadParsec e s m => (Token s -> Bool) -> m (Token s) satisfy (\Token Text c -> Char -> Bool isAlphaNum Char Token Text c Bool -> Bool -> Bool || Char Token Text c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool == Char '_' Bool -> Bool -> Bool || Char -> Bool isSubscriptDigit Char Token Text c) parseIntValue :: Parser IntValue parseIntValue :: Parser IntValue parseIntValue = ParsecT Void Text Identity () -> Parser IntValue -> Parser IntValue forall e s (m :: * -> *) a. (MonadParsec e s m, Token s ~ Char, Num a) => m () -> m a -> m a signed (() -> ParsecT Void Text Identity () forall a. a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Applicative f => a -> f a pure ()) Parser IntValue forall e s (m :: * -> *) a. (MonadParsec e s m, Token s ~ Char, Num a) => m a decimal parseNatValue :: Parser NatValue parseNatValue :: Parser NatValue parseNatValue = Parser NatValue forall e s (m :: * -> *) a. (MonadParsec e s m, Token s ~ Char, Num a) => m a decimal parseLt :: Parser () parseLt :: ParsecT Void Text Identity () parseLt = ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall (f :: * -> *) a. Functor f => f a -> f () void (ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity ()) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall a b. (a -> b) -> a -> b $ Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text "<" parseGt :: Parser () parseGt :: ParsecT Void Text Identity () parseGt = ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall (f :: * -> *) a. Functor f => f a -> f () void (ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity ()) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall a b. (a -> b) -> a -> b $ Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text ">" parseEq :: Parser () parseEq :: ParsecT Void Text Identity () parseEq = ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall (f :: * -> *) a. Functor f => f a -> f () void (ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity ()) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall a b. (a -> b) -> a -> b $ Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text "=" parseLte :: Parser () parseLte :: ParsecT Void Text Identity () parseLte = ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall (f :: * -> *) a. Functor f => f a -> f () void (ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity ()) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall a b. (a -> b) -> a -> b $ Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text "≤" ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity (Tokens Text) forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text "<=" parseGte :: Parser () parseGte :: ParsecT Void Text Identity () parseGte = ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall (f :: * -> *) a. Functor f => f a -> f () void (ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity ()) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity () forall a b. (a -> b) -> a -> b $ Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text "≥" ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity (Tokens Text) -> ParsecT Void Text Identity (Tokens Text) forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> Tokens Text -> ParsecT Void Text Identity (Tokens Text) forall e s (m :: * -> *). MonadParsec e s m => Tokens s -> m (Tokens s) string Tokens Text ">=" parseBinRel :: Parser BinRel parseBinRel :: Parser BinRel parseBinRel = BinRel Lte BinRel -> ParsecT Void Text Identity () -> Parser BinRel forall a b. a -> ParsecT Void Text Identity b -> ParsecT Void Text Identity a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ ParsecT Void Text Identity () parseLte Parser BinRel -> Parser BinRel -> Parser BinRel forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> BinRel Gte BinRel -> ParsecT Void Text Identity () -> Parser BinRel forall a b. a -> ParsecT Void Text Identity b -> ParsecT Void Text Identity a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ ParsecT Void Text Identity () parseGte Parser BinRel -> Parser BinRel -> Parser BinRel forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> BinRel Eq BinRel -> ParsecT Void Text Identity () -> Parser BinRel forall a b. a -> ParsecT Void Text Identity b -> ParsecT Void Text Identity a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ ParsecT Void Text Identity () parseEq Parser BinRel -> Parser BinRel -> Parser BinRel forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> BinRel Lt BinRel -> ParsecT Void Text Identity () -> Parser BinRel forall a b. a -> ParsecT Void Text Identity b -> ParsecT Void Text Identity a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ ParsecT Void Text Identity () parseLt Parser BinRel -> Parser BinRel -> Parser BinRel forall a. ParsecT Void Text Identity a -> ParsecT Void Text Identity a -> ParsecT Void Text Identity a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|> BinRel Gt BinRel -> ParsecT Void Text Identity () -> Parser BinRel forall a b. a -> ParsecT Void Text Identity b -> ParsecT Void Text Identity a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ ParsecT Void Text Identity () parseGt