From a6fdf546c3dd1ab248a93dc217c610e3216dceb3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Oct 2019 18:13:10 +0000 Subject: [PATCH] Add regex representations --- src/Rextra/Regex.hs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/Rextra/Regex.hs diff --git a/src/Rextra/Regex.hs b/src/Rextra/Regex.hs new file mode 100644 index 0000000..c8ab4e7 --- /dev/null +++ b/src/Rextra/Regex.hs @@ -0,0 +1,32 @@ +module Rextra.Regex where + +import Data.List + +data XRegex t + = XRToken t + | XRConcat [XRegex t] + | XRUnion [XRegex t] + | XRStar (XRegex t) + | XRPlus (XRegex t) + | XROptional (XRegex t) + deriving (Show) + +data Regex t + = REpsilon + | RToken t + | RConcat (Regex t) (Regex t) + | RUnion (Regex t) (Regex t) + | RStar (Regex t) + deriving (Show) + +toRegex :: XRegex t -> Maybe (Regex t) +toRegex (XRToken t) = Just $ RToken t +--toRegex (XRConcat [r]) = toRegex r -- Optimisation, not strictly necessary +toRegex (XRConcat rs) = foldl' RConcat REpsilon <$> traverse toRegex rs +toRegex (XRUnion []) = Nothing +--toRegex (XRUnion [r]) = toRegex r -- Optimisation, not strictly necessary +toRegex (XRUnion (r:rs)) = foldl' RUnion <$> toRegex r <*> traverse toRegex rs +toRegex (XRStar r) = RStar <$> toRegex r +toRegex (XRPlus r) = let rr = toRegex r + in RConcat <$> rr <*> (RStar <$> rr) +toRegex (XROptional r) = RUnion REpsilon <$> toRegex r