packages feed

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

{-# LANGUAGE TemplateHaskell, EmptyDataDecls #-}

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

import Language.Oberon0.L3.Decl

import Language.Grammars.AspectAG
import Language.Grammars.AspectAG.Derive


---- L4 Grammar

-- Procedure

data EXT_Type  = ArrayType  { exp_ArrayType :: Expression, typ_ArrayType :: Type }
               | RecordType { fields_RecordType :: FieldL }

type FieldL = [Field]


data Field  = Field { idl_Field  :: IdentL, typ_Field  :: Type }
            | EmptyField



$(extendAG ''EXT_Type [''Expression,''IdentL, ''Type])


data EXT2_Expression = SelExp { id_SelExp :: String, sel_SelExp :: SelectL }

type SelectL = [Select]


data Select  = SelField { id_SelField  :: String }
             | SelArray { exp_SelArray :: Expression }


$(extendAG ''EXT2_Expression [''Expression])


data EXT3_Statement 
  = AssigSelStmt { id_AssigSelStmt :: String, sel_AssigSelStmt :: SelectL, exp_AssigSelStmt :: Expression }

$(extendAG ''EXT3_Statement [''SelectL,''Expression])

$(deriveLang "L4" [''EXT_Type, ''FieldL, ''Field, ''EXT2_Expression, ''SelectL, ''Select, ''EXT3_Statement])