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"]