packages feed

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

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

module Language.Oberon0.L4.SemT5 (module Language.Oberon0.L4.SemT5, module Language.Oberon0.L3.SemT5) 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 Language.C


import Language.Oberon0.L4.Decl

import qualified Language.Oberon0.L4.SemT3 as T3

import qualified Language.Oberon0.L1.SemT5 as L1

import qualified Language.Oberon0.L3.SemT5 as L3
import Language.Oberon0.L3.SemT5 (l2t5
                ,spp,sidl,senv,ienv,serr,spos,sty,sterr,SymbolInfo(..),NameDef(..),TInfo(..),baseType,intType,boolType,unkType,findType
                ,scgen,scdec,scdecl,scty,scexp,scstmt,ipre,mapIdent,updMap,compStmt)


---- T5 (L4) Code Generation

-- ipre

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

ipreRule = copy ipre ipreNT


-- senv

senvNT = T3.senvNT

-- ienv

ienvNT =  T3.ienvNT

ienvIni = L3.ienvIni


ienvRule _ = copy ienv ienvNT

-- scsel

$(attLabels ["scsel"])

scselNT =   nt_Select .*. nt_SelectL .*. hNil

scselSelField  = syn scsel $ do  ids  <- at ch_id_SelField
                                 return $ \exp -> CMember exp (internalIdent $ value ids) False undefNode 


scselSelArray  = syn scsel $ do  ind  <- at ch_exp_SelArray
                                 return $ \exp -> CIndex exp (ind # scexp) undefNode 


scselSelectL_Cons = syn scsel $ do  h <- at ch_hd_SelectL_Cons
                                    t <- at ch_tl_SelectL_Cons
                                    return $ (t # scsel) . (h # scsel)
scselSelectL_Nil  = syn scsel $ do  return $ id

-- scexp

scexpNT = L3.scexpNT

scexpSelExp = syn scexp $ do  lhs  <- at lhs
                              id   <- at ch_id_SelExp
                              sel  <- at ch_sel_SelExp
                              return $ (sel # scsel) (CVar (mapIdent (value id) (lhs # ienv)) undefNode)


-- scstmt

scstmtNT = L3.scstmtNT

scstmtAssigSelStmt = syn scstmt $ do  lhs  <- at lhs
                                      id   <- at ch_id_AssigSelStmt
                                      sel  <- at ch_sel_AssigSelStmt
                                      exp  <- at ch_exp_AssigSelStmt
                                      let rhs = (sel # scsel) (CVar (mapIdent (value id) (lhs # ienv)) undefNode)
 
                                      return $ CExpr (Just $ CAssign CAssignOp rhs (exp # scexp) undefNode) undefNode

-- scdec

scdecNT = nt_Field .*. nt_FieldL .*. L3.scdecNT

scdecRule = use scdec scdecNT (++) ([] :: [CDeclaration NodeInfo]) 


scdecField = syn scdec $ do idl  <- at ch_idl_Field
                            typ  <- at ch_typ_Field
                            let (tys,tyd) = typ # scty
                            return $ map (\name -> ( CDecl  [ tys ] 
                                                            [(Just (CDeclr (Just $ internalIdent name) tyd Nothing [] undefNode),Nothing,Nothing)] 
                                                            undefNode)) 
                                         (idl # sidl)


-- scty

sctyArrayType  = syn scty $ do exp  <- at ch_exp_ArrayType
                               typ  <- at ch_typ_ArrayType
                               let (tys,tyd) = typ # scty
                               return $ (tys, tyd ++ [CArrDeclr [] (CArrSize False (exp # scexp)) undefNode] ) 

sctyRecordType = syn scty $ do fields  <- at ch_fields_RecordType
                               return $ (CTypeSpec (CSUType (CStruct CStructTag Nothing (Just (fields # scdec)) [] undefNode) undefNode) , [])




---- Aspects
pMap :: a -> SymbolInfo String a
pMap _ = undefined

aspArrayType                r = ipreRule `ext` (ienvRule r) `ext` sctyArrayType  `ext` (T3.aspArrayType (pMap r))

aspRecordType               r = ipreRule `ext` (ienvRule r) `ext` sctyRecordType `ext` (T3.aspRecordType (pMap r))

aspFieldL_Cons              r = ipreRule `ext` (ienvRule r) `ext` scdecRule  `ext`  (T3.aspFieldL_Cons (pMap r)) 
aspFieldL_Nil               r = ipreRule `ext` (ienvRule r) `ext` scdecRule  `ext`  (T3.aspFieldL_Nil (pMap r)) 

aspField                    r = ipreRule `ext` (ienvRule r) `ext` scdecField `ext`  (T3.aspField (pMap r))
aspEmptyField               r = ipreRule `ext` (ienvRule r) `ext` scdecRule  `ext`  (T3.aspEmptyField (pMap r))

aspSelExp                   r = ipreRule `ext` (ienvRule r) `ext` scexpSelExp `ext` (T3.aspSelExp (pMap r))

aspSelectL_Cons             r = ipreRule `ext` (ienvRule r) `ext` scselSelectL_Cons `ext` (T3.aspSelectL_Cons (pMap r))
aspSelectL_Nil              r = ipreRule `ext` (ienvRule r) `ext` scselSelectL_Nil  `ext` (T3.aspSelectL_Nil (pMap r))

aspSelField                 r = ipreRule `ext` (ienvRule r) `ext` scselSelField `ext` (T3.aspSelField (pMap r))
aspSelArray                 r = ipreRule `ext` (ienvRule r) `ext` scselSelArray `ext` (T3.aspSelArray (pMap r))


aspAssigSelStmt             r = ipreRule `ext` (ienvRule r) `ext` scstmtAssigSelStmt `ext`  (T3.aspAssigSelStmt (pMap r))


---- Semantic Functions
mkL1''' = T3.mkL1'''
mkL3' = T3.mkL3'

l1t5 = mkL1''' (L1.aspAssigStmt ()) (L1.aspBoolBOpExp ()) (L1.aspBoolExp ()) (L1.aspBoolUOpExp ()) (L1.aspCondStmt ()) (L1.aspCondStmtL_Cons ()) 
               (L1.aspCondStmtL_Nil ()) (L1.aspCstDecl ()) (L1.aspDeclL_Cons ()) (L1.aspDeclL_Nil ()) (L1.aspDecls ()) (L1.aspEmptyStmt ()) 
               (L1.aspIdExp ()) (L1.aspIdentL_Cons ()) (L1.aspIdentL_Nil ()) (L1.aspIfStmt ()) (L1.aspIntBOpExp ()) (L1.aspIntCmpExp ()) (L1.aspIntExp ()) 
               (L1.aspIntUOpExp ()) (L1.aspMaybeElseStmt_Just ()) (L1.aspMaybeElseStmt_Nothing ()) (L1.aspModule ()) (L1.aspParExp ()) 
               (L1.aspSeqStmt ()) (L1.aspTypDecl ()) (L1.aspType ()) (L1.aspVarDecl ()) (L1.aspWhileStmt ()) 

l3t5 = mkL3' (L3.aspExtDeclarations ()) (L3.aspProcDecl ()) (L3.aspParamL_Cons ()) (L3.aspParamL_Nil ()) (L3.aspParam ())     
             (L3.aspProcCStmt ()) (L3.aspExpressionL_Cons ()) (L3.aspExpressionL_Nil ())
             (L1.aspEmptyStmt ()) (L1.aspDeclL_Cons ()) (L1.aspDeclL_Nil ())

mkL4' = T3.mkL4'

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