module Language.Grammars.ZipperAG.Examples.LET.Let_Scope where
import Data.Generics.Zipper
import Language.Grammars.ZipperAG
import Language.Grammars.ZipperAG.Examples.LET.Let_DataTypes_Boilerplate
dclo :: Zipper RootA -> [(String, Zipper RootA)]
dclo ag = case (constructor ag) of
"RootA" -> dclo $ ag.$1
"LetA" -> dclo $ ag.$1
"ConsLetA" -> dclo $ ag.$3
"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, ag) (dcli ag) ++ (errs $ ag.$2) ++ (errs $ ag.$3)
"ConsLetA" -> mNBIn (lexeme_ConsLetA ag, 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" -> []
dcli :: Zipper RootA -> [(String, Zipper RootA)]
dcli ag = case (constructor ag) of
"RootA" -> []
"LetA" -> case (constructor $ parent ag) of
"RootA" -> dcli $ parent ag
"ConsLetA" -> env $ parent ag
_ -> case (constructor $ parent ag) of
"ConsAssignA" -> (dcli $ parent ag) ++ [(lexeme_ConsAssignA $ parent ag, parent ag)]
"ConsLetA" -> (dcli $ parent ag) ++ [(lexeme_ConsLetA $ parent ag, parent ag)]
_ -> dcli $ parent ag
env :: Zipper RootA -> [(String, Zipper RootA)]
env ag = case (constructor ag) of
"RootA" -> dclo ag
"LetA" -> case (constructor $ parent ag) of
"ConsLetA" -> dclo ag
_ -> env $ parent ag
_ -> env $ parent ag
lev :: Zipper RootA -> Int
lev ag = case (constructor ag) of
"RootA" -> 0
"LetA" -> case (constructor $ parent ag) of
"ConsLetA" -> (lev $ parent ag) + 1
_ -> 0
_ -> lev $ parent ag
mBIn :: String -> [(String, Zipper RootA)] -> [String]
mBIn name [] = [name]
mBIn name ((n,l):es) = if (n==name) then [] else mBIn name es
mNBIn :: (String, Zipper RootA) -> [(String, Zipper RootA)] -> [String]
mNBIn tuple [] = []
mNBIn (a1,r1) ((a2,r2):es) = if (a1==a2) && (lev r1 == lev r2) then [a1] else mNBIn (a1,r1) es