packages feed

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

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

module Language.Oberon0.L2.SemT1 (module Language.Oberon0.L2.SemT1, module Language.Oberon0.L1.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.L2.Decl

import qualified Language.Oberon0.L1.SemT1 as L1
import Language.Oberon0.L1.SemT1 (spp,sppl,sidl)




selfTo     = syn self $ do  return $ To
selfDownto = syn self $ do  return $ Downto


---- T1(L2) Pretty-Printing


sppNT =  nt_ForDir .*. nt_Label .*. nt_LabelL .*. L1.sppNT



sppTo     = syn spp $ do  return $ pp "TO"
sppDownto = syn spp $ do  return $ pp "DOWNTO"


sppLabelL_Cons = synmodM spp $ do  hd  <- at ch_hd_LabelL_Cons
	       	      	           tl  <- at ch_tl_LabelL_Cons
                                   let pptl = tl # spp
                                   return $ hd # spp >|< (if show pptl == ":" then empty else pp ",") >#< pptl

sppLabelL_Nil  = synmodM spp $ do  return $ pp ":"

sppExpreLbl    = synmodM spp $ do  exp <- at ch_exp_ExpreLbl
                                   return $ exp # spp

sppRangeLbl    = synmodM spp $ do  e1 <- at ch_e1_RangeLbl
                                   e2 <- at ch_e2_RangeLbl
                                   return $ e1 # spp >#< ".." >#< e2 # spp



-- sppl

spplNT =  nt_CaseL .*. nt_Case .*.  L1.spplNT

spplForStmt = synmodM sppl $ do id    <- at ch_id_ForStmt
                                start <- at ch_start_ForStmt
                                dir   <- at ch_dir_ForStmt
                                stop  <- at ch_stop_ForStmt
                                step  <- at ch_step_ForStmt
                                ss    <- at ch_ss_ForStmt
                                return $ [ "FOR" >#< value id >#< ":=" >#< 
                                           start # spp  >#<  dir # spp >#<  stop # spp >#< 
                                           "BY" >#< step # spp >#<  pp_block " DO " " END " ";" (ss # sppl)  ]


spplCaseStmt = synmodM sppl $ do exp   <- at ch_exp_CaseStmt
                                 c     <- at ch_case_CaseStmt
                                 cs    <- at ch_cases_CaseStmt
                                 e     <- at ch_else_CaseStmt
	     	                 let ppels = case (e # sppl) of
		              			[]  -> empty
		              			pps -> pp_block " ELSE " "" ";" pps
       
                                 return $ [ "CASE" >#< exp # spp >#< "OF" >-< 
                                            pp_block "" "" "|" (c # sppl ++ cs # sppl) >-<
                                            ppels >-< "END" ]

spplCase     = synmodM sppl $ do ls    <- at ch_label_Case
                                 ss    <- at ch_ss_Case
                                 return $ [ ls # spp >#< pp_block "" "" ";" (ss # sppl) ]



sppVarDecl'  = synmodM spp  $ do idl <- at ch_idl_VarDecl
                                 typ <- at ch_typ_VarDecl
                                 let ppidl = (map pp . filter (/= value caseVar)) (idl # sidl) 
                                 return $ case ppidl of
                                           []    -> empty
                                           _     -> pp_block "" "" ", " ppidl >#< ":" >#< typ # spp >|< ";"


{-
sidlIdentL_Cons'    
          = synmodM sidl $ do h <- at ch_hd_IdentL_Cons
                              t <- at ch_tl_IdentL_Cons
                              return $  if h == caseVar
                                          then (t # sidl)  
                                          else (value h) : (t # sidl)  
-}

---- Aspects

aspForStmt     _macroForStmt    = spplForStmt `ext` _macroForStmt 
aspTo                           = sppTo `ext` selfTo
aspDownto                       = sppDownto `ext` selfDownto

aspCaseStmt    _macroCaseStmt   = spplCaseStmt `ext` _macroCaseStmt    
aspCaseL_Cons  _macroCaseL_Cons = _macroCaseL_Cons 
aspCaseL_Nil   _macroCaseL_Nil  = _macroCaseL_Nil
aspCase        _macroCase       = spplCase `ext`     _macroCase 

aspLabelL_Cons  _macroLabelL_Cons = sppLabelL_Cons `ext` _macroLabelL_Cons 
aspLabelL_Nil   _macroLabelL_Nil  = sppLabelL_Nil  `ext` _macroLabelL_Nil

aspExpreLbl    _macroExpreLbl   = sppExpreLbl `ext`  _macroExpreLbl

aspRangeLbl    _macroRangeLbl   = sppRangeLbl `ext`  _macroRangeLbl



aspCst1Exp     _macroCst1Exp    = _macroCst1Exp




---- Semantic Functions

l2t1 = mkL2'   aspCase aspCaseL_Cons aspCaseL_Nil  
               aspCaseStmt aspCst1Exp aspDownto aspExpreLbl
               aspForStmt aspLabelL_Cons aspLabelL_Nil aspRangeLbl aspTo 
       
               L1.aspAssigStmt L1.aspBoolBOpExp L1.aspBoolExp L1.aspCondStmt L1.aspCondStmtL_Cons L1.aspCondStmtL_Nil
               L1.aspIfStmt L1.aspIdExp L1.aspIntBOpExp L1.aspIntCmpExp L1.aspIntExp L1.aspSeqStmt L1.aspWhileStmt

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

l1t1 = 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