packages feed

oberon0-0.0.2: src/Language/Oberon0/L3/Gram.hs

{-# OPTIONS -fcontext-stack=100 #-}

{-# LANGUAGE  Arrows, RecursiveDo #-}

module Language.Oberon0.L3.Gram (module Language.Oberon0.L3.Gram, module Language.Oberon0.L2.Gram) where

import Language.Oberon0.L2.Gram
import Language.Oberon0.L3.Decl

import Control.Arrow
import Control.Applicative
import Data.Set (union,fromList)

import Language.Grammars.Murder
import Language.Grammars.Grammar
import Language.Grammars.Grammar.AspectAG

import Language.Grammars.AspectAG

fpVar  sf = pParam sf (sem_Lit VarP)
fpVal  sf = pParam sf (sem_Lit ValP)

l3 sf = proc imported -> do
         let decls      = getNT cs_Declarations       imported 
         let statement  = getNT cs_Statement          imported 
         let ss         = getNT cs_StatementSequence  imported 
         let exp        = getNT cs_Expression         imported 
         let ident      = getNT cs_Ident              imported 
         let idl        = getNT cs_IdentL             imported 
         let typ        = getNT cs_Type               imported 


         rec  addProds   -<  (statement,     iI (pProcCStmt  sf) ident params Ii)

              params     <- addNT -<  iI  "(" paraml ")" Ii
                                  <|> iI (pExpressionL_Nil sf) Ii

              paraml     <- addNT -<  iI (pExpressionL_Cons sf) exp (pFoldr (pExpressionL_Cons sf, pExpressionL_Nil sf) (iI "," exp Ii)) Ii
                                  <|> iI (pExpressionL_Nil sf) Ii

              updProds   -<  (decls,  \declarations -> iI (pExtDeclarations sf) declarations procDeclL Ii)

              procDeclL  <- addNT -<  pFoldr (pDeclL_Cons' sf, pDeclL_Nil' sf) (iI procDecl Ii)

              procDecl   <- addNT -< iI (pProcDecl  sf)   "PROCEDURE" ident fparams ";"
                                                          decls 
                                                          (pMaybe (pEmptyStmt' sf, id) (iI "BEGIN" ss Ii)) 
                                                          "END" ident ";" Ii

              fparams    <- addNT -<  iI  "(" fparaml ")" Ii
                                  <|> iI (pParamL_Nil sf) Ii

              fparaml    <- addNT -<  iI (pParamL_Cons sf) fparam (pFoldr (pParamL_Cons sf, pParamL_Nil sf) (iI ";" fparam Ii)) Ii
                                  <|> iI (pParamL_Nil sf) Ii

              fparam     <- addNT -<  iI  (fpVar sf) "VAR" idl ":" typ Ii <|> iI (fpVal sf)  idl ":" typ Ii 

         exportNTs -< imported

l3Kws = union l2Kws $ fromList ["PROCEDURE"]