packages feed

oberon0-0.0.1: src/Language/Oberon0/L3/SemT1.hs

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

module Language.Oberon0.L3.SemT1 (module Language.Oberon0.L3.SemT1, module Language.Oberon0.L2.SemT1) 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 UU.Pretty

import Language.Oberon0.L3.Decl

import Language.Oberon0.L1.SemT1 (aspEmptyStmt, aspDeclL_Cons, aspDeclL_Nil)

import qualified Language.Oberon0.L2.SemT1 as L2
import Language.Oberon0.L2.SemT1 (l1t1,l2t1,spp,sppl,sidl)





---- T1(L3) Pretty-Printing


sppNT =  nt_Param .*. L2.sppNT

sppExtDeclarations
          = syn spp $ do
                          decls    <- at ch_decls_ExtDeclarations
                          prcdecl  <- at ch_prcdecl_ExtDeclarations
                          return $  decls # spp >-< 
                                    vlist (prcdecl # sppl)



sppParam 
          = syn spp $ do
                          kind    <- at ch_kind_Param
                          idl     <- at ch_idl_Param
                          typ     <- at ch_typ_Param

                          return $ case (map pp (idl # sidl)) of
                                    []    -> empty
                                    ppidl -> show kind >#<  pp_block "" "" ", " ppidl >#< ":" >#< typ # spp 

sppProcDecl 
          = syn spp $ do
                          id      <- at ch_id_ProcDecl
                          params  <- at ch_params_ProcDecl
                          decls   <- at ch_decls_ProcDecl
                          stmts   <- at ch_stmts_ProcDecl
                          idend   <- at ch_idend_ProcDecl

                          return $ "PROCEDURE" >#< value id >#< pp_block "(" ")" ";" (params # sppl) >#< ";" >-< 
                                   decls # spp >-< pp_block " BEGIN " (" END " ++ value idend ++ ";") ";" (stmts # sppl)


-- sppl

spplNT = nt_ExpressionL .*. nt_ParamL .*. L2.spplNT

spplProcCStmt
          = syn sppl $ do  
                          id     <- at ch_id_ProcCStmt
                          params <- at ch_params_ProcCStmt
                          return $ [ value id >#<  pp_block "(" ")" "," (params # sppl) ]


spplParamL_Cons    
          = syn sppl $ do  hd  <- at ch_hd_ParamL_Cons
		    	   tl  <- at ch_tl_ParamL_Cons
                           return $ (hd # spp) : (tl # sppl)

spplParamL_Nil    
          = syn sppl $ do  return $ []


spplExpressionL_Cons    
          = syn sppl $ do  h <- at ch_hd_ExpressionL_Cons
                           t <- at ch_tl_ExpressionL_Cons
                           return $ (h # spp) : (t # sppl)
spplExpressionL_Nil    
          = syn sppl $ do  return $ ([] :: [PP_Doc]) 


---- Aspects

aspExtDeclarations          = sppExtDeclarations

aspProcDecl                 = sppProcDecl

aspParamL_Cons              = spplParamL_Cons 
aspParamL_Nil               = spplParamL_Nil 

aspParam                    = sppParam

aspProcCStmt                = spplProcCStmt

aspExpressionL_Cons         = spplExpressionL_Cons
aspExpressionL_Nil          = spplExpressionL_Nil

---- Semantic Functions



l3t1 = mkL3  aspExtDeclarations aspProcDecl aspParamL_Cons aspParamL_Nil aspParam     
             aspProcCStmt aspExpressionL_Cons aspExpressionL_Nil
             aspEmptyStmt aspDeclL_Cons aspDeclL_Nil