packages feed

oberon0-0.0.1: src/Language/Oberon0/L4/SemT2.hs

{-# OPTIONS -fcontext-stack=100 #-}
{-# LANGUAGE EmptyDataDecls, NoMonomorphismRestriction, ScopedTypeVariables #-}

module Language.Oberon0.L4.SemT2 (module Language.Oberon0.L4.SemT2, module Language.Oberon0.L3.SemT2) where

import Language.Grammars.AspectAG
import Language.Grammars.AspectAG.Derive
import Language.Grammars.Grammar (DTerm(..),Pos(..))

import Data.HList.Label4
import Data.HList.TypeEqGeneric1
import Data.HList.TypeCastGeneric1

import qualified Data.Map as Map


import Language.Oberon0.L4.Decl

import qualified Language.Oberon0.L4.SemT1 as T1


import qualified Language.Oberon0.L3.SemT2 as L3
import Language.Oberon0.L3.SemT2 (l1t2,l2t2,l3t2,spp,sppl,sidl,senv,ienv,serr,spos,SymbolInfo(..),NameDef(..),NInfo,checkName)


---- T2 (L4) Name binding


-- spos

sposRecordType = syn spos $ do  return $ Pos 0 0 --TODO?


sposArrayType  = syn spos $ do  return $ Pos 0 0 --TODO?



-- senv

senvNT = nt_Field  .*. nt_FieldL .*. L3.senvNT

senvRule (_ :: a) = use senv senvNT Map.union (Map.empty :: Map.Map String (NInfo a)) 



-- ienv

ienvNT = nt_Select  .*. nt_SelectL .*. nt_Field  .*. nt_FieldL .*. L3.ienvNT

ienvRule _ = copy ienv ienvNT

ienvIni  = L3.ienvIni

ienvRecordType r = inh ienv ienvNT $ do lhs    <- at lhs
                                        fields <- at ch_fields_RecordType

                                        return $ ch_fields_RecordType  .=. Map.union (fields # senv) (lhs # ienv) .*.
                                                 emptyRecord 

-- serr

serrNT = nt_Select  .*. nt_SelectL .*. nt_Field  .*. nt_FieldL .*. L3.serrNT


serrRule = use serr serrNT (++) ([] :: [String]) 

serrSelExp       = syn serr $ do id   <- at ch_id_SelExp
                                 lhs <- at lhs
                                 return $  checkName id (lhs # ienv) ["Var"] "an expression"


serrAssigSelStmt = syn serr $ do id   <- at ch_id_AssigSelStmt 
                                 exp  <- at ch_exp_AssigSelStmt
                                 lhs  <- at lhs 
                                 return $  checkName id (lhs # ienv) ["Var"] "an assignment" ++ exp # serr 




---- Aspects

aspArrayType                r = sposArrayType  `ext` (ienvRule r)       `ext` serrRule `ext`  T1.aspArrayType

aspRecordType               r = sposRecordType `ext` (ienvRecordType r) `ext` serrRule `ext`  T1.aspRecordType

aspFieldL_Cons              r = (senvRule r) `ext` (ienvRule r) `ext` serrRule `ext`  T1.aspFieldL_Cons 
aspFieldL_Nil               r = (senvRule r) `ext` (ienvRule r) `ext` serrRule `ext`  T1.aspFieldL_Nil 

aspField                    r = (senvRule r) `ext` (ienvRule r) `ext` serrRule `ext`  T1.aspField
aspEmptyField               r = (senvRule r) `ext` (ienvRule  r) `ext` serrRule `ext`  T1.aspEmptyField

aspSelExp                   r = (ienvRule r) `ext` serrSelExp `ext`  T1.aspSelExp

aspSelectL_Cons             r = (ienvRule r) `ext` serrRule `ext`  T1.aspSelectL_Cons
aspSelectL_Nil              r = (ienvRule r) `ext` serrRule `ext`  T1.aspSelectL_Nil

aspSelField                 r = (ienvRule r) `ext` serrRule `ext`  T1.aspSelField
aspSelArray                 r = (ienvRule r) `ext` serrRule `ext`  T1.aspSelArray


aspAssigSelStmt             r = (ienvRule r) `ext` serrAssigSelStmt `ext`  T1.aspAssigSelStmt

---- Semantic Functions

l4t2 = mkL4  (aspArrayType ()) (aspAssigSelStmt ()) (aspEmptyField ()) (aspField ()) (aspFieldL_Cons ()) (aspFieldL_Nil ())
             (aspRecordType ()) (aspSelArray ()) (aspSelExp ()) (aspSelField ()) (aspSelectL_Cons ()) (aspSelectL_Nil ())