module AG2AspectAG where
import Options
import Data.Char
import Data.List
import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.Maybe
import Pretty
import PPUtil
import UU.Scanner.Position
import AbstractSyntax
import TokenDef
import CommonTypes
import Data.Set(Set)
import Data.Map(Map)
import Patterns (Pattern(..),Patterns)
import Expression (Expression(..))
import Macro --marcos
import CommonTypes
import ErrorMessages
import UU.Scanner.Position(Pos)
import CommonTypes (ConstructorIdent,Identifier)
import UU.Scanner.Position(Pos)
import HsToken
import CommonTypes
import UU.Scanner.Position(Pos)
pragmaAspectAG = pp "{-# LANGUAGE EmptyDataDecls, NoMonomorphismRestriction , TypeSynonymInstances, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}"
ppName l = ppListSep "" "" "_" l
type FieldMap = [(Identifier, Type)]
type DataTypes = Map.Map NontermIdent (Map.Map ConstructorIdent FieldMap)
filterAtts newAtts = filter (\att -> Map.member (identifier att) newAtts)
filterNotAtts newAtts = filter (\att -> not (Map.member (identifier att) newAtts))
defAtt att = "data " >|< attTName att >|< "; " >|< attName att >|< " = proxy :: Proxy " >|< attTName att
attName att = pp $ "att_" ++ att
attTName att = pp $ "Att_" ++ att
defAttRec recPref ppNt atts noGroup =
let recName = ppName [recPref, ppNt]
fields = ppCommas (map (\(a,t) -> ppName [pp a, recName ] >|< " ::" >|< ppShow t) (groupAtts atts noGroup))
in
"data " >|< recName >|< " = " >|< recName >|< " { " >|< fields >|< " }"
groupAtts atts noGroup = (Map.toAscList . Map.difference atts) noGroup
defLocalAtts prodName total actual (l:ls) = ppName [pp l, prodName] >|<
ppListSep "(" ")" "," (replicate (actual1) "_" ++ "x" : replicate (totalactual) "_") >|<
pp " = x" >-<
defLocalAtts prodName total (actual+1) ls
defLocalAtts _ _ _ [] = empty
ntsList att ppNtL = "nts_" ++ att ++ " = " >|< ppListSep "" "" " .*. " ((map fst ppNtL) ++ [pp "hNil"])
filterNts att = filter ( Map.member (identifier att) . snd )
data PPRule = PPRule Identifier Identifier Bool ([(Identifier,Type)] -> [Identifier] -> PP_Doc)
ppRule (field,attr) owrt def = PPRule field attr owrt def
ruleField (PPRule field _ _ _ ) = field
ruleAttr (PPRule _ attr _ _ ) = attr
ruleOwrt (PPRule _ _ owrt _ ) = owrt
ruleDef (PPRule _ _ _ def) = def
defInhGRule ppNt prodName newNT newProd ch rules inhNoGroup synNoGroup chids locals =
let ppAtt = ppName [pp "inh", prodName]
ppR = ppAtt >|< pp " = inhdefM att_inh nts_group $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 (foldr (>-<) (pp "emptyRecord") (map (chGRule ppNt prodName rules inhNoGroup synNoGroup chids locals) chids))
in if (newNT || (not newNT && newProd))
then (ppR, [ ppAtt ])
else (empty, [])
chGRule ppNt prodName rules inhNoGroup synNoGroup chids locals (idCh,tp) =
let chName = ppName [pp "ch", pp idCh, prodName]
ppTp = ppShow tp
chRules = ppCommas $ mapGRuleDefs (== idCh) rules inhNoGroup synNoGroup chids locals
in if (isNonterminal tp)
then chName >|< ".=." >-<
indent 1 "InhG_" >|< ppShow tp >|< pp " {" >-<
indent 2 chRules >-<
indent 1 "} .*. "
else empty
defSynGRule ppNt prod newNT newProd ch rules inhNoGroup synNoGroup chids locals =
let ppAtt = ppName [pp "syn", ppNt, pp prod]
ppTAtt = "SynG_" >|< ppNt
ppR = ppAtt >|< pp " = syndefM att_syn $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 ppTAtt >|< pp " {" >-<
indent 7 (ppCommas $ mapGRuleDefs ((== "lhs") . show) rules inhNoGroup synNoGroup chids locals) >-<
indent 6 "}"
in if (newNT || (not newNT && newProd))
then (ppR, [ ppAtt ])
else (empty, [])
defLocRule ppNt prod newNT newProd ch rules inhNoGroup synNoGroup chids locals =
let ppAtt = ppName [pp "loc", ppNt, pp prod]
ppTAtt = ppName [pp "Loc", ppNt, pp prod]
ppR = ppAtt >|< pp " = locdefM att_loc $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 (ppListSep "(" ")" "," $ mapLRuleDefs rules inhNoGroup synNoGroup chids locals)
in (ppR, [ ppAtt ])
defInstRules ppNt prod newNT newProd ch rules chids locals
= let ppAsp = ppName [pp "inst", ppNt, pp prod]
instRules = filter ((=="inst") . show . ruleField) rules
ppAtt att = ppListSep "`ext` " "" "_" [pp "inst_ch", pp att, ppNt, pp prod]
in ( ppAsp >|< pp " = emptyRule " >|< (map (ppAtt . ruleAttr) instRules) >-<
(vlist $ map (defInstRule ppNt prod ch chids locals) instRules)
, [ ppAsp ])
defInstRule ppNt prod ch chids locals rule =
let ppAtt = ppName [pp "ch", pp (ruleAttr rule), ppNt, pp prod]
in pp "inst_" >|< ppAtt >|< pp " = instdefM " >|< ppAtt >|< pp " $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 ((ruleDef rule) chids locals)
defSynRules ppNt prod newNT newProd newAtts ch rules inhNoGroup synNoGroup chids locals
= let synRules = filter ( (=="lhs") . show . ruleField) rules
ngRules = filter ((flip elem synNoGroup) . getName . ruleAttr) synRules
(ppR, ppRA) = unzip $ map (defSynRule True ppNt prod newNT newProd newAtts ch chids locals) ngRules
in (vlist ppR, concat ppRA )
modSynRules ppNt prod newNT newProd newAtts ch rules inhNoGroup synNoGroup chids locals
= let synRules = filter ( (=="lhs") . show . ruleField) rules
ngRules = filter ((flip elem synNoGroup) . getName . ruleAttr) synRules
(ppR, ppRA) = unzip $ map (defSynRule False ppNt prod newNT newProd newAtts ch chids locals) ngRules
in (vlist ppR, concat ppRA )
defSynRule new ppNt prod newNT newProd newAtts ch chids locals rule =
let att = ruleAttr rule
newAtt = Map.member att newAtts
owrt = ruleOwrt rule
ppAtt = ppName [pp att, pp (if new then "syn" else "synM"), ppNt, pp prod]
ppR def = ppAtt >|< pp (" = " ++ def ++ " ") >|< attName (show att) >|< pp " $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 ((ruleDef rule) chids locals)
in
if new
then if (not owrt && (newNT || (not newNT && newProd) || newAtt))
then (ppR "syndefM", [ ppAtt ])
else (empty, [])
else if owrt
then (ppR "synmodM", [ ppAtt ])
else (empty, [])
defInhRules ppNt prodName newNT newProd newAtts ch rules inhNoGroup synNoGroup chids locals
= let ngRules = filter ((flip elem inhNoGroup) . getName . ruleAttr) rules
(ppR, ppRA) = unzip $ map (defInhRule True ppNt prodName newNT newProd newAtts ch ngRules inhNoGroup synNoGroup chids locals) inhNoGroup
in (vlist ppR, concat ppRA)
modInhRules ppNt prodName newNT newProd newAtts ch rules inhNoGroup synNoGroup chids locals
= let ngRules = filter ((flip elem inhNoGroup) . getName . ruleAttr) rules
(ppR, ppRA) = unzip $ map (defInhRule False ppNt prodName newNT newProd newAtts ch ngRules inhNoGroup synNoGroup chids locals) inhNoGroup
in (vlist ppR, concat ppRA)
defInhRule new ppNt prodName newNT newProd newAtts ch rules inhNoGroup synNoGroup chids locals att =
let ppAtt = ppName [pp att, pp (if new then "inh" else "inhM"),prodName]
newAtt = Map.member (identifier att) newAtts
chRMaybe = map (chRule new ppNt prodName att rules inhNoGroup synNoGroup chids locals) chids
chR = [ x | (Just x) <- chRMaybe ]
ppR def = ppAtt >|< pp (" = " ++ def ++ " ") >|< attName att >|< " nts_" >|< att >|< " $" >-<
indent 4 "do " >-<
indent 5 "loc <- at loc" >-<
indent 5 "lhs <- at lhs" >-<
indent 5 ch >-<
indent 5 "return $" >-<
indent 6 (foldr (>-<) (pp "emptyRecord") chR)
in
if new
then if (newNT || (not newNT && newProd) || newAtt)
then (ppR "inhdefM", [ ppAtt ])
else (empty, [])
else if (not . null) chR
then (ppR "inhmodM", [ ppAtt ])
else (empty, [])
chRule new ppNt prodName att rules inhNoGroup synNoGroup chids locals (idCh,tp) =
let chName = ppName [pp "ch", pp idCh, prodName]
ppTp = ppShow tp
chRule = inhRuleDef new (== idCh) (== att) rules inhNoGroup synNoGroup chids locals
in if (isNonterminal tp && (not . null) chRule)
then Just $ chName >|< ".=. (" >|< chRule >|< ") .*. "
else Nothing
mapLRuleDefs rules inhNoGroup synNoGroup chids locals
= map appSnd $ sortBy cmpField $ filter ((== "loc") . show . ruleField) rules
where cmpField r1 r2 = compare (ruleField r1) (ruleField r2)
appSnd rule = (ruleDef rule) chids locals
mapGRuleDefs filt rules inhNoGroup synNoGroup chids locals
= map appSnd $ sortBy cmpField $ filter (not . (flip elem inhNoGroup) . getName . ruleAttr)
$ filter (not . (flip elem synNoGroup) . getName . ruleAttr)
$ filter ( filt . ruleField) rules
where cmpField r1 r2 = compare (ruleField r1) (ruleField r2)
appSnd rule = (ruleDef rule) chids locals
inhRuleDef new filt1 filt2 rules inhNoGroup synNoGroup chids locals
= map appSnd $ sortBy cmpField $ filter ( (== not new) . ruleOwrt)
$ filter ((flip elem inhNoGroup) . getName . ruleAttr)
$ filter ( filt2 . getName . ruleAttr)
$ filter ( filt1 . ruleField) rules
where cmpField r1 r2 = compare (ruleField r1) (ruleField r2)
appSnd rule = (ruleDef rule) chids locals
defRule ppNt (field,att) noGroup rhs = \chids locals ->
let ppAtt = if (elem (getName att) noGroup)
then empty
else case (show field) of
"lhs" -> att >|< "_" >|< pp "SynG" >|< pp "_" >|< ppNt >|< " = "
"loc" -> empty
"inst" -> empty
otherwise -> att >|< "_" >|< pp "InhG" >|< pp "_" >|<
(maybe (error $ "lhs field " ++ show field ++" is not a child")
ppShow (lookup field chids))
>|< " = "
in ppAtt >|< (rhs noGroup field chids locals)
rhsRule ppNt ppProd tks noGroup field chids locals = vlist . lines2PP . (map (token2PP ppNt ppProd field chids locals noGroup )) $ tks
lines2PP [] = []
lines2PP xs = map line2PP . shiftLeft . getLines $ xs
token2PP ppNt ppProd field chids locals noGroup tk
= case tk of
AGLocal var pos _ -> (pos, if (elem var locals)
then (ppListSep "(" "" "_" [pp var, ppNt, ppProd]) >|< pp " (loc # att_loc)) "
else pp var)
AGField field attr pos _ -> let ppChT = maybe (error $ "rhs field " ++ show field ++ " is not a child") ppShow (lookup field chids)
ppAtt = case (show field) of
"lhs" -> attName "inh"
"loc" -> attName "loc"
otherwise -> attName "syn"
ppSubAtt = case (show field) of
"lhs" -> ppName [pp (getName attr), pp "InhG", ppNt]
"loc" -> ppName [pp (getName attr), ppNt, ppProd]
otherwise -> ppName [pp (getName attr), pp "SynG", ppChT]
in (pos, if (elem (getName attr) noGroup )
then pp "(" >|< pp (getName field) >|< " # " >|< attName (getName attr) >|< pp ")"
else pp "(" >|< ppSubAtt >|< " (" >|< pp (getName field) >|< " # " >|< ppAtt >|< ")) ")
HsToken value pos -> (pos, pp value)
CharToken value pos -> (pos, pp (show value))
StrToken value pos -> (pos, pp (show value))
Err mesg pos -> (pos, pp $ " ***" ++ mesg ++ "*** ")
line2PP ts = let f (p,t) r = let ct = column p
in \c -> pp (spaces (ctc)) >|< t >|< r (length (show t) +ct)
spaces x | x < 0 = ""
| otherwise = replicate x ' '
in foldr f (pp . const "") ts 1
ppMacro (Macro con children) = "( atts_" >|< show con >|< ", " >|< ppListSep "" "" " <.> " ppChildren >|<")"
where ppChildren = map ppChild children
ppChild (RuleChild ch n) = chName ch >|< " ==> " >|< ppMacro n
ppChild (ChildChild ch n) = chName ch >|< " --> " >|< n
ppChild (ValueChild ch n) = chName ch >|< " ~~> " >|< n
chName ch = ppName [pp "ch", pp ch, pp con]
ppNoGroupAtts syn noGroup = let synatts = Map.keys $ Map.filterWithKey (\att _ -> elem (getName att) noGroup) syn
in map (flip (>|<) "_inh") noGroup ++ map (flip (>|<) "_syn") synatts
ruleName att prodName = ppName [att,prodName]
elemNT a b = False
attTypes atts = map (\(a,t) -> "(HCons (LVPair (Proxy Att_" >|< a >|< ") " >|< ppShow t >|< ") ") $ Map.toAscList atts
attVars atts = map (\(a,_) -> "_" >|< a >|< " ") $ Map.toAscList atts
attFields atts noGroup ppNt =
let ng = map (\(a,_) -> attName (getName a) >|< " .=. _" >|< a >|< " .*. ") $ Map.toAscList noGroup
g = ppCommas $ map (\(a,_) -> ppName [pp a, pp "InhG",ppNt] >|< "= _" >|< a) $ Map.toAscList $ Map.difference atts noGroup
in "(" >|< ng >|< "att_inh .=. " >|< ppName [pp "InhG", ppNt] >|< " { " >|< g >|< " } .*. emptyRecord)"
sem_Child :: Child ->
T_Child
sem_Child (Child _name _tp _kind) =
(sem_Child_Child _name _tp _kind)
newtype T_Child = T_Child ((Maybe String) ->
(Map Identifier Attributes) ->
([String]) ->
([String]) ->
Bool ->
PP_Doc ->
PP_Doc ->
(Map Identifier Attributes) ->
([String]) ->
( ([(Identifier,Type)]),([(Identifier,(PP_Doc,PP_Doc))]),([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,Attributes))
data Inh_Child = Inh_Child {ext_Inh_Child :: (Maybe String),inhMap_Inh_Child :: (Map Identifier Attributes),inhNoGroup_Inh_Child :: ([String]),o_noGroup_Inh_Child :: ([String]),o_rename_Inh_Child :: Bool,ppNt_Inh_Child :: PP_Doc,ppProd_Inh_Child :: PP_Doc,synMap_Inh_Child :: (Map Identifier Attributes),synNoGroup_Inh_Child :: ([String])}
data Syn_Child = Syn_Child {idCL_Syn_Child :: ([(Identifier,Type)]),ppCSF_Syn_Child :: ([(Identifier,(PP_Doc,PP_Doc))]),ppDL_Syn_Child :: ([PP_Doc]),ppL_Syn_Child :: PP_Doc,ppLI_Syn_Child :: ([PP_Doc]),ppR_Syn_Child :: PP_Doc,prdInh_Syn_Child :: Attributes}
wrap_Child :: T_Child ->
Inh_Child ->
Syn_Child
wrap_Child (T_Child sem) (Inh_Child _lhsIext _lhsIinhMap _lhsIinhNoGroup _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIppProd _lhsIsynMap _lhsIsynNoGroup) =
(let ( _lhsOidCL,_lhsOppCSF,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOprdInh) = sem _lhsIext _lhsIinhMap _lhsIinhNoGroup _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIppProd _lhsIsynMap _lhsIsynNoGroup
in (Syn_Child _lhsOidCL _lhsOppCSF _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOprdInh))
sem_Child_Child :: Identifier ->
Type ->
ChildKind ->
T_Child
sem_Child_Child name_ tp_ kind_ =
(T_Child (\ _lhsIext
_lhsIinhMap
_lhsIinhNoGroup
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIppProd
_lhsIsynMap
_lhsIsynNoGroup ->
(let _lhsOprdInh :: Attributes
_lhsOppDL :: ([PP_Doc])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOidCL :: ([(Identifier,Type)])
_lhsOppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_lhsOprdInh =
(
_inh
)
_ppCh =
(
pp name_
)
_ppTCh =
(
ppShow tp_
)
_chName =
(
ppName [_ppCh , _lhsIppNt, _lhsIppProd]
)
_lhsOppDL =
(
case kind_ of
ChildSyntax -> [ _chName >|< pp " :: " >|< _ppTCh ]
_ -> []
)
_chLabel =
(
"ch_" >|< _chName
)
_chTLabel =
(
"Ch_" >|< _chName
)
_lhsOppL =
(
"data " >|< _chTLabel >|< "; " >|< _chLabel >|< pp " = proxy :: " >|<
case kind_ of
ChildSyntax -> "Proxy " >|< "(" >|< _chTLabel >|< ", " >|< _ppTCh >|< ")"
_ -> "SemType " >|< _ppTCh >|< pp " nt => Proxy " >|<
"(" >|< _chTLabel >|< ", nt)"
)
_lhsOppLI =
(
[ _chLabel , _chTLabel ]
)
_lhsOppR =
(
let chName = ppListSep "" "" "_" [pp name_, _lhsIppNt, _lhsIppProd]
in pp name_ >|< " <- at ch_" >|< chName
)
_lhsOidCL =
(
[ (name_, removeDeforested tp_ ) ]
)
_lhsOppCSF =
(
let
semC = if (isNonterminal tp_)
then "sem_" >|< ppShow tp_ >|< " _" >|< name_
else "sem_Lit _" >|< name_
in case kind_ of
ChildSyntax -> [(name_, ( _chLabel >|< " .=. (" >|< semC >|< ") .*. "
, _chLabel >|< " .=. _" >|< name_ >|< " .*. "))]
_ -> []
)
_chnt =
(
case tp_ of
NT nt _ _ -> nt
Self -> error ("The type of child " ++ show name_ ++ " should not be a Self type.")
Haskell t -> identifier ""
)
_inh =
(
Map.findWithDefault Map.empty _chnt _lhsIinhMap
)
_syn =
(
Map.findWithDefault Map.empty _chnt _lhsIsynMap
)
___node =
(Syn_Child _lhsOidCL _lhsOppCSF _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOprdInh)
in ( _lhsOidCL,_lhsOppCSF,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOprdInh))))
sem_Children :: Children ->
T_Children
sem_Children list =
(Prelude.foldr sem_Children_Cons sem_Children_Nil (Prelude.map sem_Child list))
newtype T_Children = T_Children ((Maybe String) ->
(Map Identifier Attributes) ->
([String]) ->
([String]) ->
Bool ->
PP_Doc ->
PP_Doc ->
(Map Identifier Attributes) ->
([String]) ->
( ([(Identifier,Type)]),([(Identifier,(PP_Doc,PP_Doc))]),([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,Attributes))
data Inh_Children = Inh_Children {ext_Inh_Children :: (Maybe String),inhMap_Inh_Children :: (Map Identifier Attributes),inhNoGroup_Inh_Children :: ([String]),o_noGroup_Inh_Children :: ([String]),o_rename_Inh_Children :: Bool,ppNt_Inh_Children :: PP_Doc,ppProd_Inh_Children :: PP_Doc,synMap_Inh_Children :: (Map Identifier Attributes),synNoGroup_Inh_Children :: ([String])}
data Syn_Children = Syn_Children {idCL_Syn_Children :: ([(Identifier,Type)]),ppCSF_Syn_Children :: ([(Identifier,(PP_Doc,PP_Doc))]),ppDL_Syn_Children :: ([PP_Doc]),ppL_Syn_Children :: PP_Doc,ppLI_Syn_Children :: ([PP_Doc]),ppR_Syn_Children :: PP_Doc,prdInh_Syn_Children :: Attributes}
wrap_Children :: T_Children ->
Inh_Children ->
Syn_Children
wrap_Children (T_Children sem) (Inh_Children _lhsIext _lhsIinhMap _lhsIinhNoGroup _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIppProd _lhsIsynMap _lhsIsynNoGroup) =
(let ( _lhsOidCL,_lhsOppCSF,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOprdInh) = sem _lhsIext _lhsIinhMap _lhsIinhNoGroup _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIppProd _lhsIsynMap _lhsIsynNoGroup
in (Syn_Children _lhsOidCL _lhsOppCSF _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOprdInh))
sem_Children_Cons :: T_Child ->
T_Children ->
T_Children
sem_Children_Cons (T_Child hd_) (T_Children tl_) =
(T_Children (\ _lhsIext
_lhsIinhMap
_lhsIinhNoGroup
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIppProd
_lhsIsynMap
_lhsIsynNoGroup ->
(let _lhsOppDL :: ([PP_Doc])
_lhsOidCL :: ([(Identifier,Type)])
_lhsOppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOprdInh :: Attributes
_hdOext :: (Maybe String)
_hdOinhMap :: (Map Identifier Attributes)
_hdOinhNoGroup :: ([String])
_hdOo_noGroup :: ([String])
_hdOo_rename :: Bool
_hdOppNt :: PP_Doc
_hdOppProd :: PP_Doc
_hdOsynMap :: (Map Identifier Attributes)
_hdOsynNoGroup :: ([String])
_tlOext :: (Maybe String)
_tlOinhMap :: (Map Identifier Attributes)
_tlOinhNoGroup :: ([String])
_tlOo_noGroup :: ([String])
_tlOo_rename :: Bool
_tlOppNt :: PP_Doc
_tlOppProd :: PP_Doc
_tlOsynMap :: (Map Identifier Attributes)
_tlOsynNoGroup :: ([String])
_hdIidCL :: ([(Identifier,Type)])
_hdIppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_hdIppDL :: ([PP_Doc])
_hdIppL :: PP_Doc
_hdIppLI :: ([PP_Doc])
_hdIppR :: PP_Doc
_hdIprdInh :: Attributes
_tlIidCL :: ([(Identifier,Type)])
_tlIppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_tlIppDL :: ([PP_Doc])
_tlIppL :: PP_Doc
_tlIppLI :: ([PP_Doc])
_tlIppR :: PP_Doc
_tlIprdInh :: Attributes
_lhsOppDL =
(
_hdIppDL ++ _tlIppDL
)
_lhsOidCL =
(
_hdIidCL ++ _tlIidCL
)
_lhsOppCSF =
(
_hdIppCSF ++ _tlIppCSF
)
_lhsOppL =
(
_hdIppL >-< _tlIppL
)
_lhsOppLI =
(
_hdIppLI ++ _tlIppLI
)
_lhsOppR =
(
_hdIppR >-< _tlIppR
)
_lhsOprdInh =
(
_hdIprdInh `Map.union` _tlIprdInh
)
_hdOext =
(
_lhsIext
)
_hdOinhMap =
(
_lhsIinhMap
)
_hdOinhNoGroup =
(
_lhsIinhNoGroup
)
_hdOo_noGroup =
(
_lhsIo_noGroup
)
_hdOo_rename =
(
_lhsIo_rename
)
_hdOppNt =
(
_lhsIppNt
)
_hdOppProd =
(
_lhsIppProd
)
_hdOsynMap =
(
_lhsIsynMap
)
_hdOsynNoGroup =
(
_lhsIsynNoGroup
)
_tlOext =
(
_lhsIext
)
_tlOinhMap =
(
_lhsIinhMap
)
_tlOinhNoGroup =
(
_lhsIinhNoGroup
)
_tlOo_noGroup =
(
_lhsIo_noGroup
)
_tlOo_rename =
(
_lhsIo_rename
)
_tlOppNt =
(
_lhsIppNt
)
_tlOppProd =
(
_lhsIppProd
)
_tlOsynMap =
(
_lhsIsynMap
)
_tlOsynNoGroup =
(
_lhsIsynNoGroup
)
( _hdIidCL,_hdIppCSF,_hdIppDL,_hdIppL,_hdIppLI,_hdIppR,_hdIprdInh) =
hd_ _hdOext _hdOinhMap _hdOinhNoGroup _hdOo_noGroup _hdOo_rename _hdOppNt _hdOppProd _hdOsynMap _hdOsynNoGroup
( _tlIidCL,_tlIppCSF,_tlIppDL,_tlIppL,_tlIppLI,_tlIppR,_tlIprdInh) =
tl_ _tlOext _tlOinhMap _tlOinhNoGroup _tlOo_noGroup _tlOo_rename _tlOppNt _tlOppProd _tlOsynMap _tlOsynNoGroup
___node =
(Syn_Children _lhsOidCL _lhsOppCSF _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOprdInh)
in ( _lhsOidCL,_lhsOppCSF,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOprdInh))))
sem_Children_Nil :: T_Children
sem_Children_Nil =
(T_Children (\ _lhsIext
_lhsIinhMap
_lhsIinhNoGroup
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIppProd
_lhsIsynMap
_lhsIsynNoGroup ->
(let _lhsOppDL :: ([PP_Doc])
_lhsOidCL :: ([(Identifier,Type)])
_lhsOppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOprdInh :: Attributes
_lhsOppDL =
(
[]
)
_lhsOidCL =
(
[]
)
_lhsOppCSF =
(
[]
)
_lhsOppL =
(
empty
)
_lhsOppLI =
(
[]
)
_lhsOppR =
(
empty
)
_lhsOprdInh =
(
Map.empty
)
___node =
(Syn_Children _lhsOidCL _lhsOppCSF _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOprdInh)
in ( _lhsOidCL,_lhsOppCSF,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOprdInh))))
sem_Expression :: Expression ->
T_Expression
sem_Expression (Expression _pos _tks) =
(sem_Expression_Expression _pos _tks)
newtype T_Expression = T_Expression (PP_Doc ->
PP_Doc ->
( ([String] -> Identifier -> [(Identifier,Type)] -> [Identifier] -> PP_Doc)))
data Inh_Expression = Inh_Expression {ppNt_Inh_Expression :: PP_Doc,ppProd_Inh_Expression :: PP_Doc}
data Syn_Expression = Syn_Expression {ppRE_Syn_Expression :: ([String] -> Identifier -> [(Identifier,Type)] -> [Identifier] -> PP_Doc)}
wrap_Expression :: T_Expression ->
Inh_Expression ->
Syn_Expression
wrap_Expression (T_Expression sem) (Inh_Expression _lhsIppNt _lhsIppProd) =
(let ( _lhsOppRE) = sem _lhsIppNt _lhsIppProd
in (Syn_Expression _lhsOppRE))
sem_Expression_Expression :: Pos ->
([HsToken]) ->
T_Expression
sem_Expression_Expression pos_ tks_ =
(T_Expression (\ _lhsIppNt
_lhsIppProd ->
(let _lhsOppRE :: ([String] -> Identifier -> [(Identifier,Type)] -> [Identifier] -> PP_Doc)
_lhsOppRE =
(
rhsRule _lhsIppNt _lhsIppProd tks_
)
___node =
(Syn_Expression _lhsOppRE)
in ( _lhsOppRE))))
sem_Grammar :: Grammar ->
T_Grammar
sem_Grammar (Grammar _typeSyns _useMap _derivings _wrappers _nonts _pragmas _manualAttrOrderMap _paramMap _contextMap _quantMap _uniqueMap _augmentsMap _aroundsMap _mergeMap) =
(sem_Grammar_Grammar _typeSyns _useMap _derivings _wrappers (sem_Nonterminals _nonts) _pragmas _manualAttrOrderMap _paramMap _contextMap _quantMap _uniqueMap _augmentsMap _aroundsMap _mergeMap)
newtype T_Grammar = T_Grammar (((Set NontermIdent, DataTypes, Map NontermIdent (Attributes, Attributes))) ->
(Maybe String) ->
Options ->
( PP_Doc,PP_Doc))
data Inh_Grammar = Inh_Grammar {agi_Inh_Grammar :: ((Set NontermIdent, DataTypes, Map NontermIdent (Attributes, Attributes))),ext_Inh_Grammar :: (Maybe String),options_Inh_Grammar :: Options}
data Syn_Grammar = Syn_Grammar {imp_Syn_Grammar :: PP_Doc,pp_Syn_Grammar :: PP_Doc}
wrap_Grammar :: T_Grammar ->
Inh_Grammar ->
Syn_Grammar
wrap_Grammar (T_Grammar sem) (Inh_Grammar _lhsIagi _lhsIext _lhsIoptions) =
(let ( _lhsOimp,_lhsOpp) = sem _lhsIagi _lhsIext _lhsIoptions
in (Syn_Grammar _lhsOimp _lhsOpp))
sem_Grammar_Grammar :: TypeSyns ->
UseMap ->
Derivings ->
(Set NontermIdent) ->
T_Nonterminals ->
PragmaMap ->
AttrOrderMap ->
ParamMap ->
ContextMap ->
QuantMap ->
UniqueMap ->
(Map NontermIdent (Map ConstructorIdent (Map Identifier [Expression]))) ->
(Map NontermIdent (Map ConstructorIdent (Map Identifier [Expression]))) ->
(Map NontermIdent (Map ConstructorIdent (Map Identifier (Identifier, [Identifier], Expression)))) ->
T_Grammar
sem_Grammar_Grammar typeSyns_ useMap_ derivings_ wrappers_ (T_Nonterminals nonts_) pragmas_ manualAttrOrderMap_ paramMap_ contextMap_ quantMap_ uniqueMap_ augmentsMap_ aroundsMap_ mergeMap_ =
(T_Grammar (\ _lhsIagi
_lhsIext
_lhsIoptions ->
(let _nontsOo_rename :: Bool
_nontsOo_noGroup :: ([String])
_nontsOnewAtts :: ( Attributes )
_nontsOnewProds :: ( DataTypes )
_nontsOnewNTs :: (Set NontermIdent)
_lhsOimp :: PP_Doc
_lhsOpp :: PP_Doc
_nontsOderivs :: Derivings
_nontsOtSyns :: TypeSyns
_nontsOinhMap :: (Map Identifier Attributes)
_nontsOsynMap :: (Map Identifier Attributes)
_nontsOext :: (Maybe String)
_nontsIextendedNTs :: (Set NontermIdent)
_nontsIinhMap' :: (Map Identifier Attributes)
_nontsIppA :: PP_Doc
_nontsIppAI :: ([PP_Doc])
_nontsIppCata :: PP_Doc
_nontsIppD :: PP_Doc
_nontsIppDI :: ([PP_Doc])
_nontsIppL :: PP_Doc
_nontsIppLI :: ([PP_Doc])
_nontsIppNtL :: ([(PP_Doc, Attributes)])
_nontsIppR :: PP_Doc
_nontsIppSF :: PP_Doc
_nontsIppW :: PP_Doc
_nontsIsynMap' :: (Map Identifier Attributes)
_nontsOo_rename =
(
rename _lhsIoptions
)
_o_noGroup =
(
sort $ noGroup _lhsIoptions
)
_nontsOo_noGroup =
(
_o_noGroup
)
_newAtts =
(
case _lhsIagi of
(_,_,atts) -> ( Map.unions . (\(a,b) -> a++b) . unzip . Map.elems) atts
)
_nontsOnewAtts =
(
_newAtts
)
_newProds =
(
case _lhsIagi of
(_,prods,_) -> prods
)
_nontsOnewProds =
(
_newProds
)
_nontsOnewNTs =
(
case _lhsIagi of
(newNTs,_,_) -> Set.difference newNTs _nontsIextendedNTs
)
_lhsOimp =
(
"import Language.Grammars.AspectAG" >-<
"import Language.Grammars.AspectAG.Derive" >-<
"import Data.HList.Label4" >-<
"import Data.HList.TypeEqGeneric1" >-<
"import Data.HList.TypeCastGeneric1" >-<
maybe empty ("import qualified" >#<) _lhsIext >-<
maybe empty (\ext -> "import" >#< ext >#< ppListSep "(" ")" "," (_nontsIppDI ++ _nontsIppLI ++ _ppAI )) _lhsIext
)
_lhsOpp =
(
(if dataTypes _lhsIoptions
then "-- datatypes" >-< _nontsIppD >-<
"-- labels" >-< _nontsIppL
else empty)
>-<
(if folds _lhsIoptions
then "-- attributes" >-< _ppA >-<
"-- rules" >-< _ppR >-<
"-- catas" >-< _nontsIppCata
else empty)
>-<
(if semfuns _lhsIoptions
then "-- semantic functions" >-< _nontsIppSF
else empty)
>-<
(if wrappers _lhsIoptions
then "-- wrappers" >-< _nontsIppW
else empty)
)
_nontsOderivs =
(
derivings_
)
_nontsOtSyns =
(
typeSyns_
)
_ppA =
(
vlist (map defAtt (filterAtts _newAtts _o_noGroup )) >-<
defAtt "loc" >-<
(case _lhsIext of
Nothing -> defAtt "inh" >-< defAtt "syn"
otherwise -> empty) >-<
_nontsIppA
)
_ppAI =
(
let atts = filterNotAtts _newAtts _o_noGroup
in (foldr (\a as -> attName a : as) [] atts) ++
(foldr (\a as -> attTName a : as) [] atts) ++
(case _lhsIext of
Nothing -> []
otherwise -> [ attName "inh", attName "syn", attTName "inh", attTName "syn" ]) ++
_nontsIppAI
)
_ppNtL =
(
_nontsIppNtL
)
_ppR =
(
ntsList "group" _ppNtL >-<
vlist (map (\att -> ntsList att (filterNts att _ppNtL )) (filterAtts _newAtts _o_noGroup )) >-<
_nontsIppR
)
_nontsOinhMap =
(
_nontsIinhMap'
)
_nontsOsynMap =
(
_nontsIsynMap'
)
_nontsOext =
(
_lhsIext
)
( _nontsIextendedNTs,_nontsIinhMap',_nontsIppA,_nontsIppAI,_nontsIppCata,_nontsIppD,_nontsIppDI,_nontsIppL,_nontsIppLI,_nontsIppNtL,_nontsIppR,_nontsIppSF,_nontsIppW,_nontsIsynMap') =
nonts_ _nontsOderivs _nontsOext _nontsOinhMap _nontsOnewAtts _nontsOnewNTs _nontsOnewProds _nontsOo_noGroup _nontsOo_rename _nontsOsynMap _nontsOtSyns
___node =
(Syn_Grammar _lhsOimp _lhsOpp)
in ( _lhsOimp,_lhsOpp))))
sem_HsToken :: HsToken ->
T_HsToken
sem_HsToken (AGField _field _attr _pos _rdesc) =
(sem_HsToken_AGField _field _attr _pos _rdesc)
sem_HsToken (AGLocal _var _pos _rdesc) =
(sem_HsToken_AGLocal _var _pos _rdesc)
sem_HsToken (CharToken _value _pos) =
(sem_HsToken_CharToken _value _pos)
sem_HsToken (Err _mesg _pos) =
(sem_HsToken_Err _mesg _pos)
sem_HsToken (HsToken _value _pos) =
(sem_HsToken_HsToken _value _pos)
sem_HsToken (StrToken _value _pos) =
(sem_HsToken_StrToken _value _pos)
newtype T_HsToken = T_HsToken (( ))
data Inh_HsToken = Inh_HsToken {}
data Syn_HsToken = Syn_HsToken {}
wrap_HsToken :: T_HsToken ->
Inh_HsToken ->
Syn_HsToken
wrap_HsToken (T_HsToken sem) (Inh_HsToken) =
(let ( ) = sem
in (Syn_HsToken))
sem_HsToken_AGField :: Identifier ->
Identifier ->
Pos ->
(Maybe String) ->
T_HsToken
sem_HsToken_AGField field_ attr_ pos_ rdesc_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsToken_AGLocal :: Identifier ->
Pos ->
(Maybe String) ->
T_HsToken
sem_HsToken_AGLocal var_ pos_ rdesc_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsToken_CharToken :: String ->
Pos ->
T_HsToken
sem_HsToken_CharToken value_ pos_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsToken_Err :: String ->
Pos ->
T_HsToken
sem_HsToken_Err mesg_ pos_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsToken_HsToken :: String ->
Pos ->
T_HsToken
sem_HsToken_HsToken value_ pos_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsToken_StrToken :: String ->
Pos ->
T_HsToken
sem_HsToken_StrToken value_ pos_ =
(T_HsToken (let ___node =
(Syn_HsToken)
in ( )))
sem_HsTokens :: HsTokens ->
T_HsTokens
sem_HsTokens list =
(Prelude.foldr sem_HsTokens_Cons sem_HsTokens_Nil (Prelude.map sem_HsToken list))
newtype T_HsTokens = T_HsTokens (( ))
data Inh_HsTokens = Inh_HsTokens {}
data Syn_HsTokens = Syn_HsTokens {}
wrap_HsTokens :: T_HsTokens ->
Inh_HsTokens ->
Syn_HsTokens
wrap_HsTokens (T_HsTokens sem) (Inh_HsTokens) =
(let ( ) = sem
in (Syn_HsTokens))
sem_HsTokens_Cons :: T_HsToken ->
T_HsTokens ->
T_HsTokens
sem_HsTokens_Cons (T_HsToken hd_) (T_HsTokens tl_) =
(T_HsTokens (let ___node =
(Syn_HsTokens)
in ( )))
sem_HsTokens_Nil :: T_HsTokens
sem_HsTokens_Nil =
(T_HsTokens (let ___node =
(Syn_HsTokens)
in ( )))
sem_HsTokensRoot :: HsTokensRoot ->
T_HsTokensRoot
sem_HsTokensRoot (HsTokensRoot _tokens) =
(sem_HsTokensRoot_HsTokensRoot (sem_HsTokens _tokens))
newtype T_HsTokensRoot = T_HsTokensRoot (( ))
data Inh_HsTokensRoot = Inh_HsTokensRoot {}
data Syn_HsTokensRoot = Syn_HsTokensRoot {}
wrap_HsTokensRoot :: T_HsTokensRoot ->
Inh_HsTokensRoot ->
Syn_HsTokensRoot
wrap_HsTokensRoot (T_HsTokensRoot sem) (Inh_HsTokensRoot) =
(let ( ) = sem
in (Syn_HsTokensRoot))
sem_HsTokensRoot_HsTokensRoot :: T_HsTokens ->
T_HsTokensRoot
sem_HsTokensRoot_HsTokensRoot (T_HsTokens tokens_) =
(T_HsTokensRoot (let ___node =
(Syn_HsTokensRoot)
in ( )))
sem_Nonterminal :: Nonterminal ->
T_Nonterminal
sem_Nonterminal (Nonterminal _nt _params _inh _syn _prods) =
(sem_Nonterminal_Nonterminal _nt _params _inh _syn (sem_Productions _prods))
newtype T_Nonterminal = T_Nonterminal (Derivings ->
(Maybe String) ->
(Map Identifier Attributes) ->
( Attributes ) ->
(Set NontermIdent) ->
( DataTypes ) ->
([String]) ->
Bool ->
(Map Identifier Attributes) ->
TypeSyns ->
( (Set NontermIdent),(Map Identifier Attributes),PP_Doc,([PP_Doc]),PP_Doc,PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),([(PP_Doc, Attributes)]),PP_Doc,PP_Doc,PP_Doc,(Map Identifier Attributes)))
data Inh_Nonterminal = Inh_Nonterminal {derivs_Inh_Nonterminal :: Derivings,ext_Inh_Nonterminal :: (Maybe String),inhMap_Inh_Nonterminal :: (Map Identifier Attributes),newAtts_Inh_Nonterminal :: ( Attributes ),newNTs_Inh_Nonterminal :: (Set NontermIdent),newProds_Inh_Nonterminal :: ( DataTypes ),o_noGroup_Inh_Nonterminal :: ([String]),o_rename_Inh_Nonterminal :: Bool,synMap_Inh_Nonterminal :: (Map Identifier Attributes),tSyns_Inh_Nonterminal :: TypeSyns}
data Syn_Nonterminal = Syn_Nonterminal {extendedNTs_Syn_Nonterminal :: (Set NontermIdent),inhMap'_Syn_Nonterminal :: (Map Identifier Attributes),ppA_Syn_Nonterminal :: PP_Doc,ppAI_Syn_Nonterminal :: ([PP_Doc]),ppCata_Syn_Nonterminal :: PP_Doc,ppD_Syn_Nonterminal :: PP_Doc,ppDI_Syn_Nonterminal :: ([PP_Doc]),ppL_Syn_Nonterminal :: PP_Doc,ppLI_Syn_Nonterminal :: ([PP_Doc]),ppNtL_Syn_Nonterminal :: ([(PP_Doc, Attributes)]),ppR_Syn_Nonterminal :: PP_Doc,ppSF_Syn_Nonterminal :: PP_Doc,ppW_Syn_Nonterminal :: PP_Doc,synMap'_Syn_Nonterminal :: (Map Identifier Attributes)}
wrap_Nonterminal :: T_Nonterminal ->
Inh_Nonterminal ->
Syn_Nonterminal
wrap_Nonterminal (T_Nonterminal sem) (Inh_Nonterminal _lhsIderivs _lhsIext _lhsIinhMap _lhsInewAtts _lhsInewNTs _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIsynMap _lhsItSyns) =
(let ( _lhsOextendedNTs,_lhsOinhMap',_lhsOppA,_lhsOppAI,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppNtL,_lhsOppR,_lhsOppSF,_lhsOppW,_lhsOsynMap') = sem _lhsIderivs _lhsIext _lhsIinhMap _lhsInewAtts _lhsInewNTs _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIsynMap _lhsItSyns
in (Syn_Nonterminal _lhsOextendedNTs _lhsOinhMap' _lhsOppA _lhsOppAI _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppNtL _lhsOppR _lhsOppSF _lhsOppW _lhsOsynMap'))
sem_Nonterminal_Nonterminal :: NontermIdent ->
([Identifier]) ->
Attributes ->
Attributes ->
T_Productions ->
T_Nonterminal
sem_Nonterminal_Nonterminal nt_ params_ inh_ syn_ (T_Productions prods_) =
(T_Nonterminal (\ _lhsIderivs
_lhsIext
_lhsIinhMap
_lhsInewAtts
_lhsInewNTs
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIsynMap
_lhsItSyns ->
(let _prodsOinhNoGroup :: ([String])
_prodsOsynNoGroup :: ([String])
_prodsOnewProds :: ( Map.Map ConstructorIdent FieldMap )
_lhsOextendedNTs :: (Set NontermIdent)
_prodsOppNt :: PP_Doc
_lhsOppD :: PP_Doc
_lhsOppDI :: ([PP_Doc])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppA :: PP_Doc
_lhsOppAI :: ([PP_Doc])
_lhsOppNtL :: ([(PP_Doc, Attributes)])
_prodsOnewNT :: Bool
_lhsOppR :: PP_Doc
_lhsOppCata :: PP_Doc
_prodsOsyn :: ( Attributes )
_prodsOinh :: ( Attributes )
_lhsOppSF :: PP_Doc
_lhsOppW :: PP_Doc
_lhsOinhMap' :: (Map Identifier Attributes)
_lhsOsynMap' :: (Map Identifier Attributes)
_prodsOext :: (Maybe String)
_prodsOinhMap :: (Map Identifier Attributes)
_prodsOnewAtts :: ( Attributes )
_prodsOo_noGroup :: ([String])
_prodsOo_rename :: Bool
_prodsOsynMap :: (Map Identifier Attributes)
_prodsIhasMoreProds :: ( Bool )
_prodsIppA :: PP_Doc
_prodsIppCata :: PP_Doc
_prodsIppDL :: ([PP_Doc])
_prodsIppL :: PP_Doc
_prodsIppLI :: ([PP_Doc])
_prodsIppR :: PP_Doc
_prodsIppRA :: ([PP_Doc])
_prodsIppSF :: PP_Doc
_prodsIppSPF :: PP_Doc
_prodsIprdInh :: Attributes
_inhNoGroup =
(
Map.filterWithKey (\att _ -> elem (getName att) _lhsIo_noGroup) _prodsIprdInh
)
_synNoGroup =
(
Map.filterWithKey (\att _ -> elem (getName att) _lhsIo_noGroup) syn_
)
_prodsOinhNoGroup =
(
map show $ Map.keys _inhNoGroup
)
_prodsOsynNoGroup =
(
map show $ Map.keys _synNoGroup
)
_prodsOnewProds =
(
case Map.lookup nt_ _lhsInewProds of
Just prds -> prds
Nothing -> Map.empty
)
_lhsOextendedNTs =
(
if _prodsIhasMoreProds
then Set.singleton nt_
else Set.empty
)
_ppNt =
(
pp nt_
)
_prodsOppNt =
(
_ppNt
)
_lhsOppD =
(
if (Set.member nt_ _lhsInewNTs)
then case (lookup nt_ _lhsItSyns) of
Nothing -> "data " >|< _ppNt
>|< " = " >|< vlist_sep " | " _prodsIppDL >-<
case (Map.lookup nt_ _lhsIderivs) of
Just ntds -> pp " deriving " >|< (ppListSep "(" ")" ", " $ Set.elems ntds)
Nothing -> empty
Just tp -> "type " >|< _ppNt >|< " = " >|< ppShow tp
else empty
)
_lhsOppDI =
(
if (not $ Set.member nt_ _lhsInewNTs)
then [ _ppNt ]
else [ ]
)
_ntLabel =
(
"nt_" >|< _ppNt
)
_lhsOppL =
(
( if (Set.member nt_ _lhsInewNTs)
then _ntLabel >|< " = proxy :: Proxy " >|< _ppNt
else empty) >-<
_prodsIppL
)
_lhsOppLI =
(
( if (not $ Set.member nt_ _lhsInewNTs)
then [ _ntLabel ]
else [ ]) ++
_prodsIppLI
)
_lhsOppA =
(
( if (Set.member nt_ _lhsInewNTs)
then defAttRec (pp "InhG") _ppNt inh_ _inhNoGroup >-<
defAttRec (pp "SynG") _ppNt syn_ _synNoGroup
else empty) >-<
_prodsIppA
)
_lhsOppAI =
(
if (not $ Set.member nt_ _lhsInewNTs)
then [ ppName [(pp "InhG"), _ppNt ] >#< pp "(..)", ppName [(pp "SynG"), _ppNt ] >#< pp "(..)" ]
else [ ]
)
_lhsOppNtL =
(
[ ("nt_" >|< nt_, Map.union inh_ syn_) ]
)
_prodsOnewNT =
(
Set.member nt_ _lhsInewNTs
)
_lhsOppR =
(
pp "----" >|< pp nt_ >-< _prodsIppR
)
_lhsOppCata =
(
"----" >|< _ppNt >-< _prodsIppCata
)
_prodsOsyn =
(
syn_
)
_prodsOinh =
(
inh_
)
_lhsOppSF =
(
let inhAtts = attTypes _inhNoGroup
synAtts = attTypes _synNoGroup
in
"----" >|< _ppNt >-<
"type T_" >|< _ppNt >|< " = " >|<
"(Record " >|<
inhAtts >|<
"(HCons (LVPair (Proxy Att_inh) InhG_" >|< _ppNt >|< ") HNil))" >|<
replicate (length inhAtts) ")" >|< " -> " >|<
"(Record " >|<
synAtts >|<
"(HCons (LVPair (Proxy Att_syn) SynG_" >|< _ppNt >|< ") HNil))" >|<
replicate (length synAtts) ")" >-<
"instance SemType T_" >|< _ppNt >|< " " >|< _ppNt >-<
"-- sem_" >|< _ppNt >|< " :: " >|< _ppNt >|< " -> T_" >|< _ppNt >-<
_prodsIppSPF
)
_lhsOppW =
(
ppName [pp "wrap", _ppNt ] >|< " sem " >|< attVars inh_ >|< " = " >-<
" sem " >|< attFields inh_ _inhNoGroup _ppNt
)
_lhsOinhMap' =
(
Map.singleton nt_ inh_
)
_lhsOsynMap' =
(
Map.singleton nt_ syn_
)
_prodsOext =
(
_lhsIext
)
_prodsOinhMap =
(
_lhsIinhMap
)
_prodsOnewAtts =
(
_lhsInewAtts
)
_prodsOo_noGroup =
(
_lhsIo_noGroup
)
_prodsOo_rename =
(
_lhsIo_rename
)
_prodsOsynMap =
(
_lhsIsynMap
)
( _prodsIhasMoreProds,_prodsIppA,_prodsIppCata,_prodsIppDL,_prodsIppL,_prodsIppLI,_prodsIppR,_prodsIppRA,_prodsIppSF,_prodsIppSPF,_prodsIprdInh) =
prods_ _prodsOext _prodsOinh _prodsOinhMap _prodsOinhNoGroup _prodsOnewAtts _prodsOnewNT _prodsOnewProds _prodsOo_noGroup _prodsOo_rename _prodsOppNt _prodsOsyn _prodsOsynMap _prodsOsynNoGroup
___node =
(Syn_Nonterminal _lhsOextendedNTs _lhsOinhMap' _lhsOppA _lhsOppAI _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppNtL _lhsOppR _lhsOppSF _lhsOppW _lhsOsynMap')
in ( _lhsOextendedNTs,_lhsOinhMap',_lhsOppA,_lhsOppAI,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppNtL,_lhsOppR,_lhsOppSF,_lhsOppW,_lhsOsynMap'))))
sem_Nonterminals :: Nonterminals ->
T_Nonterminals
sem_Nonterminals list =
(Prelude.foldr sem_Nonterminals_Cons sem_Nonterminals_Nil (Prelude.map sem_Nonterminal list))
newtype T_Nonterminals = T_Nonterminals (Derivings ->
(Maybe String) ->
(Map Identifier Attributes) ->
( Attributes ) ->
(Set NontermIdent) ->
( DataTypes ) ->
([String]) ->
Bool ->
(Map Identifier Attributes) ->
TypeSyns ->
( (Set NontermIdent),(Map Identifier Attributes),PP_Doc,([PP_Doc]),PP_Doc,PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),([(PP_Doc, Attributes)]),PP_Doc,PP_Doc,PP_Doc,(Map Identifier Attributes)))
data Inh_Nonterminals = Inh_Nonterminals {derivs_Inh_Nonterminals :: Derivings,ext_Inh_Nonterminals :: (Maybe String),inhMap_Inh_Nonterminals :: (Map Identifier Attributes),newAtts_Inh_Nonterminals :: ( Attributes ),newNTs_Inh_Nonterminals :: (Set NontermIdent),newProds_Inh_Nonterminals :: ( DataTypes ),o_noGroup_Inh_Nonterminals :: ([String]),o_rename_Inh_Nonterminals :: Bool,synMap_Inh_Nonterminals :: (Map Identifier Attributes),tSyns_Inh_Nonterminals :: TypeSyns}
data Syn_Nonterminals = Syn_Nonterminals {extendedNTs_Syn_Nonterminals :: (Set NontermIdent),inhMap'_Syn_Nonterminals :: (Map Identifier Attributes),ppA_Syn_Nonterminals :: PP_Doc,ppAI_Syn_Nonterminals :: ([PP_Doc]),ppCata_Syn_Nonterminals :: PP_Doc,ppD_Syn_Nonterminals :: PP_Doc,ppDI_Syn_Nonterminals :: ([PP_Doc]),ppL_Syn_Nonterminals :: PP_Doc,ppLI_Syn_Nonterminals :: ([PP_Doc]),ppNtL_Syn_Nonterminals :: ([(PP_Doc, Attributes)]),ppR_Syn_Nonterminals :: PP_Doc,ppSF_Syn_Nonterminals :: PP_Doc,ppW_Syn_Nonterminals :: PP_Doc,synMap'_Syn_Nonterminals :: (Map Identifier Attributes)}
wrap_Nonterminals :: T_Nonterminals ->
Inh_Nonterminals ->
Syn_Nonterminals
wrap_Nonterminals (T_Nonterminals sem) (Inh_Nonterminals _lhsIderivs _lhsIext _lhsIinhMap _lhsInewAtts _lhsInewNTs _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIsynMap _lhsItSyns) =
(let ( _lhsOextendedNTs,_lhsOinhMap',_lhsOppA,_lhsOppAI,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppNtL,_lhsOppR,_lhsOppSF,_lhsOppW,_lhsOsynMap') = sem _lhsIderivs _lhsIext _lhsIinhMap _lhsInewAtts _lhsInewNTs _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIsynMap _lhsItSyns
in (Syn_Nonterminals _lhsOextendedNTs _lhsOinhMap' _lhsOppA _lhsOppAI _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppNtL _lhsOppR _lhsOppSF _lhsOppW _lhsOsynMap'))
sem_Nonterminals_Cons :: T_Nonterminal ->
T_Nonterminals ->
T_Nonterminals
sem_Nonterminals_Cons (T_Nonterminal hd_) (T_Nonterminals tl_) =
(T_Nonterminals (\ _lhsIderivs
_lhsIext
_lhsIinhMap
_lhsInewAtts
_lhsInewNTs
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIsynMap
_lhsItSyns ->
(let _lhsOextendedNTs :: (Set NontermIdent)
_lhsOinhMap' :: (Map Identifier Attributes)
_lhsOppA :: PP_Doc
_lhsOppAI :: ([PP_Doc])
_lhsOppCata :: PP_Doc
_lhsOppD :: PP_Doc
_lhsOppDI :: ([PP_Doc])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppNtL :: ([(PP_Doc, Attributes)])
_lhsOppR :: PP_Doc
_lhsOppSF :: PP_Doc
_lhsOppW :: PP_Doc
_lhsOsynMap' :: (Map Identifier Attributes)
_hdOderivs :: Derivings
_hdOext :: (Maybe String)
_hdOinhMap :: (Map Identifier Attributes)
_hdOnewAtts :: ( Attributes )
_hdOnewNTs :: (Set NontermIdent)
_hdOnewProds :: ( DataTypes )
_hdOo_noGroup :: ([String])
_hdOo_rename :: Bool
_hdOsynMap :: (Map Identifier Attributes)
_hdOtSyns :: TypeSyns
_tlOderivs :: Derivings
_tlOext :: (Maybe String)
_tlOinhMap :: (Map Identifier Attributes)
_tlOnewAtts :: ( Attributes )
_tlOnewNTs :: (Set NontermIdent)
_tlOnewProds :: ( DataTypes )
_tlOo_noGroup :: ([String])
_tlOo_rename :: Bool
_tlOsynMap :: (Map Identifier Attributes)
_tlOtSyns :: TypeSyns
_hdIextendedNTs :: (Set NontermIdent)
_hdIinhMap' :: (Map Identifier Attributes)
_hdIppA :: PP_Doc
_hdIppAI :: ([PP_Doc])
_hdIppCata :: PP_Doc
_hdIppD :: PP_Doc
_hdIppDI :: ([PP_Doc])
_hdIppL :: PP_Doc
_hdIppLI :: ([PP_Doc])
_hdIppNtL :: ([(PP_Doc, Attributes)])
_hdIppR :: PP_Doc
_hdIppSF :: PP_Doc
_hdIppW :: PP_Doc
_hdIsynMap' :: (Map Identifier Attributes)
_tlIextendedNTs :: (Set NontermIdent)
_tlIinhMap' :: (Map Identifier Attributes)
_tlIppA :: PP_Doc
_tlIppAI :: ([PP_Doc])
_tlIppCata :: PP_Doc
_tlIppD :: PP_Doc
_tlIppDI :: ([PP_Doc])
_tlIppL :: PP_Doc
_tlIppLI :: ([PP_Doc])
_tlIppNtL :: ([(PP_Doc, Attributes)])
_tlIppR :: PP_Doc
_tlIppSF :: PP_Doc
_tlIppW :: PP_Doc
_tlIsynMap' :: (Map Identifier Attributes)
_lhsOextendedNTs =
(
_hdIextendedNTs `Set.union` _tlIextendedNTs
)
_lhsOinhMap' =
(
_hdIinhMap' `Map.union` _tlIinhMap'
)
_lhsOppA =
(
_hdIppA >-< _tlIppA
)
_lhsOppAI =
(
_hdIppAI ++ _tlIppAI
)
_lhsOppCata =
(
_hdIppCata >-< _tlIppCata
)
_lhsOppD =
(
_hdIppD >-< _tlIppD
)
_lhsOppDI =
(
_hdIppDI ++ _tlIppDI
)
_lhsOppL =
(
_hdIppL >-< _tlIppL
)
_lhsOppLI =
(
_hdIppLI ++ _tlIppLI
)
_lhsOppNtL =
(
_hdIppNtL ++ _tlIppNtL
)
_lhsOppR =
(
_hdIppR >-< _tlIppR
)
_lhsOppSF =
(
_hdIppSF >-< _tlIppSF
)
_lhsOppW =
(
_hdIppW >-< _tlIppW
)
_lhsOsynMap' =
(
_hdIsynMap' `Map.union` _tlIsynMap'
)
_hdOderivs =
(
_lhsIderivs
)
_hdOext =
(
_lhsIext
)
_hdOinhMap =
(
_lhsIinhMap
)
_hdOnewAtts =
(
_lhsInewAtts
)
_hdOnewNTs =
(
_lhsInewNTs
)
_hdOnewProds =
(
_lhsInewProds
)
_hdOo_noGroup =
(
_lhsIo_noGroup
)
_hdOo_rename =
(
_lhsIo_rename
)
_hdOsynMap =
(
_lhsIsynMap
)
_hdOtSyns =
(
_lhsItSyns
)
_tlOderivs =
(
_lhsIderivs
)
_tlOext =
(
_lhsIext
)
_tlOinhMap =
(
_lhsIinhMap
)
_tlOnewAtts =
(
_lhsInewAtts
)
_tlOnewNTs =
(
_lhsInewNTs
)
_tlOnewProds =
(
_lhsInewProds
)
_tlOo_noGroup =
(
_lhsIo_noGroup
)
_tlOo_rename =
(
_lhsIo_rename
)
_tlOsynMap =
(
_lhsIsynMap
)
_tlOtSyns =
(
_lhsItSyns
)
( _hdIextendedNTs,_hdIinhMap',_hdIppA,_hdIppAI,_hdIppCata,_hdIppD,_hdIppDI,_hdIppL,_hdIppLI,_hdIppNtL,_hdIppR,_hdIppSF,_hdIppW,_hdIsynMap') =
hd_ _hdOderivs _hdOext _hdOinhMap _hdOnewAtts _hdOnewNTs _hdOnewProds _hdOo_noGroup _hdOo_rename _hdOsynMap _hdOtSyns
( _tlIextendedNTs,_tlIinhMap',_tlIppA,_tlIppAI,_tlIppCata,_tlIppD,_tlIppDI,_tlIppL,_tlIppLI,_tlIppNtL,_tlIppR,_tlIppSF,_tlIppW,_tlIsynMap') =
tl_ _tlOderivs _tlOext _tlOinhMap _tlOnewAtts _tlOnewNTs _tlOnewProds _tlOo_noGroup _tlOo_rename _tlOsynMap _tlOtSyns
___node =
(Syn_Nonterminals _lhsOextendedNTs _lhsOinhMap' _lhsOppA _lhsOppAI _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppNtL _lhsOppR _lhsOppSF _lhsOppW _lhsOsynMap')
in ( _lhsOextendedNTs,_lhsOinhMap',_lhsOppA,_lhsOppAI,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppNtL,_lhsOppR,_lhsOppSF,_lhsOppW,_lhsOsynMap'))))
sem_Nonterminals_Nil :: T_Nonterminals
sem_Nonterminals_Nil =
(T_Nonterminals (\ _lhsIderivs
_lhsIext
_lhsIinhMap
_lhsInewAtts
_lhsInewNTs
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIsynMap
_lhsItSyns ->
(let _lhsOextendedNTs :: (Set NontermIdent)
_lhsOinhMap' :: (Map Identifier Attributes)
_lhsOppA :: PP_Doc
_lhsOppAI :: ([PP_Doc])
_lhsOppCata :: PP_Doc
_lhsOppD :: PP_Doc
_lhsOppDI :: ([PP_Doc])
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppNtL :: ([(PP_Doc, Attributes)])
_lhsOppR :: PP_Doc
_lhsOppSF :: PP_Doc
_lhsOppW :: PP_Doc
_lhsOsynMap' :: (Map Identifier Attributes)
_lhsOextendedNTs =
(
Set.empty
)
_lhsOinhMap' =
(
Map.empty
)
_lhsOppA =
(
empty
)
_lhsOppAI =
(
[]
)
_lhsOppCata =
(
empty
)
_lhsOppD =
(
empty
)
_lhsOppDI =
(
[]
)
_lhsOppL =
(
empty
)
_lhsOppLI =
(
[]
)
_lhsOppNtL =
(
[]
)
_lhsOppR =
(
empty
)
_lhsOppSF =
(
empty
)
_lhsOppW =
(
empty
)
_lhsOsynMap' =
(
Map.empty
)
___node =
(Syn_Nonterminals _lhsOextendedNTs _lhsOinhMap' _lhsOppA _lhsOppAI _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppNtL _lhsOppR _lhsOppSF _lhsOppW _lhsOsynMap')
in ( _lhsOextendedNTs,_lhsOinhMap',_lhsOppA,_lhsOppAI,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppNtL,_lhsOppR,_lhsOppSF,_lhsOppW,_lhsOsynMap'))))
sem_Pattern :: Pattern ->
T_Pattern
sem_Pattern (Alias _field _attr _pat) =
(sem_Pattern_Alias _field _attr (sem_Pattern _pat))
sem_Pattern (Constr _name _pats) =
(sem_Pattern_Constr _name (sem_Patterns _pats))
sem_Pattern (Irrefutable _pat) =
(sem_Pattern_Irrefutable (sem_Pattern _pat))
sem_Pattern (Product _pos _pats) =
(sem_Pattern_Product _pos (sem_Patterns _pats))
sem_Pattern (Underscore _pos) =
(sem_Pattern_Underscore _pos)
newtype T_Pattern = T_Pattern (( Pattern,((Identifier, Identifier))))
data Inh_Pattern = Inh_Pattern {}
data Syn_Pattern = Syn_Pattern {copy_Syn_Pattern :: Pattern,info_Syn_Pattern :: ((Identifier, Identifier))}
wrap_Pattern :: T_Pattern ->
Inh_Pattern ->
Syn_Pattern
wrap_Pattern (T_Pattern sem) (Inh_Pattern) =
(let ( _lhsOcopy,_lhsOinfo) = sem
in (Syn_Pattern _lhsOcopy _lhsOinfo))
sem_Pattern_Alias :: Identifier ->
Identifier ->
T_Pattern ->
T_Pattern
sem_Pattern_Alias field_ attr_ (T_Pattern pat_) =
(T_Pattern (let _lhsOinfo :: ((Identifier, Identifier))
_lhsOcopy :: Pattern
_patIcopy :: Pattern
_patIinfo :: ((Identifier, Identifier))
_lhsOinfo =
(
(field_, attr_)
)
_copy =
(
Alias field_ attr_ _patIcopy
)
_lhsOcopy =
(
_copy
)
( _patIcopy,_patIinfo) =
pat_
___node =
(Syn_Pattern _lhsOcopy _lhsOinfo)
in ( _lhsOcopy,_lhsOinfo)))
sem_Pattern_Constr :: ConstructorIdent ->
T_Patterns ->
T_Pattern
sem_Pattern_Constr name_ (T_Patterns pats_) =
(T_Pattern (let _lhsOinfo :: ((Identifier, Identifier))
_lhsOcopy :: Pattern
_patsIcopy :: Patterns
_lhsOinfo =
(
error "Pattern Constr undefined!!"
)
_copy =
(
Constr name_ _patsIcopy
)
_lhsOcopy =
(
_copy
)
( _patsIcopy) =
pats_
___node =
(Syn_Pattern _lhsOcopy _lhsOinfo)
in ( _lhsOcopy,_lhsOinfo)))
sem_Pattern_Irrefutable :: T_Pattern ->
T_Pattern
sem_Pattern_Irrefutable (T_Pattern pat_) =
(T_Pattern (let _lhsOcopy :: Pattern
_lhsOinfo :: ((Identifier, Identifier))
_patIcopy :: Pattern
_patIinfo :: ((Identifier, Identifier))
_copy =
(
Irrefutable _patIcopy
)
_lhsOcopy =
(
_copy
)
_lhsOinfo =
(
_patIinfo
)
( _patIcopy,_patIinfo) =
pat_
___node =
(Syn_Pattern _lhsOcopy _lhsOinfo)
in ( _lhsOcopy,_lhsOinfo)))
sem_Pattern_Product :: Pos ->
T_Patterns ->
T_Pattern
sem_Pattern_Product pos_ (T_Patterns pats_) =
(T_Pattern (let _lhsOinfo :: ((Identifier, Identifier))
_lhsOcopy :: Pattern
_patsIcopy :: Patterns
_lhsOinfo =
(
error "Pattern Product undefined!!"
)
_copy =
(
Product pos_ _patsIcopy
)
_lhsOcopy =
(
_copy
)
( _patsIcopy) =
pats_
___node =
(Syn_Pattern _lhsOcopy _lhsOinfo)
in ( _lhsOcopy,_lhsOinfo)))
sem_Pattern_Underscore :: Pos ->
T_Pattern
sem_Pattern_Underscore pos_ =
(T_Pattern (let _lhsOinfo :: ((Identifier, Identifier))
_lhsOcopy :: Pattern
_lhsOinfo =
(
error "Pattern Underscore undefined!!"
)
_copy =
(
Underscore pos_
)
_lhsOcopy =
(
_copy
)
___node =
(Syn_Pattern _lhsOcopy _lhsOinfo)
in ( _lhsOcopy,_lhsOinfo)))
sem_Patterns :: Patterns ->
T_Patterns
sem_Patterns list =
(Prelude.foldr sem_Patterns_Cons sem_Patterns_Nil (Prelude.map sem_Pattern list))
newtype T_Patterns = T_Patterns (( Patterns))
data Inh_Patterns = Inh_Patterns {}
data Syn_Patterns = Syn_Patterns {copy_Syn_Patterns :: Patterns}
wrap_Patterns :: T_Patterns ->
Inh_Patterns ->
Syn_Patterns
wrap_Patterns (T_Patterns sem) (Inh_Patterns) =
(let ( _lhsOcopy) = sem
in (Syn_Patterns _lhsOcopy))
sem_Patterns_Cons :: T_Pattern ->
T_Patterns ->
T_Patterns
sem_Patterns_Cons (T_Pattern hd_) (T_Patterns tl_) =
(T_Patterns (let _lhsOcopy :: Patterns
_hdIcopy :: Pattern
_hdIinfo :: ((Identifier, Identifier))
_tlIcopy :: Patterns
_copy =
(
(:) _hdIcopy _tlIcopy
)
_lhsOcopy =
(
_copy
)
( _hdIcopy,_hdIinfo) =
hd_
( _tlIcopy) =
tl_
___node =
(Syn_Patterns _lhsOcopy)
in ( _lhsOcopy)))
sem_Patterns_Nil :: T_Patterns
sem_Patterns_Nil =
(T_Patterns (let _lhsOcopy :: Patterns
_copy =
(
[]
)
_lhsOcopy =
(
_copy
)
___node =
(Syn_Patterns _lhsOcopy)
in ( _lhsOcopy)))
sem_Production :: Production ->
T_Production
sem_Production (Production _con _params _constraints _children _rules _typeSigs _macro) =
(sem_Production_Production _con _params _constraints (sem_Children _children) (sem_Rules _rules) (sem_TypeSigs _typeSigs) _macro)
newtype T_Production = T_Production ((Maybe String) ->
( Attributes ) ->
(Map Identifier Attributes) ->
([String]) ->
( Attributes ) ->
Bool ->
( Map.Map ConstructorIdent FieldMap ) ->
([String]) ->
Bool ->
PP_Doc ->
( Attributes ) ->
(Map Identifier Attributes) ->
([String]) ->
( ( Bool ),PP_Doc,PP_Doc,PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,PP_Doc,Attributes))
data Inh_Production = Inh_Production {ext_Inh_Production :: (Maybe String),inh_Inh_Production :: ( Attributes ),inhMap_Inh_Production :: (Map Identifier Attributes),inhNoGroup_Inh_Production :: ([String]),newAtts_Inh_Production :: ( Attributes ),newNT_Inh_Production :: Bool,newProds_Inh_Production :: ( Map.Map ConstructorIdent FieldMap ),o_noGroup_Inh_Production :: ([String]),o_rename_Inh_Production :: Bool,ppNt_Inh_Production :: PP_Doc,syn_Inh_Production :: ( Attributes ),synMap_Inh_Production :: (Map Identifier Attributes),synNoGroup_Inh_Production :: ([String])}
data Syn_Production = Syn_Production {hasMoreProds_Syn_Production :: ( Bool ),ppA_Syn_Production :: PP_Doc,ppCata_Syn_Production :: PP_Doc,ppD_Syn_Production :: PP_Doc,ppDI_Syn_Production :: ([PP_Doc]),ppL_Syn_Production :: PP_Doc,ppLI_Syn_Production :: ([PP_Doc]),ppR_Syn_Production :: PP_Doc,ppRA_Syn_Production :: ([PP_Doc]),ppSF_Syn_Production :: PP_Doc,ppSPF_Syn_Production :: PP_Doc,prdInh_Syn_Production :: Attributes}
wrap_Production :: T_Production ->
Inh_Production ->
Syn_Production
wrap_Production (T_Production sem) (Inh_Production _lhsIext _lhsIinh _lhsIinhMap _lhsIinhNoGroup _lhsInewAtts _lhsInewNT _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIsyn _lhsIsynMap _lhsIsynNoGroup) =
(let ( _lhsOhasMoreProds,_lhsOppA,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOppRA,_lhsOppSF,_lhsOppSPF,_lhsOprdInh) = sem _lhsIext _lhsIinh _lhsIinhMap _lhsIinhNoGroup _lhsInewAtts _lhsInewNT _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIsyn _lhsIsynMap _lhsIsynNoGroup
in (Syn_Production _lhsOhasMoreProds _lhsOppA _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppR _lhsOppRA _lhsOppSF _lhsOppSPF _lhsOprdInh))
sem_Production_Production :: ConstructorIdent ->
([Identifier]) ->
([Type]) ->
T_Children ->
T_Rules ->
T_TypeSigs ->
MaybeMacro ->
T_Production
sem_Production_Production con_ params_ constraints_ (T_Children children_) (T_Rules rules_) (T_TypeSigs typeSigs_) macro_ =
(T_Production (\ _lhsIext
_lhsIinh
_lhsIinhMap
_lhsIinhNoGroup
_lhsInewAtts
_lhsInewNT
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIsyn
_lhsIsynMap
_lhsIsynNoGroup ->
(let _lhsOhasMoreProds :: ( Bool )
_childrenOppProd :: PP_Doc
_rulesOppProd :: PP_Doc
_lhsOppD :: PP_Doc
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppA :: PP_Doc
_lhsOppCata :: PP_Doc
_lhsOppSF :: PP_Doc
_lhsOppSPF :: PP_Doc
_lhsOppDI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOppRA :: ([PP_Doc])
_lhsOprdInh :: Attributes
_childrenOext :: (Maybe String)
_childrenOinhMap :: (Map Identifier Attributes)
_childrenOinhNoGroup :: ([String])
_childrenOo_noGroup :: ([String])
_childrenOo_rename :: Bool
_childrenOppNt :: PP_Doc
_childrenOsynMap :: (Map Identifier Attributes)
_childrenOsynNoGroup :: ([String])
_rulesOext :: (Maybe String)
_rulesOinhNoGroup :: ([String])
_rulesOnewProd :: Bool
_rulesOo_noGroup :: ([String])
_rulesOppNt :: PP_Doc
_rulesOsynNoGroup :: ([String])
_childrenIidCL :: ([(Identifier,Type)])
_childrenIppCSF :: ([(Identifier,(PP_Doc,PP_Doc))])
_childrenIppDL :: ([PP_Doc])
_childrenIppL :: PP_Doc
_childrenIppLI :: ([PP_Doc])
_childrenIppR :: PP_Doc
_childrenIprdInh :: Attributes
_rulesIlocals :: ([Identifier])
_rulesIppRL :: ([ PPRule ])
_lhsOhasMoreProds =
(
not $ Map.member con_ _lhsInewProds
)
_ppProd =
(
pp con_
)
_prodName =
(
ppName [_lhsIppNt, _ppProd ]
)
_conName =
(
if _lhsIo_rename
then _prodName
else _ppProd
)
_childrenOppProd =
(
_ppProd
)
_rulesOppProd =
(
_ppProd
)
_lhsOppD =
(
_conName >|< ppListSep " {" "}" ", " _childrenIppDL
)
_lhsOppL =
(
if (Map.member con_ _lhsInewProds)
then _childrenIppL
else empty
)
_lhsOppLI =
(
if (not $ Map.member con_ _lhsInewProds)
then _childrenIppLI
else []
)
_lhsOppA =
(
defLocalAtts _prodName (length _rulesIlocals) 1 $ sort _rulesIlocals
)
_newProd =
(
Map.member con_ _lhsInewProds
)
(_ppR,_ppRA) =
(
let (instR, instRA) = defInstRules _lhsIppNt con_ _lhsInewNT _newProd
_childrenIppR _rulesIppRL _childrenIidCL _rulesIlocals
(locR, locRA) = defLocRule _lhsIppNt con_ _lhsInewNT _newProd
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(inhGR, inhGRA) = defInhGRule _lhsIppNt _prodName _lhsInewNT _newProd
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(synGR, synGRA) = defSynGRule _lhsIppNt con_ _lhsInewNT _newProd
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(inhR, inhRA) = defInhRules _lhsIppNt _prodName _lhsInewNT _newProd _lhsInewAtts
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(synR, synRA) = defSynRules _lhsIppNt con_ _lhsInewNT _newProd _lhsInewAtts
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(inhMR, inhMRA) = modInhRules _lhsIppNt _prodName _lhsInewNT _newProd _lhsInewAtts
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
(synMR, synMRA) = modSynRules _lhsIppNt con_ _lhsInewNT _newProd _lhsInewAtts
_childrenIppR _rulesIppRL _lhsIinhNoGroup _lhsIsynNoGroup _childrenIidCL _rulesIlocals
in ( vlist [instR,locR,inhGR,synGR,inhR,synR,inhMR,synMR]
, instRA ++ locRA ++ inhGRA ++ synGRA ++ inhMRA ++ synMRA ++ inhRA ++ synRA)
)
_lhsOppCata =
(
let extend = maybe []
( \ext -> if (_lhsInewNT || (not _lhsInewNT && _newProd ))
then []
else [ ext >|< ".atts_" >|< _prodName ])
_lhsIext
macro = case macro_ of
Nothing -> []
Just macro -> [ "agMacro " >|< ppMacro macro ]
atts = sortBy (\a b -> compare (show a) (show b)) _ppRA
in "atts_" >|< _prodName >|< " = " >|<
ppListSep "" "" " `ext` "
(atts ++ macro ++ extend ) >-<
"semP_" >|< _prodName >|< pp " = knit atts_" >|< _prodName
)
_lhsOppSF =
(
let chi = _childrenIppCSF
ppPattern = case (show con_) of
"Cons" -> ppParams (ppListSep "" "" " : ")
"Nil" -> pp "[]"
otherwise -> _conName >|< " " >|< (ppParams ppSpaced)
ppParams f = f $ map (((>|<) (pp "_")) . fst) chi
in "sem_" >|< _lhsIppNt >|< " (" >|< ppPattern >|< ") = sem_" >|< _prodName >|<
" (" >|< map (fst . snd) chi >|< "emptyRecord)"
)
_lhsOppSPF =
(
let chi = _childrenIppCSF
ppParams f = f $ map (((>|<) (pp "_")) . fst) chi
in "sem_" >|< _lhsIppNt >|< "_" >|< con_ >#< ppParams ppSpaced >|< " = semP_" >|< _prodName >|<
" (" >|< map (snd . snd) chi >|< "emptyRecord)"
)
_lhsOppDI =
(
[]
)
_lhsOppR =
(
_ppR
)
_lhsOppRA =
(
_ppRA
)
_lhsOprdInh =
(
_childrenIprdInh
)
_childrenOext =
(
_lhsIext
)
_childrenOinhMap =
(
_lhsIinhMap
)
_childrenOinhNoGroup =
(
_lhsIinhNoGroup
)
_childrenOo_noGroup =
(
_lhsIo_noGroup
)
_childrenOo_rename =
(
_lhsIo_rename
)
_childrenOppNt =
(
_lhsIppNt
)
_childrenOsynMap =
(
_lhsIsynMap
)
_childrenOsynNoGroup =
(
_lhsIsynNoGroup
)
_rulesOext =
(
_lhsIext
)
_rulesOinhNoGroup =
(
_lhsIinhNoGroup
)
_rulesOnewProd =
(
_newProd
)
_rulesOo_noGroup =
(
_lhsIo_noGroup
)
_rulesOppNt =
(
_lhsIppNt
)
_rulesOsynNoGroup =
(
_lhsIsynNoGroup
)
( _childrenIidCL,_childrenIppCSF,_childrenIppDL,_childrenIppL,_childrenIppLI,_childrenIppR,_childrenIprdInh) =
children_ _childrenOext _childrenOinhMap _childrenOinhNoGroup _childrenOo_noGroup _childrenOo_rename _childrenOppNt _childrenOppProd _childrenOsynMap _childrenOsynNoGroup
( _rulesIlocals,_rulesIppRL) =
rules_ _rulesOext _rulesOinhNoGroup _rulesOnewProd _rulesOo_noGroup _rulesOppNt _rulesOppProd _rulesOsynNoGroup
___node =
(Syn_Production _lhsOhasMoreProds _lhsOppA _lhsOppCata _lhsOppD _lhsOppDI _lhsOppL _lhsOppLI _lhsOppR _lhsOppRA _lhsOppSF _lhsOppSPF _lhsOprdInh)
in ( _lhsOhasMoreProds,_lhsOppA,_lhsOppCata,_lhsOppD,_lhsOppDI,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOppRA,_lhsOppSF,_lhsOppSPF,_lhsOprdInh))))
sem_Productions :: Productions ->
T_Productions
sem_Productions list =
(Prelude.foldr sem_Productions_Cons sem_Productions_Nil (Prelude.map sem_Production list))
newtype T_Productions = T_Productions ((Maybe String) ->
( Attributes ) ->
(Map Identifier Attributes) ->
([String]) ->
( Attributes ) ->
Bool ->
( Map.Map ConstructorIdent FieldMap ) ->
([String]) ->
Bool ->
PP_Doc ->
( Attributes ) ->
(Map Identifier Attributes) ->
([String]) ->
( ( Bool ),PP_Doc,PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,([PP_Doc]),PP_Doc,PP_Doc,Attributes))
data Inh_Productions = Inh_Productions {ext_Inh_Productions :: (Maybe String),inh_Inh_Productions :: ( Attributes ),inhMap_Inh_Productions :: (Map Identifier Attributes),inhNoGroup_Inh_Productions :: ([String]),newAtts_Inh_Productions :: ( Attributes ),newNT_Inh_Productions :: Bool,newProds_Inh_Productions :: ( Map.Map ConstructorIdent FieldMap ),o_noGroup_Inh_Productions :: ([String]),o_rename_Inh_Productions :: Bool,ppNt_Inh_Productions :: PP_Doc,syn_Inh_Productions :: ( Attributes ),synMap_Inh_Productions :: (Map Identifier Attributes),synNoGroup_Inh_Productions :: ([String])}
data Syn_Productions = Syn_Productions {hasMoreProds_Syn_Productions :: ( Bool ),ppA_Syn_Productions :: PP_Doc,ppCata_Syn_Productions :: PP_Doc,ppDL_Syn_Productions :: ([PP_Doc]),ppL_Syn_Productions :: PP_Doc,ppLI_Syn_Productions :: ([PP_Doc]),ppR_Syn_Productions :: PP_Doc,ppRA_Syn_Productions :: ([PP_Doc]),ppSF_Syn_Productions :: PP_Doc,ppSPF_Syn_Productions :: PP_Doc,prdInh_Syn_Productions :: Attributes}
wrap_Productions :: T_Productions ->
Inh_Productions ->
Syn_Productions
wrap_Productions (T_Productions sem) (Inh_Productions _lhsIext _lhsIinh _lhsIinhMap _lhsIinhNoGroup _lhsInewAtts _lhsInewNT _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIsyn _lhsIsynMap _lhsIsynNoGroup) =
(let ( _lhsOhasMoreProds,_lhsOppA,_lhsOppCata,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOppRA,_lhsOppSF,_lhsOppSPF,_lhsOprdInh) = sem _lhsIext _lhsIinh _lhsIinhMap _lhsIinhNoGroup _lhsInewAtts _lhsInewNT _lhsInewProds _lhsIo_noGroup _lhsIo_rename _lhsIppNt _lhsIsyn _lhsIsynMap _lhsIsynNoGroup
in (Syn_Productions _lhsOhasMoreProds _lhsOppA _lhsOppCata _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOppRA _lhsOppSF _lhsOppSPF _lhsOprdInh))
sem_Productions_Cons :: T_Production ->
T_Productions ->
T_Productions
sem_Productions_Cons (T_Production hd_) (T_Productions tl_) =
(T_Productions (\ _lhsIext
_lhsIinh
_lhsIinhMap
_lhsIinhNoGroup
_lhsInewAtts
_lhsInewNT
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIsyn
_lhsIsynMap
_lhsIsynNoGroup ->
(let _hdOinhNoGroup :: ([String])
_lhsOppDL :: ([PP_Doc])
_lhsOhasMoreProds :: ( Bool )
_lhsOppA :: PP_Doc
_lhsOppCata :: PP_Doc
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOppRA :: ([PP_Doc])
_lhsOppSF :: PP_Doc
_lhsOppSPF :: PP_Doc
_lhsOprdInh :: Attributes
_hdOext :: (Maybe String)
_hdOinh :: ( Attributes )
_hdOinhMap :: (Map Identifier Attributes)
_hdOnewAtts :: ( Attributes )
_hdOnewNT :: Bool
_hdOnewProds :: ( Map.Map ConstructorIdent FieldMap )
_hdOo_noGroup :: ([String])
_hdOo_rename :: Bool
_hdOppNt :: PP_Doc
_hdOsyn :: ( Attributes )
_hdOsynMap :: (Map Identifier Attributes)
_hdOsynNoGroup :: ([String])
_tlOext :: (Maybe String)
_tlOinh :: ( Attributes )
_tlOinhMap :: (Map Identifier Attributes)
_tlOinhNoGroup :: ([String])
_tlOnewAtts :: ( Attributes )
_tlOnewNT :: Bool
_tlOnewProds :: ( Map.Map ConstructorIdent FieldMap )
_tlOo_noGroup :: ([String])
_tlOo_rename :: Bool
_tlOppNt :: PP_Doc
_tlOsyn :: ( Attributes )
_tlOsynMap :: (Map Identifier Attributes)
_tlOsynNoGroup :: ([String])
_hdIhasMoreProds :: ( Bool )
_hdIppA :: PP_Doc
_hdIppCata :: PP_Doc
_hdIppD :: PP_Doc
_hdIppDI :: ([PP_Doc])
_hdIppL :: PP_Doc
_hdIppLI :: ([PP_Doc])
_hdIppR :: PP_Doc
_hdIppRA :: ([PP_Doc])
_hdIppSF :: PP_Doc
_hdIppSPF :: PP_Doc
_hdIprdInh :: Attributes
_tlIhasMoreProds :: ( Bool )
_tlIppA :: PP_Doc
_tlIppCata :: PP_Doc
_tlIppDL :: ([PP_Doc])
_tlIppL :: PP_Doc
_tlIppLI :: ([PP_Doc])
_tlIppR :: PP_Doc
_tlIppRA :: ([PP_Doc])
_tlIppSF :: PP_Doc
_tlIppSPF :: PP_Doc
_tlIprdInh :: Attributes
_hdOinhNoGroup =
(
filter (flip Map.member _hdIprdInh . identifier) _lhsIinhNoGroup
)
_lhsOppDL =
(
_hdIppD : _tlIppDL
)
_lhsOhasMoreProds =
(
_hdIhasMoreProds || _tlIhasMoreProds
)
_lhsOppA =
(
_hdIppA >-< _tlIppA
)
_lhsOppCata =
(
_hdIppCata >-< _tlIppCata
)
_lhsOppL =
(
_hdIppL >-< _tlIppL
)
_lhsOppLI =
(
_hdIppLI ++ _tlIppLI
)
_lhsOppR =
(
_hdIppR >-< _tlIppR
)
_lhsOppRA =
(
_hdIppRA ++ _tlIppRA
)
_lhsOppSF =
(
_hdIppSF >-< _tlIppSF
)
_lhsOppSPF =
(
_hdIppSPF >-< _tlIppSPF
)
_lhsOprdInh =
(
_hdIprdInh `Map.union` _tlIprdInh
)
_hdOext =
(
_lhsIext
)
_hdOinh =
(
_lhsIinh
)
_hdOinhMap =
(
_lhsIinhMap
)
_hdOnewAtts =
(
_lhsInewAtts
)
_hdOnewNT =
(
_lhsInewNT
)
_hdOnewProds =
(
_lhsInewProds
)
_hdOo_noGroup =
(
_lhsIo_noGroup
)
_hdOo_rename =
(
_lhsIo_rename
)
_hdOppNt =
(
_lhsIppNt
)
_hdOsyn =
(
_lhsIsyn
)
_hdOsynMap =
(
_lhsIsynMap
)
_hdOsynNoGroup =
(
_lhsIsynNoGroup
)
_tlOext =
(
_lhsIext
)
_tlOinh =
(
_lhsIinh
)
_tlOinhMap =
(
_lhsIinhMap
)
_tlOinhNoGroup =
(
_lhsIinhNoGroup
)
_tlOnewAtts =
(
_lhsInewAtts
)
_tlOnewNT =
(
_lhsInewNT
)
_tlOnewProds =
(
_lhsInewProds
)
_tlOo_noGroup =
(
_lhsIo_noGroup
)
_tlOo_rename =
(
_lhsIo_rename
)
_tlOppNt =
(
_lhsIppNt
)
_tlOsyn =
(
_lhsIsyn
)
_tlOsynMap =
(
_lhsIsynMap
)
_tlOsynNoGroup =
(
_lhsIsynNoGroup
)
( _hdIhasMoreProds,_hdIppA,_hdIppCata,_hdIppD,_hdIppDI,_hdIppL,_hdIppLI,_hdIppR,_hdIppRA,_hdIppSF,_hdIppSPF,_hdIprdInh) =
hd_ _hdOext _hdOinh _hdOinhMap _hdOinhNoGroup _hdOnewAtts _hdOnewNT _hdOnewProds _hdOo_noGroup _hdOo_rename _hdOppNt _hdOsyn _hdOsynMap _hdOsynNoGroup
( _tlIhasMoreProds,_tlIppA,_tlIppCata,_tlIppDL,_tlIppL,_tlIppLI,_tlIppR,_tlIppRA,_tlIppSF,_tlIppSPF,_tlIprdInh) =
tl_ _tlOext _tlOinh _tlOinhMap _tlOinhNoGroup _tlOnewAtts _tlOnewNT _tlOnewProds _tlOo_noGroup _tlOo_rename _tlOppNt _tlOsyn _tlOsynMap _tlOsynNoGroup
___node =
(Syn_Productions _lhsOhasMoreProds _lhsOppA _lhsOppCata _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOppRA _lhsOppSF _lhsOppSPF _lhsOprdInh)
in ( _lhsOhasMoreProds,_lhsOppA,_lhsOppCata,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOppRA,_lhsOppSF,_lhsOppSPF,_lhsOprdInh))))
sem_Productions_Nil :: T_Productions
sem_Productions_Nil =
(T_Productions (\ _lhsIext
_lhsIinh
_lhsIinhMap
_lhsIinhNoGroup
_lhsInewAtts
_lhsInewNT
_lhsInewProds
_lhsIo_noGroup
_lhsIo_rename
_lhsIppNt
_lhsIsyn
_lhsIsynMap
_lhsIsynNoGroup ->
(let _lhsOppDL :: ([PP_Doc])
_lhsOhasMoreProds :: ( Bool )
_lhsOppA :: PP_Doc
_lhsOppCata :: PP_Doc
_lhsOppL :: PP_Doc
_lhsOppLI :: ([PP_Doc])
_lhsOppR :: PP_Doc
_lhsOppRA :: ([PP_Doc])
_lhsOppSF :: PP_Doc
_lhsOppSPF :: PP_Doc
_lhsOprdInh :: Attributes
_lhsOppDL =
(
[]
)
_lhsOhasMoreProds =
(
False
)
_lhsOppA =
(
empty
)
_lhsOppCata =
(
empty
)
_lhsOppL =
(
empty
)
_lhsOppLI =
(
[]
)
_lhsOppR =
(
empty
)
_lhsOppRA =
(
[]
)
_lhsOppSF =
(
empty
)
_lhsOppSPF =
(
empty
)
_lhsOprdInh =
(
Map.empty
)
___node =
(Syn_Productions _lhsOhasMoreProds _lhsOppA _lhsOppCata _lhsOppDL _lhsOppL _lhsOppLI _lhsOppR _lhsOppRA _lhsOppSF _lhsOppSPF _lhsOprdInh)
in ( _lhsOhasMoreProds,_lhsOppA,_lhsOppCata,_lhsOppDL,_lhsOppL,_lhsOppLI,_lhsOppR,_lhsOppRA,_lhsOppSF,_lhsOppSPF,_lhsOprdInh))))
sem_Rule :: Rule ->
T_Rule
sem_Rule (Rule _mbName _pattern _rhs _owrt _origin _explicit _pure _identity _mbError _eager) =
(sem_Rule_Rule _mbName (sem_Pattern _pattern) (sem_Expression _rhs) _owrt _origin _explicit _pure _identity _mbError _eager)
newtype T_Rule = T_Rule ((Maybe String) ->
([String]) ->
Bool ->
([String]) ->
PP_Doc ->
PP_Doc ->
([String]) ->
( ([Identifier]),([ PPRule ])))
data Inh_Rule = Inh_Rule {ext_Inh_Rule :: (Maybe String),inhNoGroup_Inh_Rule :: ([String]),newProd_Inh_Rule :: Bool,o_noGroup_Inh_Rule :: ([String]),ppNt_Inh_Rule :: PP_Doc,ppProd_Inh_Rule :: PP_Doc,synNoGroup_Inh_Rule :: ([String])}
data Syn_Rule = Syn_Rule {locals_Syn_Rule :: ([Identifier]),ppRL_Syn_Rule :: ([ PPRule ])}
wrap_Rule :: T_Rule ->
Inh_Rule ->
Syn_Rule
wrap_Rule (T_Rule sem) (Inh_Rule _lhsIext _lhsIinhNoGroup _lhsInewProd _lhsIo_noGroup _lhsIppNt _lhsIppProd _lhsIsynNoGroup) =
(let ( _lhsOlocals,_lhsOppRL) = sem _lhsIext _lhsIinhNoGroup _lhsInewProd _lhsIo_noGroup _lhsIppNt _lhsIppProd _lhsIsynNoGroup
in (Syn_Rule _lhsOlocals _lhsOppRL))
sem_Rule_Rule :: (Maybe Identifier) ->
T_Pattern ->
T_Expression ->
Bool ->
String ->
Bool ->
Bool ->
Bool ->
(Maybe Error) ->
Bool ->
T_Rule
sem_Rule_Rule mbName_ (T_Pattern pattern_) (T_Expression rhs_) owrt_ origin_ explicit_ pure_ identity_ mbError_ eager_ =
(T_Rule (\ _lhsIext
_lhsIinhNoGroup
_lhsInewProd
_lhsIo_noGroup
_lhsIppNt
_lhsIppProd
_lhsIsynNoGroup ->
(let _lhsOlocals :: ([Identifier])
_lhsOppRL :: ([ PPRule ])
_rhsOppNt :: PP_Doc
_rhsOppProd :: PP_Doc
_patternIcopy :: Pattern
_patternIinfo :: ((Identifier, Identifier))
_rhsIppRE :: ([String] -> Identifier -> [(Identifier,Type)] -> [Identifier] -> PP_Doc)
_lhsOlocals =
(
if (show (fst _patternIinfo) == "loc")
then [ snd _patternIinfo ]
else [ ]
)
_lhsOppRL =
(
if (not explicit_ && not _lhsInewProd)
then []
else [ ppRule _patternIinfo owrt_ (defRule _lhsIppNt _patternIinfo _lhsIo_noGroup _rhsIppRE) ]
)
_rhsOppNt =
(
_lhsIppNt
)
_rhsOppProd =
(
_lhsIppProd
)
( _patternIcopy,_patternIinfo) =
pattern_
( _rhsIppRE) =
rhs_ _rhsOppNt _rhsOppProd
___node =
(Syn_Rule _lhsOlocals _lhsOppRL)
in ( _lhsOlocals,_lhsOppRL))))
sem_Rules :: Rules ->
T_Rules
sem_Rules list =
(Prelude.foldr sem_Rules_Cons sem_Rules_Nil (Prelude.map sem_Rule list))
newtype T_Rules = T_Rules ((Maybe String) ->
([String]) ->
Bool ->
([String]) ->
PP_Doc ->
PP_Doc ->
([String]) ->
( ([Identifier]),([ PPRule ])))
data Inh_Rules = Inh_Rules {ext_Inh_Rules :: (Maybe String),inhNoGroup_Inh_Rules :: ([String]),newProd_Inh_Rules :: Bool,o_noGroup_Inh_Rules :: ([String]),ppNt_Inh_Rules :: PP_Doc,ppProd_Inh_Rules :: PP_Doc,synNoGroup_Inh_Rules :: ([String])}
data Syn_Rules = Syn_Rules {locals_Syn_Rules :: ([Identifier]),ppRL_Syn_Rules :: ([ PPRule ])}
wrap_Rules :: T_Rules ->
Inh_Rules ->
Syn_Rules
wrap_Rules (T_Rules sem) (Inh_Rules _lhsIext _lhsIinhNoGroup _lhsInewProd _lhsIo_noGroup _lhsIppNt _lhsIppProd _lhsIsynNoGroup) =
(let ( _lhsOlocals,_lhsOppRL) = sem _lhsIext _lhsIinhNoGroup _lhsInewProd _lhsIo_noGroup _lhsIppNt _lhsIppProd _lhsIsynNoGroup
in (Syn_Rules _lhsOlocals _lhsOppRL))
sem_Rules_Cons :: T_Rule ->
T_Rules ->
T_Rules
sem_Rules_Cons (T_Rule hd_) (T_Rules tl_) =
(T_Rules (\ _lhsIext
_lhsIinhNoGroup
_lhsInewProd
_lhsIo_noGroup
_lhsIppNt
_lhsIppProd
_lhsIsynNoGroup ->
(let _lhsOppRL :: ([ PPRule ])
_lhsOlocals :: ([Identifier])
_hdOext :: (Maybe String)
_hdOinhNoGroup :: ([String])
_hdOnewProd :: Bool
_hdOo_noGroup :: ([String])
_hdOppNt :: PP_Doc
_hdOppProd :: PP_Doc
_hdOsynNoGroup :: ([String])
_tlOext :: (Maybe String)
_tlOinhNoGroup :: ([String])
_tlOnewProd :: Bool
_tlOo_noGroup :: ([String])
_tlOppNt :: PP_Doc
_tlOppProd :: PP_Doc
_tlOsynNoGroup :: ([String])
_hdIlocals :: ([Identifier])
_hdIppRL :: ([ PPRule ])
_tlIlocals :: ([Identifier])
_tlIppRL :: ([ PPRule ])
_lhsOppRL =
(
_hdIppRL ++ _tlIppRL
)
_lhsOlocals =
(
_hdIlocals ++ _tlIlocals
)
_hdOext =
(
_lhsIext
)
_hdOinhNoGroup =
(
_lhsIinhNoGroup
)
_hdOnewProd =
(
_lhsInewProd
)
_hdOo_noGroup =
(
_lhsIo_noGroup
)
_hdOppNt =
(
_lhsIppNt
)
_hdOppProd =
(
_lhsIppProd
)
_hdOsynNoGroup =
(
_lhsIsynNoGroup
)
_tlOext =
(
_lhsIext
)
_tlOinhNoGroup =
(
_lhsIinhNoGroup
)
_tlOnewProd =
(
_lhsInewProd
)
_tlOo_noGroup =
(
_lhsIo_noGroup
)
_tlOppNt =
(
_lhsIppNt
)
_tlOppProd =
(
_lhsIppProd
)
_tlOsynNoGroup =
(
_lhsIsynNoGroup
)
( _hdIlocals,_hdIppRL) =
hd_ _hdOext _hdOinhNoGroup _hdOnewProd _hdOo_noGroup _hdOppNt _hdOppProd _hdOsynNoGroup
( _tlIlocals,_tlIppRL) =
tl_ _tlOext _tlOinhNoGroup _tlOnewProd _tlOo_noGroup _tlOppNt _tlOppProd _tlOsynNoGroup
___node =
(Syn_Rules _lhsOlocals _lhsOppRL)
in ( _lhsOlocals,_lhsOppRL))))
sem_Rules_Nil :: T_Rules
sem_Rules_Nil =
(T_Rules (\ _lhsIext
_lhsIinhNoGroup
_lhsInewProd
_lhsIo_noGroup
_lhsIppNt
_lhsIppProd
_lhsIsynNoGroup ->
(let _lhsOppRL :: ([ PPRule ])
_lhsOlocals :: ([Identifier])
_lhsOppRL =
(
[]
)
_lhsOlocals =
(
[]
)
___node =
(Syn_Rules _lhsOlocals _lhsOppRL)
in ( _lhsOlocals,_lhsOppRL))))
sem_TypeSig :: TypeSig ->
T_TypeSig
sem_TypeSig (TypeSig _name _tp) =
(sem_TypeSig_TypeSig _name _tp)
newtype T_TypeSig = T_TypeSig (( ))
data Inh_TypeSig = Inh_TypeSig {}
data Syn_TypeSig = Syn_TypeSig {}
wrap_TypeSig :: T_TypeSig ->
Inh_TypeSig ->
Syn_TypeSig
wrap_TypeSig (T_TypeSig sem) (Inh_TypeSig) =
(let ( ) = sem
in (Syn_TypeSig))
sem_TypeSig_TypeSig :: Identifier ->
Type ->
T_TypeSig
sem_TypeSig_TypeSig name_ tp_ =
(T_TypeSig (let ___node =
(Syn_TypeSig)
in ( )))
sem_TypeSigs :: TypeSigs ->
T_TypeSigs
sem_TypeSigs list =
(Prelude.foldr sem_TypeSigs_Cons sem_TypeSigs_Nil (Prelude.map sem_TypeSig list))
newtype T_TypeSigs = T_TypeSigs (( ))
data Inh_TypeSigs = Inh_TypeSigs {}
data Syn_TypeSigs = Syn_TypeSigs {}
wrap_TypeSigs :: T_TypeSigs ->
Inh_TypeSigs ->
Syn_TypeSigs
wrap_TypeSigs (T_TypeSigs sem) (Inh_TypeSigs) =
(let ( ) = sem
in (Syn_TypeSigs))
sem_TypeSigs_Cons :: T_TypeSig ->
T_TypeSigs ->
T_TypeSigs
sem_TypeSigs_Cons (T_TypeSig hd_) (T_TypeSigs tl_) =
(T_TypeSigs (let ___node =
(Syn_TypeSigs)
in ( )))
sem_TypeSigs_Nil :: T_TypeSigs
sem_TypeSigs_Nil =
(T_TypeSigs (let ___node =
(Syn_TypeSigs)
in ( )))