packages feed

ewe-0.1.0.31: src/Language/EWE/CheckGrammar.hs


-- UUAGC 0.9.50 (src-ag/Language/EWE/CheckGrammar.ag)
module Language.EWE.CheckGrammar where
{-# LINE 2 "./src-ag/Language/EWE/CheckGrammar.ag" #-}

import qualified Data.Set as Set
import qualified Data.Map as Map
import Language.EWE.AbsSyn
import Language.EWE.Utils
{-# LINE 12 "src/Language/EWE/CheckGrammar.hs" #-}
{-# LINE 109 "./src-ag/Language/EWE/CheckGrammar.ag" #-}

isLabelDef :: String -> Set.Set String ->  Either String ()
isLabelDef str sets
    | str `Set.member` sets = Right ()
    | otherwise             = Left $ "Label: " ++ str ++ " is not defined "

isLabelNotDef :: String -> Set.Set String ->  Either String ()
isLabelNotDef str sets
    | str `Set.member` sets =  Left $ "Label: " ++ str ++ " is already defined "
    | otherwise             = Right ()

isMemRefDef :: String -> Map.Map String Int -> Either String ()
isMemRefDef str map
    | str `Map.member` map = Right ()
    | otherwise            = Left $ "Mem Ref: " ++ str ++ " is not defined"
{-# LINE 29 "src/Language/EWE/CheckGrammar.hs" #-}
-- Cond --------------------------------------------------------
{-
   alternatives:
      alternative CLET:
      alternative CLT:
      alternative CGET:
      alternative CGT:
      alternative CE:
      alternative CNE:
-}
-- cata
sem_Cond :: Cond ->
            T_Cond
sem_Cond (CLET) =
    (sem_Cond_CLET)
sem_Cond (CLT) =
    (sem_Cond_CLT)
sem_Cond (CGET) =
    (sem_Cond_CGET)
sem_Cond (CGT) =
    (sem_Cond_CGT)
sem_Cond (CE) =
    (sem_Cond_CE)
sem_Cond (CNE) =
    (sem_Cond_CNE)
-- semantic domain
type T_Cond = ( )
data Inh_Cond = Inh_Cond {}
data Syn_Cond = Syn_Cond {}
wrap_Cond :: T_Cond ->
             Inh_Cond ->
             Syn_Cond
wrap_Cond sem (Inh_Cond) =
    (let ( ) = sem
     in  (Syn_Cond))
sem_Cond_CLET :: T_Cond
sem_Cond_CLET =
    (let
     in  ( ))
sem_Cond_CLT :: T_Cond
sem_Cond_CLT =
    (let
     in  ( ))
sem_Cond_CGET :: T_Cond
sem_Cond_CGET =
    (let
     in  ( ))
sem_Cond_CGT :: T_Cond
sem_Cond_CGT =
    (let
     in  ( ))
sem_Cond_CE :: T_Cond
sem_Cond_CE =
    (let
     in  ( ))
sem_Cond_CNE :: T_Cond
sem_Cond_CNE =
    (let
     in  ( ))
-- Equ ---------------------------------------------------------
{-
   visit 0:
      chained attribute:
         idMemRef             : Map.Map String Int
      synthesized attribute:
         res                  : Either String ()
   alternatives:
      alternative Tuple:
         child x1             : {String}
         child x2             : {Int}
-}
-- cata
sem_Equ :: Equ ->
           T_Equ
sem_Equ ( x1,x2) =
    (sem_Equ_Tuple x1 x2)
-- semantic domain
type T_Equ = (Map.Map String Int) ->
             ( (Map.Map String Int),(Either String ()))
data Inh_Equ = Inh_Equ {idMemRef_Inh_Equ :: (Map.Map String Int)}
data Syn_Equ = Syn_Equ {idMemRef_Syn_Equ :: (Map.Map String Int),res_Syn_Equ :: (Either String ())}
wrap_Equ :: T_Equ ->
            Inh_Equ ->
            Syn_Equ
wrap_Equ sem (Inh_Equ _lhsIidMemRef) =
    (let ( _lhsOidMemRef,_lhsOres) = sem _lhsIidMemRef
     in  (Syn_Equ _lhsOidMemRef _lhsOres))
sem_Equ_Tuple :: String ->
                 Int ->
                 T_Equ
sem_Equ_Tuple x1_ x2_ =
    (\ _lhsIidMemRef ->
         (let _lhsOres :: (Either String ())
              _lhsOidMemRef :: (Map.Map String Int)
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 46, column 11)
              _lhsOres =
                  ({-# LINE 46 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   if x1_ `Map.member` _lhsIidMemRef
                   then Left $ x1_ ++ " was already defined "
                   else Right ()
                   {-# LINE 130 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 46, column 11)
              _lhsOidMemRef =
                  ({-# LINE 50 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Map.insert x1_ x2_ _lhsIidMemRef
                   {-# LINE 136 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOidMemRef,_lhsOres)))
-- Equates -----------------------------------------------------
{-
   visit 0:
      chained attribute:
         idMemRef             : Map.Map String Int
   alternatives:
      alternative Cons:
         child hd             : Equ 
         child tl             : Equates 
      alternative Nil:
-}
-- cata
sem_Equates :: Equates ->
               T_Equates
sem_Equates list =
    (Prelude.foldr sem_Equates_Cons sem_Equates_Nil (Prelude.map sem_Equ list))
-- semantic domain
type T_Equates = (Map.Map String Int) ->
                 ( (Map.Map String Int))
data Inh_Equates = Inh_Equates {idMemRef_Inh_Equates :: (Map.Map String Int)}
data Syn_Equates = Syn_Equates {idMemRef_Syn_Equates :: (Map.Map String Int)}
wrap_Equates :: T_Equates ->
                Inh_Equates ->
                Syn_Equates
wrap_Equates sem (Inh_Equates _lhsIidMemRef) =
    (let ( _lhsOidMemRef) = sem _lhsIidMemRef
     in  (Syn_Equates _lhsOidMemRef))
sem_Equates_Cons :: T_Equ ->
                    T_Equates ->
                    T_Equates
sem_Equates_Cons hd_ tl_ =
    (\ _lhsIidMemRef ->
         (let _lhsOidMemRef :: (Map.Map String Int)
              _hdOidMemRef :: (Map.Map String Int)
              _tlOidMemRef :: (Map.Map String Int)
              _hdIidMemRef :: (Map.Map String Int)
              _hdIres :: (Either String ())
              _tlIidMemRef :: (Map.Map String Int)
              -- copy rule (up)
              _lhsOidMemRef =
                  ({-# LINE 13 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _tlIidMemRef
                   {-# LINE 181 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOidMemRef =
                  ({-# LINE 16 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRef
                   {-# LINE 187 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _tlOidMemRef =
                  ({-# LINE 13 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _hdIidMemRef
                   {-# LINE 193 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _hdIidMemRef,_hdIres) =
                  hd_ _hdOidMemRef
              ( _tlIidMemRef) =
                  tl_ _tlOidMemRef
          in  ( _lhsOidMemRef)))
sem_Equates_Nil :: T_Equates
sem_Equates_Nil =
    (\ _lhsIidMemRef ->
         (let _lhsOidMemRef :: (Map.Map String Int)
              -- copy rule (chain)
              _lhsOidMemRef =
                  ({-# LINE 13 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRef
                   {-# LINE 208 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOidMemRef)))
-- Instr -------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      synthesized attribute:
         res                  : Either String ()
   alternatives:
      alternative IMMI:
         child dest           : MRef 
         child int            : {Int}
      alternative IMMS:
         child dest           : MRef 
         child string         : {String}
      alternative IMRPC:
         child dest           : MRef 
         child int            : {Int}
      alternative SPC:
         child oper           : MRef 
      alternative IMMM:
         child dest           : MRef 
         child oper           : MRef 
      alternative IAdd:
         child dest           : MRef 
         child left           : MRef 
         child right          : MRef 
      alternative ISub:
         child dest           : MRef 
         child left           : MRef 
         child right          : MRef 
      alternative IMul:
         child dest           : MRef 
         child left           : MRef 
         child right          : MRef 
      alternative IDiv:
         child dest           : MRef 
         child left           : MRef 
         child right          : MRef 
      alternative IMod:
         child dest           : MRef 
         child left           : MRef 
         child right          : MRef 
      alternative IMRI:
         child dest           : MRef 
         child oper           : MRef 
         child int            : {Int}
      alternative IMMR:
         child dest           : MRef 
         child int            : {Int}
         child oper           : MRef 
      alternative IRI:
         child oper           : MRef 
      alternative IWI:
         child oper           : MRef 
      alternative IRS:
         child left           : MRef 
         child right          : MRef 
      alternative IWS:
         child oper           : MRef 
      alternative IGI:
         child int            : {Int}
      alternative IGS:
         child string         : {String}
      alternative IFI:
         child bcond          : MRef 
         child cond           : Cond 
         child then           : MRef 
         child int            : {Int}
      alternative IFS:
         child bcond          : MRef 
         child cond           : Cond 
         child then           : MRef 
         child string         : {String}
      alternative IH:
      alternative IB:
      alternative INI:
-}
-- cata
sem_Instr :: Instr ->
             T_Instr
sem_Instr (IMMI _dest _int) =
    (sem_Instr_IMMI (sem_MRef _dest) _int)
sem_Instr (IMMS _dest _string) =
    (sem_Instr_IMMS (sem_MRef _dest) _string)
sem_Instr (IMRPC _dest _int) =
    (sem_Instr_IMRPC (sem_MRef _dest) _int)
sem_Instr (SPC _oper) =
    (sem_Instr_SPC (sem_MRef _oper))
sem_Instr (IMMM _dest _oper) =
    (sem_Instr_IMMM (sem_MRef _dest) (sem_MRef _oper))
sem_Instr (IAdd _dest _left _right) =
    (sem_Instr_IAdd (sem_MRef _dest) (sem_MRef _left) (sem_MRef _right))
sem_Instr (ISub _dest _left _right) =
    (sem_Instr_ISub (sem_MRef _dest) (sem_MRef _left) (sem_MRef _right))
sem_Instr (IMul _dest _left _right) =
    (sem_Instr_IMul (sem_MRef _dest) (sem_MRef _left) (sem_MRef _right))
sem_Instr (IDiv _dest _left _right) =
    (sem_Instr_IDiv (sem_MRef _dest) (sem_MRef _left) (sem_MRef _right))
sem_Instr (IMod _dest _left _right) =
    (sem_Instr_IMod (sem_MRef _dest) (sem_MRef _left) (sem_MRef _right))
sem_Instr (IMRI _dest _oper _int) =
    (sem_Instr_IMRI (sem_MRef _dest) (sem_MRef _oper) _int)
sem_Instr (IMMR _dest _int _oper) =
    (sem_Instr_IMMR (sem_MRef _dest) _int (sem_MRef _oper))
sem_Instr (IRI _oper) =
    (sem_Instr_IRI (sem_MRef _oper))
sem_Instr (IWI _oper) =
    (sem_Instr_IWI (sem_MRef _oper))
sem_Instr (IRS _left _right) =
    (sem_Instr_IRS (sem_MRef _left) (sem_MRef _right))
sem_Instr (IWS _oper) =
    (sem_Instr_IWS (sem_MRef _oper))
sem_Instr (IGI _int) =
    (sem_Instr_IGI _int)
sem_Instr (IGS _string) =
    (sem_Instr_IGS _string)
sem_Instr (IFI _bcond _cond _then _int) =
    (sem_Instr_IFI (sem_MRef _bcond) (sem_Cond _cond) (sem_MRef _then) _int)
sem_Instr (IFS _bcond _cond _then _string) =
    (sem_Instr_IFS (sem_MRef _bcond) (sem_Cond _cond) (sem_MRef _then) _string)
sem_Instr (IH) =
    (sem_Instr_IH)
sem_Instr (IB) =
    (sem_Instr_IB)
sem_Instr (INI) =
    (sem_Instr_INI)
-- semantic domain
type T_Instr = (Map.Map String Int) ->
               (Set.Set String) ->
               ( (Either String ()))
data Inh_Instr = Inh_Instr {idMemRefDef_Inh_Instr :: (Map.Map String Int),labelFound_Inh_Instr :: (Set.Set String)}
data Syn_Instr = Syn_Instr {res_Syn_Instr :: (Either String ())}
wrap_Instr :: T_Instr ->
              Inh_Instr ->
              Syn_Instr
wrap_Instr sem (Inh_Instr _lhsIidMemRefDef _lhsIlabelFound) =
    (let ( _lhsOres) = sem _lhsIidMemRefDef _lhsIlabelFound
     in  (Syn_Instr _lhsOres))
sem_Instr_IMMI :: T_MRef ->
                  Int ->
                  T_Instr
sem_Instr_IMMI dest_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 83, column 11)
              _lhsOres =
                  ({-# LINE 83 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 363 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 369 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMMS :: T_MRef ->
                  String ->
                  T_Instr
sem_Instr_IMMS dest_ string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 84, column 11)
              _lhsOres =
                  ({-# LINE 84 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 387 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 393 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMRPC :: T_MRef ->
                   Int ->
                   T_Instr
sem_Instr_IMRPC dest_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 85, column 11)
              _lhsOres =
                  ({-# LINE 85 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 411 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 417 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_SPC :: T_MRef ->
                 T_Instr
sem_Instr_SPC oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 86, column 11)
              _lhsOres =
                  ({-# LINE 86 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 434 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 440 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMMM :: T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMMM dest_ oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 87, column 11)
              _lhsOres =
                  ({-# LINE 87 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 460 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 466 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 472 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IAdd :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IAdd dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 88, column 11)
              _lhsOres =
                  ({-# LINE 88 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 497 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 503 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 509 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 515 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_ISub :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_ISub dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 89, column 11)
              _lhsOres =
                  ({-# LINE 89 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 542 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 548 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 554 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 560 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMul :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMul dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 90, column 11)
              _lhsOres =
                  ({-# LINE 90 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 587 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 593 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 599 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 605 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IDiv :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IDiv dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 91, column 11)
              _lhsOres =
                  ({-# LINE 91 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 632 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 638 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 644 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 650 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMod :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMod dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 92, column 11)
              _lhsOres =
                  ({-# LINE 92 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 677 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 683 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 689 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 695 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMRI :: T_MRef ->
                  T_MRef ->
                  Int ->
                  T_Instr
sem_Instr_IMRI dest_ oper_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 93, column 11)
              _lhsOres =
                  ({-# LINE 93 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 720 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 726 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 732 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IMMR :: T_MRef ->
                  Int ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMMR dest_ int_ oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIres :: ( Either String () )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 94, column 11)
              _lhsOres =
                  ({-# LINE 94 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 755 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 761 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 767 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIres) =
                  dest_ _destOidMemRefDef
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IRI :: T_MRef ->
                 T_Instr
sem_Instr_IRI oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 95, column 11)
              _lhsOres =
                  ({-# LINE 95 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 786 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 792 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IWI :: T_MRef ->
                 T_Instr
sem_Instr_IWI oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 96, column 11)
              _lhsOres =
                  ({-# LINE 96 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 809 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 815 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IRS :: T_MRef ->
                 T_MRef ->
                 T_Instr
sem_Instr_IRS left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _leftIres :: ( Either String () )
              _rightIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 97, column 11)
              _lhsOres =
                  ({-# LINE 97 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _leftIres <--> _rightIres
                   {-# LINE 835 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 841 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 847 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IWS :: T_MRef ->
                 T_Instr
sem_Instr_IWS oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 98, column 11)
              _lhsOres =
                  ({-# LINE 98 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 866 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 872 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IGI :: Int ->
                 T_Instr
sem_Instr_IGI int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 99, column 11)
              _lhsOres =
                  ({-# LINE 99 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 887 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
sem_Instr_IGS :: String ->
                 T_Instr
sem_Instr_IGS string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 100, column 11)
              _lhsOres =
                  ({-# LINE 100 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isLabelDef string_ _lhsIlabelFound
                   {-# LINE 900 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
sem_Instr_IFI :: T_MRef ->
                 T_Cond ->
                 T_MRef ->
                 Int ->
                 T_Instr
sem_Instr_IFI bcond_ cond_ then_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _bcondOidMemRefDef :: ( Map.Map String Int )
              _thenOidMemRefDef :: ( Map.Map String Int )
              _bcondIres :: ( Either String () )
              _thenIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 101, column 11)
              _lhsOres =
                  ({-# LINE 101 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _bcondIres <--> _thenIres
                   {-# LINE 920 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _bcondOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 926 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _thenOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 932 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _bcondIres) =
                  bcond_ _bcondOidMemRefDef
              ( _thenIres) =
                  then_ _thenOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IFS :: T_MRef ->
                 T_Cond ->
                 T_MRef ->
                 String ->
                 T_Instr
sem_Instr_IFS bcond_ cond_ then_ string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _bcondOidMemRefDef :: ( Map.Map String Int )
              _thenOidMemRefDef :: ( Map.Map String Int )
              _bcondIres :: ( Either String () )
              _thenIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 102, column 11)
              _lhsOres =
                  ({-# LINE 102 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isLabelDef string_ _lhsIlabelFound <--> _bcondIres <--> _thenIres
                   {-# LINE 956 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _bcondOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 962 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _thenOidMemRefDef =
                  ({-# LINE 42 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 968 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _bcondIres) =
                  bcond_ _bcondOidMemRefDef
              ( _thenIres) =
                  then_ _thenOidMemRefDef
          in  ( _lhsOres)))
sem_Instr_IH :: T_Instr
sem_Instr_IH =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 103, column 11)
              _lhsOres =
                  ({-# LINE 103 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 984 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
sem_Instr_IB :: T_Instr
sem_Instr_IB =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 104, column 11)
              _lhsOres =
                  ({-# LINE 104 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 996 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
sem_Instr_INI :: T_Instr
sem_Instr_INI =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 105, column 11)
              _lhsOres =
                  ({-# LINE 105 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1008 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
-- Labels ------------------------------------------------------
{-
   visit 0:
      chained attribute:
         labelDef             :  Set.Set String 
      synthesized attributes:
         copy                 : Labels 
         res                  :  Either String () 
   alternatives:
      alternative Cons:
         child hd             : {String}
         child tl             : Labels 
         visit 0:
            local copy        : _
      alternative Nil:
         visit 0:
            local copy        : _
-}
-- cata
sem_Labels :: Labels ->
              T_Labels
sem_Labels list =
    (Prelude.foldr sem_Labels_Cons sem_Labels_Nil list)
-- semantic domain
type T_Labels = ( Set.Set String ) ->
                ( Labels,( Set.Set String ),( Either String () ))
data Inh_Labels = Inh_Labels {labelDef_Inh_Labels :: ( Set.Set String )}
data Syn_Labels = Syn_Labels {copy_Syn_Labels :: Labels,labelDef_Syn_Labels :: ( Set.Set String ),res_Syn_Labels :: ( Either String () )}
wrap_Labels :: T_Labels ->
               Inh_Labels ->
               Syn_Labels
wrap_Labels sem (Inh_Labels _lhsIlabelDef) =
    (let ( _lhsOcopy,_lhsOlabelDef,_lhsOres) = sem _lhsIlabelDef
     in  (Syn_Labels _lhsOcopy _lhsOlabelDef _lhsOres))
sem_Labels_Cons :: String ->
                   T_Labels ->
                   T_Labels
sem_Labels_Cons hd_ tl_ =
    (\ _lhsIlabelDef ->
         (let _lhsOres :: ( Either String () )
              _lhsOlabelDef :: ( Set.Set String )
              _lhsOcopy :: Labels
              _tlOlabelDef :: ( Set.Set String )
              _tlIcopy :: Labels
              _tlIlabelDef :: ( Set.Set String )
              _tlIres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 53, column 11)
              _lhsOres =
                  ({-# LINE 53 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isLabelNotDef hd_ _tlIlabelDef
                   {-# LINE 1061 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 53, column 11)
              _lhsOlabelDef =
                  ({-# LINE 54 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Set.insert hd_ _tlIlabelDef
                   {-# LINE 1067 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _copy =
                  ({-# LINE 39 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   (:) hd_ _tlIcopy
                   {-# LINE 1073 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _lhsOcopy =
                  ({-# LINE 39 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _copy
                   {-# LINE 1079 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOlabelDef =
                  ({-# LINE 38 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1085 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _tlIcopy,_tlIlabelDef,_tlIres) =
                  tl_ _tlOlabelDef
          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOres)))
sem_Labels_Nil :: T_Labels
sem_Labels_Nil =
    (\ _lhsIlabelDef ->
         (let _lhsOres :: ( Either String () )
              _lhsOlabelDef :: ( Set.Set String )
              _lhsOcopy :: Labels
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 55, column 11)
              _lhsOres =
                  ({-# LINE 55 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1100 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 55, column 11)
              _lhsOlabelDef =
                  ({-# LINE 56 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1106 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _copy =
                  ({-# LINE 39 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   []
                   {-# LINE 1112 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _lhsOcopy =
                  ({-# LINE 39 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _copy
                   {-# LINE 1118 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOres)))
-- MRef --------------------------------------------------------
{-
   visit 0:
      inherited attribute:
         idMemRefDef          :  Map.Map String Int 
      synthesized attribute:
         res                  :  Either String () 
   alternatives:
      alternative MRefI:
         child int            : {Int}
      alternative MRefId:
         child string         : {String}
-}
-- cata
sem_MRef :: MRef ->
            T_MRef
sem_MRef (MRefI _int) =
    (sem_MRef_MRefI _int)
sem_MRef (MRefId _string) =
    (sem_MRef_MRefId _string)
-- semantic domain
type T_MRef = ( Map.Map String Int ) ->
              ( ( Either String () ))
data Inh_MRef = Inh_MRef {idMemRefDef_Inh_MRef :: ( Map.Map String Int )}
data Syn_MRef = Syn_MRef {res_Syn_MRef :: ( Either String () )}
wrap_MRef :: T_MRef ->
             Inh_MRef ->
             Syn_MRef
wrap_MRef sem (Inh_MRef _lhsIidMemRefDef) =
    (let ( _lhsOres) = sem _lhsIidMemRefDef
     in  (Syn_MRef _lhsOres))
sem_MRef_MRefI :: Int ->
                  T_MRef
sem_MRef_MRefI int_ =
    (\ _lhsIidMemRefDef ->
         (let _lhsOres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 79, column 12)
              _lhsOres =
                  ({-# LINE 79 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1161 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
sem_MRef_MRefId :: String ->
                   T_MRef
sem_MRef_MRefId string_ =
    (\ _lhsIidMemRefDef ->
         (let _lhsOres :: ( Either String () )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 80, column 12)
              _lhsOres =
                  ({-# LINE 80 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isMemRefDef string_ _lhsIidMemRefDef
                   {-# LINE 1173 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOres)))
-- Prog --------------------------------------------------------
{-
   visit 0:
      synthesized attribute:
         res                  : Either String ()
   alternatives:
      alternative Prg:
         child stms           : Stmts 
         child equates        : Equates 
-}
-- cata
sem_Prog :: Prog ->
            T_Prog
sem_Prog (Prg _stms _equates) =
    (sem_Prog_Prg (sem_Stmts _stms) (sem_Equates _equates))
-- semantic domain
type T_Prog = ( (Either String ()))
data Inh_Prog = Inh_Prog {}
data Syn_Prog = Syn_Prog {res_Syn_Prog :: (Either String ())}
wrap_Prog :: T_Prog ->
             Inh_Prog ->
             Syn_Prog
wrap_Prog sem (Inh_Prog) =
    (let ( _lhsOres) = sem
     in  (Syn_Prog _lhsOres))
sem_Prog_Prg :: T_Stmts ->
                T_Equates ->
                T_Prog
sem_Prog_Prg stms_ equates_ =
    (let _stmsOlabelDef :: (Set.Set String)
         _stmsOlabelFound :: (Set.Set String)
         _stmsOidMemRefDef :: (Map.Map String Int)
         _equatesOidMemRef :: (Map.Map String Int)
         _lhsOres :: (Either String ())
         _stmsIlabelDef :: (Set.Set String)
         _stmsIres :: (Either String ())
         _equatesIidMemRef :: (Map.Map String Int)
         -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
         _stmsOlabelDef =
             ({-# LINE 59 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
              Set.empty
              {-# LINE 1217 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
         _stmsOlabelFound =
             ({-# LINE 60 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
              _stmsIlabelDef
              {-# LINE 1223 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
         _stmsOidMemRefDef =
             ({-# LINE 61 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
              _equatesIidMemRef
              {-# LINE 1229 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 62, column 9)
         _equatesOidMemRef =
             ({-# LINE 62 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
              Map.empty
              {-# LINE 1235 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- copy rule (up)
         _lhsOres =
             ({-# LINE 10 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
              _stmsIres
              {-# LINE 1241 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         ( _stmsIlabelDef,_stmsIres) =
             stms_ _stmsOidMemRefDef _stmsOlabelDef _stmsOlabelFound
         ( _equatesIidMemRef) =
             equates_ _equatesOidMemRef
     in  ( _lhsOres))
-- Stmt --------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      chained attribute:
         labelDef             : Set.Set String
      synthesized attribute:
         res                  : Either String ()
   alternatives:
      alternative Stmt:
         child labels         : Labels 
         child instr          : Instr 
         visit 0:
            local res1        : _
-}
-- cata
sem_Stmt :: Stmt ->
            T_Stmt
sem_Stmt (Stmt _labels _instr) =
    (sem_Stmt_Stmt (sem_Labels _labels) (sem_Instr _instr))
-- semantic domain
type T_Stmt = (Map.Map String Int) ->
              (Set.Set String) ->
              (Set.Set String) ->
              ( (Set.Set String),(Either String ()))
data Inh_Stmt = Inh_Stmt {idMemRefDef_Inh_Stmt :: (Map.Map String Int),labelDef_Inh_Stmt :: (Set.Set String),labelFound_Inh_Stmt :: (Set.Set String)}
data Syn_Stmt = Syn_Stmt {labelDef_Syn_Stmt :: (Set.Set String),res_Syn_Stmt :: (Either String ())}
wrap_Stmt :: T_Stmt ->
             Inh_Stmt ->
             Syn_Stmt
wrap_Stmt sem (Inh_Stmt _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
    (let ( _lhsOlabelDef,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
     in  (Syn_Stmt _lhsOlabelDef _lhsOres))
sem_Stmt_Stmt :: T_Labels ->
                 T_Instr ->
                 T_Stmt
sem_Stmt_Stmt labels_ instr_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _lhsOlabelDef :: (Set.Set String)
              _labelsOlabelDef :: ( Set.Set String )
              _instrOidMemRefDef :: (Map.Map String Int)
              _instrOlabelFound :: (Set.Set String)
              _labelsIcopy :: Labels
              _labelsIlabelDef :: ( Set.Set String )
              _labelsIres :: ( Either String () )
              _instrIres :: (Either String ())
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 65, column 10)
              _res1 =
                  ({-# LINE 65 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   let f (e,er,s) lbl = if Set.member lbl s
                                        then (True,
                                              lbl ++ " is already defined\n" ++ er,
                                              s)
                                        else (e, er, Set.insert lbl s)
                       (e', errs', set') = foldl f (False,"",_lhsIlabelDef) _labelsIcopy
                   in if e'
                      then Left errs'
                      else Right ()
                   {-# LINE 1311 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "./src-ag/Language/EWE/CheckGrammar.ag"(line 76, column 11)
              _lhsOres =
                  ({-# LINE 76 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _res1 <--> _instrIres
                   {-# LINE 1317 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (up)
              _lhsOlabelDef =
                  ({-# LINE 26 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _labelsIlabelDef
                   {-# LINE 1323 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _labelsOlabelDef =
                  ({-# LINE 38 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1329 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _instrOidMemRefDef =
                  ({-# LINE 33 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1335 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _instrOlabelFound =
                  ({-# LINE 32 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1341 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _labelsIcopy,_labelsIlabelDef,_labelsIres) =
                  labels_ _labelsOlabelDef
              ( _instrIres) =
                  instr_ _instrOidMemRefDef _instrOlabelFound
          in  ( _lhsOlabelDef,_lhsOres)))
-- Stmts -------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      chained attribute:
         labelDef             : Set.Set String
      synthesized attribute:
         res                  : Either String ()
   alternatives:
      alternative Cons:
         child hd             : Stmt 
         child tl             : Stmts 
      alternative Nil:
-}
-- cata
sem_Stmts :: Stmts ->
             T_Stmts
sem_Stmts list =
    (Prelude.foldr sem_Stmts_Cons sem_Stmts_Nil (Prelude.map sem_Stmt list))
-- semantic domain
type T_Stmts = (Map.Map String Int) ->
               (Set.Set String) ->
               (Set.Set String) ->
               ( (Set.Set String),(Either String ()))
data Inh_Stmts = Inh_Stmts {idMemRefDef_Inh_Stmts :: (Map.Map String Int),labelDef_Inh_Stmts :: (Set.Set String),labelFound_Inh_Stmts :: (Set.Set String)}
data Syn_Stmts = Syn_Stmts {labelDef_Syn_Stmts :: (Set.Set String),res_Syn_Stmts :: (Either String ())}
wrap_Stmts :: T_Stmts ->
              Inh_Stmts ->
              Syn_Stmts
wrap_Stmts sem (Inh_Stmts _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
    (let ( _lhsOlabelDef,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
     in  (Syn_Stmts _lhsOlabelDef _lhsOres))
sem_Stmts_Cons :: T_Stmt ->
                  T_Stmts ->
                  T_Stmts
sem_Stmts_Cons hd_ tl_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _lhsOlabelDef :: (Set.Set String)
              _hdOidMemRefDef :: (Map.Map String Int)
              _hdOlabelDef :: (Set.Set String)
              _hdOlabelFound :: (Set.Set String)
              _tlOidMemRefDef :: (Map.Map String Int)
              _tlOlabelDef :: (Set.Set String)
              _tlOlabelFound :: (Set.Set String)
              _hdIlabelDef :: (Set.Set String)
              _hdIres :: (Either String ())
              _tlIlabelDef :: (Set.Set String)
              _tlIres :: (Either String ())
              -- use rule "./src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
              _lhsOres =
                  ({-# LINE 23 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   ((<-->) _hdIres _tlIres)
                   {-# LINE 1405 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (up)
              _lhsOlabelDef =
                  ({-# LINE 20 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _tlIlabelDef
                   {-# LINE 1411 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOidMemRefDef =
                  ({-# LINE 28 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1417 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOlabelDef =
                  ({-# LINE 26 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1423 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOlabelFound =
                  ({-# LINE 27 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1429 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOidMemRefDef =
                  ({-# LINE 22 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1435 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _tlOlabelDef =
                  ({-# LINE 20 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _hdIlabelDef
                   {-# LINE 1441 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOlabelFound =
                  ({-# LINE 21 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1447 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _hdIlabelDef,_hdIres) =
                  hd_ _hdOidMemRefDef _hdOlabelDef _hdOlabelFound
              ( _tlIlabelDef,_tlIres) =
                  tl_ _tlOidMemRefDef _tlOlabelDef _tlOlabelFound
          in  ( _lhsOlabelDef,_lhsOres)))
sem_Stmts_Nil :: T_Stmts
sem_Stmts_Nil =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOres :: (Either String ())
              _lhsOlabelDef :: (Set.Set String)
              -- use rule "./src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
              _lhsOres =
                  ({-# LINE 23 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1465 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _lhsOlabelDef =
                  ({-# LINE 20 "./src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1471 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOlabelDef,_lhsOres)))