packages feed

GrammarProducts-0.0.0.2: FormalLanguage/GrammarProduct/Op/Power.hs

module FormalLanguage.GrammarProduct.Op.Power where

import Control.Newtype
import Data.Semigroup
import Control.Lens
import Control.Lens.Fold
import qualified Data.Set as S
import Data.List (genericReplicate)
import Text.Printf

import FormalLanguage.CFG.Grammar



-- |

power :: Grammar -> Integer -> Grammar
power g k = Grammar ts ns es rs s nm where
  ts = g^.tsyms
  ns = S.map go $ g^.nsyms
  es = g^.epsis
  rs = S.map (\(Rule l f rs) -> Rule (go l) (f++f) (map go rs)) $ g^.rules
  s  = fmap go $ g^.start
  nm = concat . genericReplicate k $ g^.name
  go (Symb z) = Symb . concat $ genericReplicate k z