{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
-- | The free 'Cfg'
module Data.Cfg.FreeCfg (
FreeCfg(..),
toFreeCfg
) where
import Data.Cfg.Cfg(Cfg(..), Vs)
import qualified Data.Set as S
-- | Represents a context-free grammar with its nonterminal and
-- terminal types. The canonical instance of 'Cfg': a record that
-- collects up implementations of each class method.
data FreeCfg t nt = FreeCfg {
nonterminals' :: S.Set nt,
-- ^ the nonterminals of the grammar
terminals' :: S.Set t,
-- ^ the terminals of the grammar
productionRules' :: nt -> S.Set (Vs t nt),
-- ^ the productions of the grammar
startSymbol' :: nt
-- ^ the start symbol of the grammar; must be an element of
-- 'nonterminals' 'cfg'
}
instance Cfg FreeCfg t nt where
nonterminals = nonterminals'
terminals = terminals'
productionRules = productionRules'
startSymbol = startSymbol'
-- | Converts any 'Cfg' into a 'FreeCfg'.
toFreeCfg :: Cfg cfg t nt => cfg t nt -> FreeCfg t nt
toFreeCfg cfg = FreeCfg {
nonterminals' = nonterminals cfg,
terminals' = terminals cfg,
productionRules' = productionRules cfg,
startSymbol' = startSymbol cfg
}