module Parser.ProductRule.Internal where import Data.Set (Set, member) -- | Two provided symbols besides user defined data. data Symbol a = Start -- ^ represents the starting symbol. | Null -- ^ represents the null symbol. | T a -- ^ represents a terminal symbol. | NT a -- ^ represents a non-terminal symbol. | UD a -- ^ represents an undetermined symbol, used internally. deriving (Eq, Show, Ord) type ProductRule t = (Symbol t, [Symbol t]) -- | non-terms -> lhs -> rhs -> product rule rule :: (Ord a) => Symbol a -> [Symbol a] -> ProductRule a rule = (,) -- | non-terms setT :: (Ord a) => Symbol a -> Set a -> Symbol a setT (UD x) nts = if x `member` nts then NT x else T x setT x _ = x