{-# LANGUAGE DeriveDataTypeable #-}

module Language.Grammars.ZipperAG.Examples.LET.Let_No_Blocks where

import Data.Generics.Zipper
import Language.Grammars.ZipperAG.Examples.LET.Let_DataTypes_Boilerplate
import Language.Grammars.ZipperAG.Examples.LET.Let_Bidi
import Language.Grammars.ZipperAG

---- Synthesized Attributes ----
dclo :: Zipper RootA -> [String]
dclo ag = case (constructor ag) of
           "RootA"       -> dclo $ ag.$1
           "LetA"        -> dclo $ ag.$1
           "ConsAssignA" -> dclo $ ag.$3
           "EmptyListA"  -> dcli ag

errs :: Zipper RootA -> [String]
errs ag = case (constructor ag) of
           "RootA"       -> errs $ ag.$1
           "LetA"        -> (errs $ ag.$1) ++ (errs $ ag.$2)
           "InA"         -> (errs $ ag.$1)
           "ConsAssignA" -> mNBIn (lexeme_ConsAssignA ag) (dcli ag) ++ (errs $ ag.$2) ++ (errs $ ag.$3)
           "EmptyListA"  -> []
           "Plus"        -> (errs $ ag.$1) ++ (errs $ ag.$2)
           "Divide"      -> (errs $ ag.$1) ++ (errs $ ag.$2)
           "Minus"       -> (errs $ ag.$1) ++ (errs $ ag.$2)
           "Time"        -> (errs $ ag.$1) ++ (errs $ ag.$2)
           "Variable"    -> mBIn (lexeme_Variable ag) (env ag)
           "Constant"    -> []

---- Inheritted Attributes ----
dcli :: Zipper RootA -> [String]
dcli ag = case (constructor ag) of
           "RootA" -> []
           _       -> case (constructor $ parent ag) of
                             "ConsAssignA" -> (dcli $ parent ag) ++ [lexeme_ConsAssignA $ parent ag]
                             _             -> dcli $ parent ag

env :: Zipper RootA -> [String]
env ag = case (constructor ag) of
           "RootA"       -> dclo ag
           _             -> env $ parent ag

{- Environment lookup functions -}
mBIn :: String -> [String] -> [String]
mBIn name [] = [name]
mBIn name (n:es) = if (n==name) then [] else mBIn name es

mNBIn :: String -> [String] -> [String]
mNBIn tuple [] = [] 
mNBIn a1 (a2:es) = if (a1==a2) then [a1] else mNBIn a1 es

test_scope_no_block_rules p = errs $ toZipper (getRootC_RootA $ toZipper p)