packages feed

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


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

import Text.PrettyPrint
{-# LINE 9 "src/Language/EWE/CheckGrammar.hs" #-}

{-# 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 17 "src/Language/EWE/CheckGrammar.hs" #-}
{-# LINE 124 "src-ag/Language/EWE/PPProg.ag" #-}

(<==>) :: String -> Doc -> Doc
s <==> doc = text s $$ doc
{-# LINE 22 "src/Language/EWE/CheckGrammar.hs" #-}

{-# LINE 110 "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 40 "src/Language/EWE/CheckGrammar.hs" #-}
-- Cond --------------------------------------------------------
{-
   visit 0:
      synthesized attribute:
         pp                   : Doc
   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 = ( Doc)
data Inh_Cond = Inh_Cond {}
data Syn_Cond = Syn_Cond {pp_Syn_Cond :: Doc}
wrap_Cond :: T_Cond ->
             Inh_Cond ->
             Syn_Cond
wrap_Cond sem (Inh_Cond) =
    (let ( _lhsOpp) = sem
     in  (Syn_Cond _lhsOpp))
sem_Cond_CLET :: T_Cond
sem_Cond_CLET =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 39, column 11)
         _lhsOpp =
             ({-# LINE 39 "src-ag/Language/EWE/PPProg.ag" #-}
              text "<="
              {-# LINE 86 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
sem_Cond_CLT :: T_Cond
sem_Cond_CLT =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 40, column 11)
         _lhsOpp =
             ({-# LINE 40 "src-ag/Language/EWE/PPProg.ag" #-}
              char '<'
              {-# LINE 96 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
sem_Cond_CGET :: T_Cond
sem_Cond_CGET =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 41, column 11)
         _lhsOpp =
             ({-# LINE 41 "src-ag/Language/EWE/PPProg.ag" #-}
              text ">="
              {-# LINE 106 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
sem_Cond_CGT :: T_Cond
sem_Cond_CGT =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 42, column 11)
         _lhsOpp =
             ({-# LINE 42 "src-ag/Language/EWE/PPProg.ag" #-}
              char '>'
              {-# LINE 116 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
sem_Cond_CE :: T_Cond
sem_Cond_CE =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 43, column 11)
         _lhsOpp =
             ({-# LINE 43 "src-ag/Language/EWE/PPProg.ag" #-}
              char '='
              {-# LINE 126 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
sem_Cond_CNE :: T_Cond
sem_Cond_CNE =
    (let _lhsOpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 44, column 11)
         _lhsOpp =
             ({-# LINE 44 "src-ag/Language/EWE/PPProg.ag" #-}
              text "<>"
              {-# LINE 136 "src/Language/EWE/CheckGrammar.hs" #-}
              )
     in  ( _lhsOpp))
-- Equ ---------------------------------------------------------
{-
   visit 0:
      chained attribute:
         idMemRef             : Map.Map String Int
      synthesized attributes:
         pp                   : Doc
         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),Doc,(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),pp_Syn_Equ :: Doc,res_Syn_Equ :: (Either String ())}
wrap_Equ :: T_Equ ->
            Inh_Equ ->
            Syn_Equ
wrap_Equ sem (Inh_Equ _lhsIidMemRef) =
    (let ( _lhsOidMemRef,_lhsOpp,_lhsOres) = sem _lhsIidMemRef
     in  (Syn_Equ _lhsOidMemRef _lhsOpp _lhsOres))
sem_Equ_Tuple :: String ->
                 Int ->
                 T_Equ
sem_Equ_Tuple x1_ x2_ =
    (\ _lhsIidMemRef ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _lhsOidMemRef :: (Map.Map String Int)
              -- "src-ag/Language/EWE/PPProg.ag"(line 47, column 11)
              _lhsOpp =
                  ({-# LINE 47 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "equ" <+> nest 5 (text x1_)
                              <+> nest 10 (text "M" <> brackets (int x2_))
                   {-# LINE 181 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "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 189 "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 195 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOidMemRef,_lhsOpp,_lhsOres)))
-- Equates -----------------------------------------------------
{-
   visit 0:
      chained attribute:
         idMemRef             : Map.Map String Int
      synthesized attribute:
         pp                   : Doc
   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),Doc)
data Inh_Equates = Inh_Equates {idMemRef_Inh_Equates :: (Map.Map String Int)}
data Syn_Equates = Syn_Equates {idMemRef_Syn_Equates :: (Map.Map String Int),pp_Syn_Equates :: Doc}
wrap_Equates :: T_Equates ->
                Inh_Equates ->
                Syn_Equates
wrap_Equates sem (Inh_Equates _lhsIidMemRef) =
    (let ( _lhsOidMemRef,_lhsOpp) = sem _lhsIidMemRef
     in  (Syn_Equates _lhsOidMemRef _lhsOpp))
sem_Equates_Cons :: T_Equ ->
                    T_Equates ->
                    T_Equates
sem_Equates_Cons hd_ tl_ =
    (\ _lhsIidMemRef ->
         (let _lhsOpp :: Doc
              _lhsOidMemRef :: (Map.Map String Int)
              _hdOidMemRef :: (Map.Map String Int)
              _tlOidMemRef :: (Map.Map String Int)
              _hdIidMemRef :: (Map.Map String Int)
              _hdIpp :: Doc
              _hdIres :: (Either String ())
              _tlIidMemRef :: (Map.Map String Int)
              _tlIpp :: Doc
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 16, column 10)
              _lhsOpp =
                  ({-# LINE 16 "src-ag/Language/EWE/PPProg.ag" #-}
                   _hdIpp $$ _tlIpp
                   {-# LINE 245 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (up)
              _lhsOidMemRef =
                  ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _tlIidMemRef
                   {-# LINE 251 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOidMemRef =
                  ({-# LINE 16 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRef
                   {-# LINE 257 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _tlOidMemRef =
                  ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _hdIidMemRef
                   {-# LINE 263 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _hdIidMemRef,_hdIpp,_hdIres) =
                  hd_ _hdOidMemRef
              ( _tlIidMemRef,_tlIpp) =
                  tl_ _tlOidMemRef
          in  ( _lhsOidMemRef,_lhsOpp)))
sem_Equates_Nil :: T_Equates
sem_Equates_Nil =
    (\ _lhsIidMemRef ->
         (let _lhsOpp :: Doc
              _lhsOidMemRef :: (Map.Map String Int)
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 16, column 10)
              _lhsOpp =
                  ({-# LINE 16 "src-ag/Language/EWE/PPProg.ag" #-}
                   empty
                   {-# LINE 279 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _lhsOidMemRef =
                  ({-# LINE 13 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRef
                   {-# LINE 285 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOidMemRef,_lhsOpp)))
-- Instr -------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      synthesized attributes:
         pp                   : Doc
         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) ->
               ( Doc,(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 {pp_Syn_Instr :: Doc,res_Syn_Instr :: (Either String ())}
wrap_Instr :: T_Instr ->
              Inh_Instr ->
              Syn_Instr
wrap_Instr sem (Inh_Instr _lhsIidMemRefDef _lhsIlabelFound) =
    (let ( _lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelFound
     in  (Syn_Instr _lhsOpp _lhsOres))
sem_Instr_IMMI :: T_MRef ->
                  Int ->
                  T_Instr
sem_Instr_IMMI dest_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 57, column 11)
              _lhsOpp =
                  ({-# LINE 57 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=") <+> nest 5 (int int_)
                   {-# LINE 443 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 83, column 11)
              _lhsOres =
                  ({-# LINE 83 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 449 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 455 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMMS :: T_MRef ->
                  String ->
                  T_Instr
sem_Instr_IMMS dest_ string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 58, column 11)
              _lhsOpp =
                  ({-# LINE 58 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 (doubleQuotes (text string_))
                   {-# LINE 476 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 84, column 11)
              _lhsOres =
                  ({-# LINE 84 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 482 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 488 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMRPC :: T_MRef ->
                   Int ->
                   T_Instr
sem_Instr_IMRPC dest_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 60, column 11)
              _lhsOpp =
                  ({-# LINE 60 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 (text "PC")
                            <+> char '+'
                            <+> int int_
                   {-# LINE 511 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 85, column 11)
              _lhsOres =
                  ({-# LINE 85 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres
                   {-# LINE 517 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 523 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_SPC :: T_MRef ->
                 T_Instr
sem_Instr_SPC oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 65, column 11)
              _lhsOpp =
                  ({-# LINE 65 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "PC" <+> nest 5 (text ":=")
                             <+> nest 5 _operIpp
                   {-# LINE 543 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 86, column 11)
              _lhsOres =
                  ({-# LINE 86 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 549 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 555 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMMM :: T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMMM dest_ oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 68, column 11)
              _lhsOpp =
                  ({-# LINE 68 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _operIpp
                   {-# LINE 579 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 87, column 11)
              _lhsOres =
                  ({-# LINE 87 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 585 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 591 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 597 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IAdd :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IAdd dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 71, column 11)
              _lhsOpp =
                  ({-# LINE 71 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _leftIpp
                            <+> char '+'
                            <+> _rightIpp
                   {-# LINE 629 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 88, column 11)
              _lhsOres =
                  ({-# LINE 88 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 635 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 641 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 647 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 653 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_ISub :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_ISub dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 76, column 11)
              _lhsOpp =
                  ({-# LINE 76 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _leftIpp
                            <+> char '-'
                            <+> _rightIpp
                   {-# LINE 687 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 89, column 11)
              _lhsOres =
                  ({-# LINE 89 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 693 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 699 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 705 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 711 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMul :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMul dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 81, column 11)
              _lhsOpp =
                  ({-# LINE 81 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _leftIpp
                            <+> char '*'
                            <+> _rightIpp
                   {-# LINE 745 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 90, column 11)
              _lhsOres =
                  ({-# LINE 90 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 751 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 757 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 763 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 769 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IDiv :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IDiv dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 86, column 11)
              _lhsOpp =
                  ({-# LINE 86 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _leftIpp
                            <+> char '/'
                            <+> _rightIpp
                   {-# LINE 803 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 91, column 11)
              _lhsOres =
                  ({-# LINE 91 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 809 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 815 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 821 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 827 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMod :: T_MRef ->
                  T_MRef ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMod dest_ left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 91, column 11)
              _lhsOpp =
                  ({-# LINE 91 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 _leftIpp
                            <+> char '%'
                            <+> _rightIpp
                   {-# LINE 861 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 92, column 11)
              _lhsOres =
                  ({-# LINE 92 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _leftIres <--> _rightIres
                   {-# LINE 867 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 873 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 879 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 885 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMRI :: T_MRef ->
                  T_MRef ->
                  Int ->
                  T_Instr
sem_Instr_IMRI dest_ oper_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 96, column 11)
              _lhsOpp =
                  ({-# LINE 96 "src-ag/Language/EWE/PPProg.ag" #-}
                   _destIpp <+> nest 5 (text ":=")
                            <+> nest 5 (char 'M')
                            <> brackets (_operIpp
                                <+> char '+'
                                <+> int int_)
                   {-# LINE 917 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 93, column 11)
              _lhsOres =
                  ({-# LINE 93 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 923 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 929 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 935 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IMMR :: T_MRef ->
                  Int ->
                  T_MRef ->
                  T_Instr
sem_Instr_IMMR dest_ int_ oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _destOidMemRefDef :: ( Map.Map String Int )
              _operOidMemRefDef :: ( Map.Map String Int )
              _destIpp :: Doc
              _destIres :: ( Either String () )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 102, column 11)
              _lhsOpp =
                  ({-# LINE 102 "src-ag/Language/EWE/PPProg.ag" #-}
                   char 'M' <> brackets (_destIpp
                                          <+> char '+'
                                          <+> int int_)
                            <+> nest 5 (text ":=")
                            <+> nest 5 _operIpp
                   {-# LINE 965 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 94, column 11)
              _lhsOres =
                  ({-# LINE 94 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _destIres <--> _operIres
                   {-# LINE 971 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _destOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 977 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 983 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _destIpp,_destIres) =
                  dest_ _destOidMemRefDef
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IRI :: T_MRef ->
                 T_Instr
sem_Instr_IRI oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 108, column 11)
              _lhsOpp =
                  ({-# LINE 108 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "readInt" <> parens _operIpp
                   {-# LINE 1004 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 95, column 11)
              _lhsOres =
                  ({-# LINE 95 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 1010 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1016 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IWI :: T_MRef ->
                 T_Instr
sem_Instr_IWI oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 109, column 11)
              _lhsOpp =
                  ({-# LINE 109 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "writeInt" <> parens _operIpp
                   {-# LINE 1035 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 96, column 11)
              _lhsOres =
                  ({-# LINE 96 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 1041 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1047 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IRS :: T_MRef ->
                 T_MRef ->
                 T_Instr
sem_Instr_IRS left_ right_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _leftOidMemRefDef :: ( Map.Map String Int )
              _rightOidMemRefDef :: ( Map.Map String Int )
              _leftIpp :: Doc
              _leftIres :: ( Either String () )
              _rightIpp :: Doc
              _rightIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 110, column 11)
              _lhsOpp =
                  ({-# LINE 110 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "readStr" <> parens (_leftIpp <> comma
                                                      <+> _rightIpp)
                   {-# LINE 1071 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 97, column 11)
              _lhsOres =
                  ({-# LINE 97 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _leftIres <--> _rightIres
                   {-# LINE 1077 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _leftOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1083 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _rightOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1089 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _leftIpp,_leftIres) =
                  left_ _leftOidMemRefDef
              ( _rightIpp,_rightIres) =
                  right_ _rightOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IWS :: T_MRef ->
                 T_Instr
sem_Instr_IWS oper_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _operOidMemRefDef :: ( Map.Map String Int )
              _operIpp :: Doc
              _operIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 112, column 11)
              _lhsOpp =
                  ({-# LINE 112 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "writeStr" <> parens _operIpp
                   {-# LINE 1110 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 98, column 11)
              _lhsOres =
                  ({-# LINE 98 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _operIres
                   {-# LINE 1116 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _operOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1122 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _operIpp,_operIres) =
                  oper_ _operOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IGI :: Int ->
                 T_Instr
sem_Instr_IGI int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 113, column 11)
              _lhsOpp =
                  ({-# LINE 113 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "goto" <+> int int_
                   {-# LINE 1138 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 99, column 11)
              _lhsOres =
                  ({-# LINE 99 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1144 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IGS :: String ->
                 T_Instr
sem_Instr_IGS string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 114, column 11)
              _lhsOpp =
                  ({-# LINE 114 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "goto" <+> text string_
                   {-# LINE 1158 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 100, column 11)
              _lhsOres =
                  ({-# LINE 100 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isLabelDef string_ _lhsIlabelFound
                   {-# LINE 1164 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IFI :: T_MRef ->
                 T_Cond ->
                 T_MRef ->
                 Int ->
                 T_Instr
sem_Instr_IFI bcond_ cond_ then_ int_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _bcondOidMemRefDef :: ( Map.Map String Int )
              _thenOidMemRefDef :: ( Map.Map String Int )
              _bcondIpp :: Doc
              _bcondIres :: ( Either String () )
              _condIpp :: Doc
              _thenIpp :: Doc
              _thenIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 115, column 11)
              _lhsOpp =
                  ({-# LINE 115 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "if" <+> _bcondIpp <+> _condIpp <+> _thenIpp
                             <+> text "then" <+> text "goto" <+> int int_
                   {-# LINE 1189 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 101, column 11)
              _lhsOres =
                  ({-# LINE 101 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _bcondIres <--> _thenIres
                   {-# LINE 1195 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _bcondOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1201 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _thenOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1207 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _bcondIpp,_bcondIres) =
                  bcond_ _bcondOidMemRefDef
              ( _condIpp) =
                  cond_
              ( _thenIpp,_thenIres) =
                  then_ _thenOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IFS :: T_MRef ->
                 T_Cond ->
                 T_MRef ->
                 String ->
                 T_Instr
sem_Instr_IFS bcond_ cond_ then_ string_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _bcondOidMemRefDef :: ( Map.Map String Int )
              _thenOidMemRefDef :: ( Map.Map String Int )
              _bcondIpp :: Doc
              _bcondIres :: ( Either String () )
              _condIpp :: Doc
              _thenIpp :: Doc
              _thenIres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 117, column 11)
              _lhsOpp =
                  ({-# LINE 117 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "if" <+> _bcondIpp <+> _condIpp <+> _thenIpp
                             <+> text "then" <+> text "goto"
                             <+> text string_
                   {-# LINE 1239 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "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 1245 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _bcondOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1251 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _thenOidMemRefDef =
                  ({-# LINE 42 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1257 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _bcondIpp,_bcondIres) =
                  bcond_ _bcondOidMemRefDef
              ( _condIpp) =
                  cond_
              ( _thenIpp,_thenIres) =
                  then_ _thenOidMemRefDef
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IH :: T_Instr
sem_Instr_IH =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 120, column 11)
              _lhsOpp =
                  ({-# LINE 120 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "halt"
                   {-# LINE 1276 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 103, column 11)
              _lhsOres =
                  ({-# LINE 103 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1282 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_IB :: T_Instr
sem_Instr_IB =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 121, column 11)
              _lhsOpp =
                  ({-# LINE 121 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "break"
                   {-# LINE 1295 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 104, column 11)
              _lhsOres =
                  ({-# LINE 104 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1301 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
sem_Instr_INI :: T_Instr
sem_Instr_INI =
    (\ _lhsIidMemRefDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 122, column 11)
              _lhsOpp =
                  ({-# LINE 122 "src-ag/Language/EWE/PPProg.ag" #-}
                   empty
                   {-# LINE 1314 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 105, column 11)
              _lhsOres =
                  ({-# LINE 105 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1320 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
-- Labels ------------------------------------------------------
{-
   visit 0:
      chained attribute:
         labelDef             :  Set.Set String 
      synthesized attributes:
         copy                 : Labels 
         pp                   : Doc
         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 ),Doc,( 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 ),pp_Syn_Labels :: Doc,res_Syn_Labels :: ( Either String () )}
wrap_Labels :: T_Labels ->
               Inh_Labels ->
               Syn_Labels
wrap_Labels sem (Inh_Labels _lhsIlabelDef) =
    (let ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIlabelDef
     in  (Syn_Labels _lhsOcopy _lhsOlabelDef _lhsOpp _lhsOres))
sem_Labels_Cons :: String ->
                   T_Labels ->
                   T_Labels
sem_Labels_Cons hd_ tl_ =
    (\ _lhsIlabelDef ->
         (let _lhsOres :: ( Either String () )
              _lhsOlabelDef :: ( Set.Set String )
              _lhsOpp :: Doc
              _lhsOcopy :: Labels
              _tlOlabelDef :: ( Set.Set String )
              _tlIcopy :: Labels
              _tlIlabelDef :: ( Set.Set String )
              _tlIpp :: Doc
              _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 1376 "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 1382 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 19, column 10)
              _lhsOpp =
                  ({-# LINE 19 "src-ag/Language/EWE/PPProg.ag" #-}
                   _tlIpp
                   {-# LINE 1388 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _copy =
                  ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   (:) hd_ _tlIcopy
                   {-# LINE 1394 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _lhsOcopy =
                  ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _copy
                   {-# LINE 1400 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOlabelDef =
                  ({-# LINE 38 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1406 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _tlIcopy,_tlIlabelDef,_tlIpp,_tlIres) =
                  tl_ _tlOlabelDef
          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres)))
sem_Labels_Nil :: T_Labels
sem_Labels_Nil =
    (\ _lhsIlabelDef ->
         (let _lhsOres :: ( Either String () )
              _lhsOlabelDef :: ( Set.Set String )
              _lhsOpp :: Doc
              _lhsOcopy :: Labels
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 55, column 11)
              _lhsOres =
                  ({-# LINE 55 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1422 "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 1428 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 19, column 10)
              _lhsOpp =
                  ({-# LINE 19 "src-ag/Language/EWE/PPProg.ag" #-}
                   empty
                   {-# LINE 1434 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _copy =
                  ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   []
                   {-# LINE 1440 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- self rule
              _lhsOcopy =
                  ({-# LINE 39 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _copy
                   {-# LINE 1446 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOcopy,_lhsOlabelDef,_lhsOpp,_lhsOres)))
-- MRef --------------------------------------------------------
{-
   visit 0:
      inherited attribute:
         idMemRefDef          :  Map.Map String Int 
      synthesized attributes:
         pp                   : Doc
         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 ) ->
              ( Doc,( Either String () ))
data Inh_MRef = Inh_MRef {idMemRefDef_Inh_MRef :: ( Map.Map String Int )}
data Syn_MRef = Syn_MRef {pp_Syn_MRef :: Doc,res_Syn_MRef :: ( Either String () )}
wrap_MRef :: T_MRef ->
             Inh_MRef ->
             Syn_MRef
wrap_MRef sem (Inh_MRef _lhsIidMemRefDef) =
    (let ( _lhsOpp,_lhsOres) = sem _lhsIidMemRefDef
     in  (Syn_MRef _lhsOpp _lhsOres))
sem_MRef_MRefI :: Int ->
                  T_MRef
sem_MRef_MRefI int_ =
    (\ _lhsIidMemRefDef ->
         (let _lhsOpp :: Doc
              _lhsOres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 34, column 12)
              _lhsOpp =
                  ({-# LINE 34 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "M" <> brackets ( int int_ )
                   {-# LINE 1491 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 79, column 12)
              _lhsOres =
                  ({-# LINE 79 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1497 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
sem_MRef_MRefId :: String ->
                   T_MRef
sem_MRef_MRefId string_ =
    (\ _lhsIidMemRefDef ->
         (let _lhsOpp :: Doc
              _lhsOres :: ( Either String () )
              -- "src-ag/Language/EWE/PPProg.ag"(line 35, column 12)
              _lhsOpp =
                  ({-# LINE 35 "src-ag/Language/EWE/PPProg.ag" #-}
                   text "M" <>
                   brackets (text string_)
                   {-# LINE 1511 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "src-ag/Language/EWE/CheckGrammar.ag"(line 80, column 12)
              _lhsOres =
                  ({-# LINE 80 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   isMemRefDef string_ _lhsIidMemRefDef
                   {-# LINE 1517 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOpp,_lhsOres)))
-- Prog --------------------------------------------------------
{-
   visit 0:
      synthesized attributes:
         pp                   : Doc
         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 = ( Doc,(Either String ()))
data Inh_Prog = Inh_Prog {}
data Syn_Prog = Syn_Prog {pp_Syn_Prog :: Doc,res_Syn_Prog :: (Either String ())}
wrap_Prog :: T_Prog ->
             Inh_Prog ->
             Syn_Prog
wrap_Prog sem (Inh_Prog) =
    (let ( _lhsOpp,_lhsOres) = sem
     in  (Syn_Prog _lhsOpp _lhsOres))
sem_Prog_Prg :: T_Stmts ->
                T_Equates ->
                T_Prog
sem_Prog_Prg stms_ equates_ =
    (let _lhsOpp :: Doc
         _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)
         _stmsIpp :: Doc
         _stmsIres :: (Either String ())
         _equatesIidMemRef :: (Map.Map String Int)
         _equatesIpp :: Doc
         -- "src-ag/Language/EWE/PPProg.ag"(line 54, column 9)
         _lhsOpp =
             ({-# LINE 54 "src-ag/Language/EWE/PPProg.ag" #-}
              _stmsIpp $$ _equatesIpp
              {-# LINE 1565 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- "src-ag/Language/EWE/CheckGrammar.ag"(line 59, column 9)
         _stmsOlabelDef =
             ({-# LINE 59 "src-ag/Language/EWE/CheckGrammar.ag" #-}
              Set.empty
              {-# LINE 1571 "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 1577 "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 1583 "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 1589 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         -- copy rule (up)
         _lhsOres =
             ({-# LINE 10 "src-ag/Language/EWE/CheckGrammar.ag" #-}
              _stmsIres
              {-# LINE 1595 "src/Language/EWE/CheckGrammar.hs" #-}
              )
         ( _stmsIlabelDef,_stmsIpp,_stmsIres) =
             stms_ _stmsOidMemRefDef _stmsOlabelDef _stmsOlabelFound
         ( _equatesIidMemRef,_equatesIpp) =
             equates_ _equatesOidMemRef
     in  ( _lhsOpp,_lhsOres))
-- Stmt --------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      chained attribute:
         labelDef             : Set.Set String
      synthesized attributes:
         pp                   : Doc
         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),Doc,(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),pp_Syn_Stmt :: Doc,res_Syn_Stmt :: (Either String ())}
wrap_Stmt :: T_Stmt ->
             Inh_Stmt ->
             Syn_Stmt
wrap_Stmt sem (Inh_Stmt _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
    (let ( _lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
     in  (Syn_Stmt _lhsOlabelDef _lhsOpp _lhsOres))
sem_Stmt_Stmt :: T_Labels ->
                 T_Instr ->
                 T_Stmt
sem_Stmt_Stmt labels_ instr_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _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 )
              _labelsIpp :: Doc
              _labelsIres :: ( Either String () )
              _instrIpp :: Doc
              _instrIres :: (Either String ())
              -- "src-ag/Language/EWE/PPProg.ag"(line 51, column 10)
              _lhsOpp =
                  ({-# LINE 51 "src-ag/Language/EWE/PPProg.ag" #-}
                   _labelsIpp $$ _instrIpp
                   {-# LINE 1661 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- "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 1675 "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 1681 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (up)
              _lhsOlabelDef =
                  ({-# LINE 26 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _labelsIlabelDef
                   {-# LINE 1687 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _labelsOlabelDef =
                  ({-# LINE 38 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1693 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _instrOidMemRefDef =
                  ({-# LINE 33 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1699 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _instrOlabelFound =
                  ({-# LINE 32 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1705 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _labelsIcopy,_labelsIlabelDef,_labelsIpp,_labelsIres) =
                  labels_ _labelsOlabelDef
              ( _instrIpp,_instrIres) =
                  instr_ _instrOidMemRefDef _instrOlabelFound
          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))
-- Stmts -------------------------------------------------------
{-
   visit 0:
      inherited attributes:
         idMemRefDef          : Map.Map String Int
         labelFound           : Set.Set String
      chained attribute:
         labelDef             : Set.Set String
      synthesized attributes:
         pp                   : Doc
         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),Doc,(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),pp_Syn_Stmts :: Doc,res_Syn_Stmts :: (Either String ())}
wrap_Stmts :: T_Stmts ->
              Inh_Stmts ->
              Syn_Stmts
wrap_Stmts sem (Inh_Stmts _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound) =
    (let ( _lhsOlabelDef,_lhsOpp,_lhsOres) = sem _lhsIidMemRefDef _lhsIlabelDef _lhsIlabelFound
     in  (Syn_Stmts _lhsOlabelDef _lhsOpp _lhsOres))
sem_Stmts_Cons :: T_Stmt ->
                  T_Stmts ->
                  T_Stmts
sem_Stmts_Cons hd_ tl_ =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _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)
              _hdIpp :: Doc
              _hdIres :: (Either String ())
              _tlIlabelDef :: (Set.Set String)
              _tlIpp :: Doc
              _tlIres :: (Either String ())
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 25, column 10)
              _lhsOpp =
                  ({-# LINE 25 "src-ag/Language/EWE/PPProg.ag" #-}
                   (($$) _hdIpp _tlIpp)
                   {-# LINE 1773 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- use rule "src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
              _lhsOres =
                  ({-# LINE 23 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   ((<-->) _hdIres _tlIres)
                   {-# LINE 1779 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (up)
              _lhsOlabelDef =
                  ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _tlIlabelDef
                   {-# LINE 1785 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOidMemRefDef =
                  ({-# LINE 28 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1791 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOlabelDef =
                  ({-# LINE 26 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1797 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _hdOlabelFound =
                  ({-# LINE 27 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1803 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOidMemRefDef =
                  ({-# LINE 22 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIidMemRefDef
                   {-# LINE 1809 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _tlOlabelDef =
                  ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _hdIlabelDef
                   {-# LINE 1815 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (down)
              _tlOlabelFound =
                  ({-# LINE 21 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelFound
                   {-# LINE 1821 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              ( _hdIlabelDef,_hdIpp,_hdIres) =
                  hd_ _hdOidMemRefDef _hdOlabelDef _hdOlabelFound
              ( _tlIlabelDef,_tlIpp,_tlIres) =
                  tl_ _tlOidMemRefDef _tlOlabelDef _tlOlabelFound
          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))
sem_Stmts_Nil :: T_Stmts
sem_Stmts_Nil =
    (\ _lhsIidMemRefDef
       _lhsIlabelDef
       _lhsIlabelFound ->
         (let _lhsOpp :: Doc
              _lhsOres :: (Either String ())
              _lhsOlabelDef :: (Set.Set String)
              -- use rule "src-ag/Language/EWE/PPProg.ag"(line 25, column 10)
              _lhsOpp =
                  ({-# LINE 25 "src-ag/Language/EWE/PPProg.ag" #-}
                   empty
                   {-# LINE 1840 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- use rule "src-ag/Language/EWE/CheckGrammar.ag"(line 23, column 12)
              _lhsOres =
                  ({-# LINE 23 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   Right ()
                   {-# LINE 1846 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
              -- copy rule (chain)
              _lhsOlabelDef =
                  ({-# LINE 20 "src-ag/Language/EWE/CheckGrammar.ag" #-}
                   _lhsIlabelDef
                   {-# LINE 1852 "src/Language/EWE/CheckGrammar.hs" #-}
                   )
          in  ( _lhsOlabelDef,_lhsOpp,_lhsOres)))