SyntaxMacros 0.1 → 0.2
raw patch · 15 files changed
+412/−362 lines, 15 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Language.Grammars.Grammar: Lit :: (a env) -> Lit a env
- Language.Grammars.Grammar: data Lit a env
- Language.Grammars.Grammar: ext :: Env Productions env def' -> [Prod a env] -> Env Productions env (def', a)
- Language.Grammars.SyntaxMacros: instance [overlap ok] GetNT nt (NTCons nt v l env) (Symbol v env)
+ Language.Grammars.Grammar: (<.>) :: (ProdSeq a b c d) => a env -> b env -> PreProd c d env
+ Language.Grammars.Grammar: (<=>) :: a -> b env -> EP a b env
+ Language.Grammars.Grammar: EP :: a -> (b env) -> EP a b env
+ Language.Grammars.Grammar: PreProd :: (a -> (Prod b env)) -> PreProd a b env
+ Language.Grammars.Grammar: class ProdSeq a b c d | a c -> b d
+ Language.Grammars.Grammar: data EP a b env
+ Language.Grammars.Grammar: data PreProd a b env
+ Language.Grammars.Grammar: data TAttT
+ Language.Grammars.Grammar: data TNonT
+ Language.Grammars.Grammar: data TTerm
+ Language.Grammars.Grammar: getRefNT :: Symbol a TNonT env -> Ref a env
+ Language.Grammars.Grammar: instance (HExtend (LVPair t (Record HNil -> v)) l l') => ProdSeq (EP t (Symbol b TAttT)) (PreProd (l -> v -> t2) (b -> a)) (l' -> t2) a
+ Language.Grammars.Grammar: instance (HExtend (LVPair t v) l l') => ProdSeq (EP t (Symbol b TNonT)) (PreProd (l -> v -> t2) (b -> a)) (l' -> t2) a
+ Language.Grammars.Grammar: instance ProdSeq (Symbol DTerm TTerm) (PreProd (t1 -> DTerm -> t2) (DTerm -> a)) (t1 -> t2) a
+ Language.Grammars.Grammar: pairEq :: Maybe (Equal a b) -> Maybe (Equal (a, t) (b, t))
+ Language.Grammars.Grammar: prd :: (a -> b) -> PreProd (a -> b) t t1 -> Prod t t1
+ Language.Grammars.Grammar: prdEnd :: PreProd (Record HNil -> b) b env
+ Language.Grammars.Grammar: prdId :: Symbol a TNonT env -> Prod a env
+ Language.Grammars.SyntaxMacros: instance [overlap ok] GetNT nt (NTCons nt v l env) (Symbol v TNonT env)
+ Language.Grammars.SyntaxMacros: ntNil :: NTNil env
+ Language.Grammars.SyntaxMacros: pTerm :: (IsParser p Token) => String -> p DTerm
- Language.Grammars.Grammar: Nont :: Ref a env -> Symbol a env
+ Language.Grammars.Grammar: Nont :: Ref a env -> Symbol a TNonT env
- Language.Grammars.Grammar: NontChar :: Symbol Char env
+ Language.Grammars.Grammar: NontChar :: Symbol Char TAttT env
- Language.Grammars.Grammar: NontConid :: Symbol String env
+ Language.Grammars.Grammar: NontConid :: Symbol String TAttT env
- Language.Grammars.Grammar: NontInt :: Symbol Int env
+ Language.Grammars.Grammar: NontInt :: Symbol Int TAttT env
- Language.Grammars.Grammar: NontOp :: Symbol String env
+ Language.Grammars.Grammar: NontOp :: Symbol String TAttT env
- Language.Grammars.Grammar: NontVarid :: Symbol String env
+ Language.Grammars.Grammar: NontVarid :: Symbol String TAttT env
- Language.Grammars.Grammar: Seq :: Symbol b env -> Prod (b -> a) env -> Prod a env
+ Language.Grammars.Grammar: Seq :: Symbol b t env -> Prod (b -> a) env -> Prod a env
- Language.Grammars.Grammar: Term :: String -> Symbol DTerm env
+ Language.Grammars.Grammar: Term :: String -> Symbol DTerm TTerm env
- Language.Grammars.Grammar: append :: (a -> b -> c) -> Prod a env -> Symbol b env -> Prod c env
+ Language.Grammars.Grammar: append :: (a -> b -> c) -> Prod a env -> Symbol b t env -> Prod c env
- Language.Grammars.Grammar: char :: Lit (Symbol Char) env
+ Language.Grammars.Grammar: char :: Symbol Char TAttT env
- Language.Grammars.Grammar: con :: Lit (Symbol String) env
+ Language.Grammars.Grammar: con :: Symbol String TAttT env
- Language.Grammars.Grammar: data Symbol a env
+ Language.Grammars.Grammar: data Symbol a t env
- Language.Grammars.Grammar: int :: Lit (Symbol Int) env
+ Language.Grammars.Grammar: int :: Symbol Int TAttT env
- Language.Grammars.Grammar: matchSym :: Symbol a env -> Symbol b env -> Maybe (Equal a b)
+ Language.Grammars.Grammar: matchSym :: Symbol a t1 env -> Symbol b t2 env -> Maybe (Equal (a, t1) (b, t2))
- Language.Grammars.Grammar: op :: Lit (Symbol String) env
+ Language.Grammars.Grammar: op :: Symbol String TAttT env
- Language.Grammars.Grammar: var :: Lit (Symbol String) env
+ Language.Grammars.Grammar: var :: Symbol String TAttT env
- Language.Grammars.SyntaxMacros: (^=) :: nt -> (Symbol a env) -> NTField nt a env
+ Language.Grammars.SyntaxMacros: (^=) :: nt -> (Symbol a TNonT env) -> NTField nt a env
- Language.Grammars.SyntaxMacros: Export :: (Symbol start env) -> (nts env) -> Export start nts env
+ Language.Grammars.SyntaxMacros: Export :: (Symbol start TNonT env) -> (nts env) -> Export start nts env
- Language.Grammars.SyntaxMacros: NTField :: (Symbol a env) -> NTField nt a env
+ Language.Grammars.SyntaxMacros: NTField :: (Symbol a TNonT env) -> NTField nt a env
- Language.Grammars.SyntaxMacros: addNT :: GramTrafo env [Prod a env] (Symbol a env)
+ Language.Grammars.SyntaxMacros: addNT :: GramTrafo env [Prod a env] (Symbol a TNonT env)
- Language.Grammars.SyntaxMacros: addProds :: GramTrafo env (Symbol a env, [Prod a env]) ()
+ Language.Grammars.SyntaxMacros: addProds :: GramTrafo env (Symbol a TNonT env, [Prod a env]) ()
- Language.Grammars.SyntaxMacros: symbolNTField :: NTField nt a env -> (Symbol a env)
+ Language.Grammars.SyntaxMacros: symbolNTField :: NTField nt a env -> (Symbol a TNonT env)
Files
- SyntaxMacros.cabal +1/−1
- examples/Expr.hs +0/−189
- examples/LangDef.hs +48/−0
- examples/LangExt.hs +103/−0
- examples/LangSem.hs +101/−0
- examples/Main.hs +6/−75
- examples/README.txt +9/−0
- examples/Utils.hs +33/−0
- examples/test +5/−0
- pru.hs +11/−0
- src/Language/Grammars/Grammar.hs +70/−75
- src/Language/Grammars/SyntaxMacros.hs +13/−10
- src/Language/Grammars/Transformations/GramTrafo.hs +4/−4
- src/Language/Grammars/Transformations/LeftCorner.hs +4/−4
- src/Language/Grammars/Transformations/LeftFact.hs +4/−4
SyntaxMacros.cabal view
@@ -1,5 +1,5 @@ name: SyntaxMacros -version: 0.1+version: 0.2 license: LGPL license-file: COPYRIGHT maintainer: Marcos Viera <mviera@fing.edu.uy>
− examples/Expr.hs
@@ -1,189 +0,0 @@-{-# LANGUAGE TemplateHaskell, EmptyDataDecls, NoMonomorphismRestriction - , GADTs #-}--module Expr where--import Language.Grammars.AspectAG-import Language.Grammars.AspectAG.Derive--import Data.HList.Label4-import Data.HList.TypeEqGeneric1-import Data.HList.TypeCastGeneric1--import Data.Maybe--import UU.Pretty--import Control.Monad --data AGItf = AGItf { expr :: T_Expr}- deriving Show--data T_Expr = Cst {cv :: Int}- | Var {vnm :: String}- | Mul {me1 :: T_Expr, me2 :: T_Expr}- | Add {ae1 :: T_Expr, ae2 :: T_Expr}- | Let {lnm :: String, val :: T_Expr, body :: T_Expr}- deriving Show------ syn att d f = syndef att (def d f)--- inh att nts d f = inhdef att nts (def d f)-syn = syndefM-inh = inhdefM--$(deriveAG ''AGItf)--exprNT = nt_T_Expr .*. hNil-allNT = nt_AGItf .*. exprNT- ---$(attLabels ["spp"])--sppAGItf = syn spp $ liftM (# spp) (at ch_expr)-sppCst = syn spp $ liftM pp (at ch_cv)-sppVar = syn spp $ liftM pp (at ch_vnm)-sppMul = syn spp $ do e1 <- at ch_me1 - e2 <- at ch_me2- return $ e1 # spp >|< " * " >|< e2 # spp -sppAdd = syn spp $ do e1 <- at ch_ae1 - e2 <- at ch_ae2- return $ e1 # spp >|< " + " >|< e2 # spp --sppLet = syn spp $ do lnm <- at ch_lnm- val <- at ch_val- body <- at ch_body- return $ "let " >|< pp lnm >|< " = " >|< val # spp >|< " in " >|< body # spp ---$(attLabels ["ienv","sval"])---ienvRule = copy ienv exprNT -ienvAGItf = inh ienv exprNT $ do return (ch_expr .=. ([] :: [(String,Int)]) .*. emptyRecord)-ienvCst = ienvRule-ienvVar = ienvRule-ienvMul = ienvRule-ienvAdd = ienvRule-ienvLet = inh ienv exprNT $ do lnm <- at ch_lnm- val <- at ch_val- lhs <- at lhs- return $ ch_val .=. lhs # ienv .*.- ch_body .=. (lnm, val # sval) : lhs # ienv .*. - emptyRecord---svalRule f = use sval allNT f (0::Int) -svalAGItf = svalRule ((*)::Int->Int->Int)-svalCst = syn sval $ liftM id (at ch_cv)-svalVar = syn sval $ do vnm <- at ch_vnm - lhs <- at lhs- return $ fromJust (lookup vnm (lhs # ienv)) -svalMul = svalRule ((*)::Int->Int->Int)-svalAdd = svalRule ((+)::Int->Int->Int)-svalLet = syn sval $ liftM (# sval) (at ch_body)---aspAGItf = sppAGItf `ext` ienvAGItf `ext` svalAGItf-aspCst = sppCst `ext` ienvCst `ext` svalCst -aspVar = sppVar `ext` ienvVar `ext` svalVar -aspMul = sppMul `ext` ienvMul `ext` svalMul -aspAdd = sppAdd `ext` ienvAdd `ext` svalAdd -aspLet = sppLet `ext` ienvLet `ext` svalLet--{--semAGItf e = knit aspAGItf (ch_expr .=. e .*. emptyRecord)--semCst e = knit aspCst (ch_cv .=. (\(Record HNil) -> e) .*. emptyRecord)--semVar e = knit aspVar (ch_vnm .=. (\(Record HNil) -> e) .*. emptyRecord)--semMul e1 e2 = knit aspMul (ch_me1 .=. e1 .*. ch_me2 .=. e2 .*. emptyRecord)--semAdd e1 e2 = knit aspAdd (ch_ae1 .=. e1 .*. ch_ae2 .=. e2 .*. emptyRecord)--semLet l e1 e2 = knit aspLet (ch_lnm .=. (\(Record HNil) -> l) .*. ch_val .=. e1 .*. ch_body .=. e2 .*. emptyRecord)--}--semAGItf r = knit aspAGItf r -semCst r = knit aspCst r-semVar r = knit aspVar r-semMul r = knit aspMul r-semAdd r = knit aspAdd r-semLet = knit aspLet ---- modifications--- syn att d f = syndef att (def d f)--- inh att nts d f = inhdef att nts (def d f)--- synmod att v (Fam ic sp) = Fam ic (sp .@. att .=. v)--- synM att v f = synmod att (def v f)-synM = synmodM-inhM = inhmodM--$(chLabel "se" ''T_Expr)--sppSq = synM spp $ do me1 <- at ch_me1 - return $ "square " >|< (me1 # spp) --semSq r = knit (sppSq `ext` aspMul) - (ch_me1 .=. (r # ch_se) .*. ch_me2 .=. (r # ch_se) .*. emptyRecord)--{--sppSq = synM spp $ do me1 <- at ch_me1 - return $ "square " >|< (me1 # spp) --semSq r = knit (sppSq `ext` aspMul) (ch_me2 .=. (r # ch_me1) .*. r)--}--$(chLabels ["pe1","pe2"] ''T_Expr)--sppPyth = synM spp $ do ae1 <- at ch_ae1- ae2 <- at ch_ae2 - return $ "pyth " >|< (ae1 # spp) >|< " "- >|< (ae2 # spp) -svalPyth = synM sval $ do ae1 <- at ch_ae1- ae2 <- at ch_ae2- return $ (\p1 p2 -> p1 * p1 + p2 * p2 )(ae1 # sval) (ae2 # sval) -semPyth r = knit (sppPyth `ext` svalPyth `ext` aspAdd) - (ch_ae1 .=. (r # ch_pe1) .*. ch_ae2 .=. (r # ch_pe2) .*. emptyRecord)------- identity stuff-$(chLabel "pe" ''T_Expr)-{--synId att = syn att $ liftM (# att) (at ch_id)-inhId att nts = inh att nts $ do lhs <- at lhs- return $ ch_id .=. (lhs # att) .*. emptyRecord--attsId = (synId spp) `ext`(inhId ienv exprNT) `ext`(synId sval)--}--sppPar = syn spp $ do pe <- at ch_pe- return $ "(" >|< pe # spp >|< ")" -svalPar = syn sval $ do liftM (# sval) (at ch_pe)-ienvPar = copy ienv exprNT-- -semPar = knit (sppPar `ext` ienvPar `ext` svalPar)---sppSubst = synM spp $ do lnm <- at ch_lnm- val <- at ch_val- body <- at ch_body- return $ (body # spp) >|< "[" >|< (pp lnm) >|< " | " >|< (val # spp) >|< "]" -{--ienvSubst = inhM ienv exprNT $ do lnm <- at ch_lnm- val <- at ch_val- lhs <- at lhs- return $ ch_val .=. (lhs # ienv) .*.- ch_body .=. ((lnm, val # sval) : (lhs # ienv)) .*. - emptyRecord--}-semSubst r = knit (sppSubst `ext` {-ienvSubst `ext`-} aspLet) r---
+ examples/LangDef.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE Arrows, DoRec, EmptyDataDecls, FlexibleContexts #-}++module LangDef where++import qualified Data.Set as Set++import Control.Arrow++import UU.Pretty++import Language.Grammars.SyntaxMacros+import Language.Grammars.Grammar++import Language.Grammars.SyntaxMacros.Scanner++import LangSem+import Utils+++prds = proc () -> do+ rec root <- addNT -< [ prd (`semAGItf` ()) $ ch_expr<=>exp <.> prdEnd ] ++ exp <- addNT -< [ prd semLet $ trm "let" <.> ch_lnm<=>var <.> trm "=" <.> ch_val<=>exp <.> + trm "in" <.> ch_body<=>exp <.> prdEnd + , prd semAdd $ ch_ae1<=>term <.> trm "+" <.> ch_ae2<=>exp <.> prdEnd+ , prdId term ]+ + term <- addNT -< [ prd semMul $ ch_me1<=>term <.> trm "*" <.> ch_me2<=>factor <.> prdEnd+ , prdId factor ]++ factor <- addNT -< [ prd semCst $ ch_cv<=>int <.> prdEnd + , prd semVar $ ch_vnm<=>var <.> prdEnd ]++ exportNTs -< Export root $ ntExp ^= exp ^| + ntTerm ^= term ^|+ ntFactor ^= factor ^| + ntNil ++++gramOpts :: ScanOpts+gramOpts+ = defaultScanOpts+ { scoKeywordsTxt = Set.fromList ["let", "in"]+ , scoSpecChars = Set.fromList "=+*"+ , scoDollarIdent = True+ }+
+ examples/LangExt.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE Arrows, DoRec, EmptyDataDecls, FlexibleContexts, TemplateHaskell, NoMonomorphismRestriction #-}++module LangExt where+++import Control.Arrow++import UU.Pretty++import Language.Grammars.AspectAG+import Language.Grammars.AspectAG.Derive++import Language.Grammars.SyntaxMacros+import Language.Grammars.Grammar+++import LangSem+import Utils++import Data.HList.Label4+import Data.HList.TypeEqGeneric1+import Data.HList.TypeCastGeneric1+++-- modifications of the semantics+synM = synmodM+inhM = inhmodM++$(chLabel "se" ''T_Expr)++sppSq = synM spp $ do me1 <- at ch_me1 + return $ "square " >|< (me1 # spp) ++semSq r = knit (sppSq `ext` aspMul) + (ch_me1 .=. (r # ch_se) .*. ch_me2 .=. (r # ch_se) .*. emptyRecord)+++$(chLabels ["pe1","pe2"] ''T_Expr)++sppPyth = synM spp $ do ae1 <- at ch_ae1+ ae2 <- at ch_ae2 + return $ "pyth " >|< (ae1 # spp) >|< " "+ >|< (ae2 # spp) ++svalPyth = synM sval $ do ae1 <- at ch_ae1+ ae2 <- at ch_ae2+ return $ (\p1 p2 -> p1 * p1 + p2 * p2 )(ae1 # sval) (ae2 # sval) ++semPyth r = knit (sppPyth `ext` svalPyth `ext` aspAdd) + (ch_ae1 .=. (r # ch_pe1) .*. ch_ae2 .=. (r # ch_pe2) .*. emptyRecord)+++++$(chLabel "pe" ''T_Expr)++sppPar = syn spp $ do pe <- at ch_pe+ return $ "(" >|< pe # spp >|< ")" +svalPar = syn sval $ do liftM (# sval) (at ch_pe)+ienvPar = copy ienv exprNT++ +semPar = knit (sppPar `ext` ienvPar `ext` svalPar)+++sppSubst = synM spp $ do lnm <- at ch_lnm+ val <- at ch_val+ body <- at ch_body+ return $ (body # spp) >|< "[" >|< (pp lnm) >|< " | " >|< (val # spp) >|< "]" ++semSubst r = knit (sppSubst `ext` aspLet) r++++--extended grammar (syntax macro) ++type AttExpr = Record (HCons (LVPair (Proxy Att_ienv) [(String,Int)]) HNil)+ -> Record (HCons (LVPair (Proxy Att_spp) PP_Doc)+ (HCons (LVPair (Proxy Att_sval) Int) HNil))+++prds' :: ( NTRecord (nts env) + , GetNT NTExp (nts env) (Symbol AttExpr TNonT env)+ , GetNT NTFactor (nts env) (Symbol AttExpr TNonT env)) + => SyntaxMacro env (Export start nts) (Export start nts)+prds' = proc (Export root nts) -> do+ let exp = getNT ntExp nts+ addProds -< (exp, [ prd semSq $ trm "square" <.> ch_se<=>exp <.> prdEnd+ , prd semPyth $ trm "pyth" <.> ch_pe1<=>exp <.> ch_pe2<=>exp <.> prdEnd+ , prd semSubst $ ch_body<=>exp <.> trm "[" <.> ch_lnm<=>var <.> + trm "|" <.> ch_val<=>exp <.> trm "]" <.> prdEnd ])+ ++ let factor = getNT ntFactor nts+ addProds -< (factor, [ prd semPar $ trm "(" <.> ch_pe<=>exp <.> trm ")" <.> prdEnd ])+ + exportNTs -< (Export root nts)++gramOpts' gramOpts = gramOpts `extKeywordsTxt` [ "square", "pyth" ] `extSpecChars` "()[|]"++++
+ examples/LangSem.hs view
@@ -0,0 +1,101 @@+{-# LANGUAGE TemplateHaskell, EmptyDataDecls, NoMonomorphismRestriction #-}++module LangSem where++import Language.Grammars.AspectAG+import Language.Grammars.AspectAG.Derive++import Data.HList.Label4+import Data.HList.TypeEqGeneric1+import Data.HList.TypeCastGeneric1++import Data.Maybe++import UU.Pretty++import Control.Monad ++data AGItf = AGItf { expr :: T_Expr}+ deriving Show++data T_Expr = Cst {cv :: Int}+ | Var {vnm :: String}+ | Mul {me1 :: T_Expr, me2 :: T_Expr}+ | Add {ae1 :: T_Expr, ae2 :: T_Expr}+ | Let {lnm :: String, val :: T_Expr, body :: T_Expr}+ deriving Show++++syn = syndefM+inh = inhdefM++$(deriveAG ''AGItf)++exprNT = nt_T_Expr .*. hNil+allNT = nt_AGItf .*. exprNT+ +++$(attLabels ["spp"])++sppAGItf = syn spp $ liftM (# spp) (at ch_expr)+sppCst = syn spp $ liftM pp (at ch_cv)+sppVar = syn spp $ liftM pp (at ch_vnm)+sppMul = syn spp $ do e1 <- at ch_me1 + e2 <- at ch_me2+ return $ e1 # spp >|< " * " >|< e2 # spp +sppAdd = syn spp $ do e1 <- at ch_ae1 + e2 <- at ch_ae2+ return $ e1 # spp >|< " + " >|< e2 # spp ++sppLet = syn spp $ do lnm <- at ch_lnm+ val <- at ch_val+ body <- at ch_body+ return $ "let " >|< pp lnm >|< " = " >|< val # spp >|< " in " >|< body # spp +++$(attLabels ["ienv","sval"])+++ienvRule = copy ienv exprNT +ienvAGItf = inh ienv exprNT $ do return (ch_expr .=. ([] :: [(String,Int)]) .*. emptyRecord)+ienvCst = ienvRule+ienvVar = ienvRule+ienvMul = ienvRule+ienvAdd = ienvRule+ienvLet = inh ienv exprNT $ do lnm <- at ch_lnm+ val <- at ch_val+ lhs <- at lhs+ return $ ch_val .=. lhs # ienv .*.+ ch_body .=. (lnm, val # sval) : lhs # ienv .*. + emptyRecord+++svalRule f = use sval allNT f (0::Int) +svalAGItf = svalRule ((*)::Int->Int->Int)+svalCst = syn sval $ liftM id (at ch_cv)+svalVar = syn sval $ do vnm <- at ch_vnm + lhs <- at lhs+ return $ fromJust (lookup vnm (lhs # ienv)) +svalMul = svalRule ((*)::Int->Int->Int)+svalAdd = svalRule ((+)::Int->Int->Int)+svalLet = syn sval $ liftM (# sval) (at ch_body)+++aspAGItf = sppAGItf `ext` ienvAGItf `ext` svalAGItf+aspCst = sppCst `ext` ienvCst `ext` svalCst +aspVar = sppVar `ext` ienvVar `ext` svalVar +aspMul = sppMul `ext` ienvMul `ext` svalMul +aspAdd = sppAdd `ext` ienvAdd `ext` svalAdd +aspLet = sppLet `ext` ienvLet `ext` svalLet+++semAGItf r = knit aspAGItf r +semCst r = knit aspCst r+semVar r = knit aspVar r+semMul r = knit aspMul r+semAdd r = knit aspAdd r+semLet = knit aspLet ++
examples/Main.hs view
@@ -1,69 +1,20 @@-{-# LANGUAGE Arrows, DoRec, EmptyDataDecls, FlexibleContexts #-}-- import qualified Data.Set as Set import Control.Arrow import UU.Pretty -import Expr-import Language.Grammars.AspectAG-import qualified Language.Grammars.AspectAG as AG+import LangDef+import LangSem+import LangExt -import Language.Grammars.SyntaxMacros-import Language.Grammars.Grammar +import Language.Grammars.SyntaxMacros import Language.Grammars.SyntaxMacros.Scanner --gramOpts :: ScanOpts-gramOpts- = defaultScanOpts- { scoKeywordsTxt = Set.fromList ["let", "in"]- , scoSpecChars = Set.fromList "=+*"- , scoDollarIdent = True- }---extKeywordsTxt :: ScanOpts -> [String] -> ScanOpts-extKeywordsTxt opts kws = opts { scoKeywordsTxt = scoKeywordsTxt opts `Set.union` Set.fromList kws }--extSpecChars :: ScanOpts -> [Char] -> ScanOpts-extSpecChars opts kws = opts { scoSpecChars = scoSpecChars opts `Set.union` Set.fromList kws }--data NTRoot-ntRoot = undefined :: NTRoot---data NTExp-ntExp = undefined :: NTExp--data NTTerm-ntTerm = undefined :: NTTerm--data NTFactor-ntFactor = undefined :: NTFactor+import Language.Grammars.AspectAG -prds = proc () -> do- rec root <- addNT -< [ prd $ (ch_expr,exp) <#> \e -> semAGItf e () ] -- exp <- addNT -< [ prd $ "let" .> (ch_lnm,var) -.> "=" .> (ch_val,exp) <.> "in" .> (ch_body,exp) <#> semLet- , prd $ (ch_ae1,term) <.> "+" .> (ch_ae2,exp) <#> semAdd- , prdId term ]- - term <- addNT -< [ prd $ (ch_me1,term) <.> "*" .> (ch_me2,factor) <#> semMul - , prdId factor ]-- factor <- addNT -< [ prd $ (ch_cv,int) -#> semCst- , prd $ (ch_vnm,var) -#> semVar ]-- exportNTs -< Export root $ ntExp ^= exp ^| - ntTerm ^= term ^|- ntFactor ^= factor ^| - ntNil - gram = closeGram prds test1 = do@@ -73,31 +24,11 @@ print $ res # sval -type AttExpr = Record (HCons (LVPair (Proxy Att_ienv) [(String,Int)]) HNil)- -> Record (HCons (LVPair (Proxy Att_spp) PP_Doc)- (HCons (LVPair (Proxy Att_sval) Int) HNil)) ---extended grammar (syntax macro) -prds' :: ( NTRecord (nts env) - , GetNT NTExp (nts env) (Symbol AttExpr env)- , GetNT NTFactor (nts env) (Symbol AttExpr env)) - => SyntaxMacro env (Export start nts) (Export start nts)-prds' = proc (Export root nts) -> do- let exp = getNT ntExp nts- addProds -< (exp, [ prd $ "square" .> (ch_se,exp) <#> semSq - , prd $ "pyth" .> (ch_pe1,exp) <.> (ch_pe2,exp) <#> semPyth- , prd $ (ch_body,exp) <.> "[" .> (ch_lnm,var) -.> "|" .> (ch_val,exp) <.> "]" #> semSubst ])- -- let factor = getNT ntFactor nts- addProds -< (factor, [ prd $ "(" .> (ch_pe,exp) <.> ")" #> semPar ])- - exportNTs -< (Export root nts)- gram' = closeGram (extendGram prds prds') test2 = do- tokens <- scanFile (gramOpts `extKeywordsTxt` [ "square", "pyth" ] `extSpecChars` "()[|]") "prog2.src"+ tokens <- scanFile (gramOpts' gramOpts) "prog2.src" case ( parse . compile ) gram' tokens of (Ok res) -> do print $ res # spp print $ res # sval
+ examples/README.txt view
@@ -0,0 +1,9 @@+Modules of the example:++- LangSem.hs semantic functions of the original language+- LangDef. hs definition of the grammar of the original language+- LangExt.hs extension (grammar + semantics) of the language+- Utils.hs some definitions shared by LangDef and LangExt+- prog.src program with the syntax of the original language+- prog2.src program with the extended syntax+- Main.hs creates and executes compilers of the original and extended languages
+ examples/Utils.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE EmptyDataDecls #-}++module Utils where++import qualified Data.Set as Set++import UU.Pretty++import Language.Grammars.SyntaxMacros+import Language.Grammars.Grammar++import Language.Grammars.SyntaxMacros.Scanner++extKeywordsTxt :: ScanOpts -> [String] -> ScanOpts+extKeywordsTxt opts kws = opts { scoKeywordsTxt = scoKeywordsTxt opts `Set.union` Set.fromList kws }++extSpecChars :: ScanOpts -> [Char] -> ScanOpts+extSpecChars opts kws = opts { scoSpecChars = scoSpecChars opts `Set.union` Set.fromList kws }++data NTRoot+ntRoot = undefined :: NTRoot++data NTExp+ntExp = undefined :: NTExp++data NTTerm+ntTerm = undefined :: NTTerm++data NTFactor+ntFactor = undefined :: NTFactor++trm = Term+
+ examples/test view
@@ -0,0 +1,5 @@+cd ..+runghc Setup.hs build+sudo runghc Setup.hs install+cd examples+ghci Main
+ pru.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}++class A a b | a -> b where+ fa :: a -> b+++instance A Bool Bool where+ fa b = b++instance A a a where+ fa a = a + 1
src/Language/Grammars/Grammar.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE ExistentialQuantification, GADTs #-}+{-# LANGUAGE ExistentialQuantification, GADTs, EmptyDataDecls, + MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts, UndecidableInstances #-} module Language.Grammars.Grammar where @@ -14,34 +15,39 @@ = PS {unPS :: [Prod a env]} data Prod a env where- Seq :: Symbol b env -> Prod (b -> a) env + Seq :: Symbol b t env -> Prod (b -> a) env -> Prod a env End :: a -> Prod a env data DTerm = DTerm -data Symbol a env where- Term :: String -> Symbol DTerm env+data TTerm+data TNonT+data TAttT - Nont :: Ref a env -> Symbol a env+data Symbol a t env where+ Term :: String -> Symbol DTerm TTerm env++ Nont :: Ref a env -> Symbol a TNonT env -- attributed terminals- NontInt :: Symbol Int env- NontChar :: Symbol Char env- NontVarid :: Symbol String env- NontConid :: Symbol String env- NontOp :: Symbol String env + NontInt :: Symbol Int TAttT env+ NontChar :: Symbol Char TAttT env+ NontVarid :: Symbol String TAttT env+ NontConid :: Symbol String TAttT env+ NontOp :: Symbol String TAttT env --- TODO: the rest of EnumValToken -infixl 5 `ext`-ext :: Env Productions env def' -> [Prod a env]- -> Env Productions env (def', a)-ext g = Ext g . PS +getRefNT :: Symbol a TNonT env -> Ref a env+getRefNT (Nont ref) = ref +pairEq :: Maybe (Equal a b) -> Maybe (Equal (a,t) (b,t))+pairEq (Just Eq) = Just Eq+pairEq Nothing = Nothing -matchSym :: Symbol a env -> Symbol b env - -> Maybe (Equal a b)-matchSym (Nont x) (Nont y) = match x y+matchSym :: Symbol a t1 env -> Symbol b t2 env + -> Maybe (Equal (a,t1) (b,t2))+matchSym (Nont x) (Nont y) = pairEq $ match x y matchSym (Term x) (Term y) | x == y = Just Eq matchSym NontInt NontInt = Just Eq matchSym NontVarid NontVarid = Just Eq@@ -50,86 +56,75 @@ matchSym _ _ = Nothing -append :: (a -> b -> c) -> Prod a env -> Symbol b env +append :: (a -> b -> c) -> Prod a env -> Symbol b t env -> Prod c env append g (End f ) s = Seq s (End (g f)) append g (Seq t ts ) s = Seq t (append (\b c d -> g (b d) c) ts s) -data Lit a env = Lit (a env)+int :: Symbol Int TAttT env+char :: Symbol Char TAttT env+var :: Symbol String TAttT env+con :: Symbol String TAttT env+op :: Symbol String TAttT env -int :: Lit (Symbol Int) env-char :: Lit (Symbol Char) env-var :: Lit (Symbol String) env-con :: Lit (Symbol String) env-op :: Lit (Symbol String) env+int = NontInt+char = NontChar+var = NontVarid+con = NontConid+op = NontOp -int = Lit NontInt-char = Lit NontChar-var = Lit NontVarid-con = Lit NontConid-op = Lit NontOp -infixr 6 -:--(-:-) = (,)+data EP a b env = EP a (b env)+infixr 6 <=> -infixr 5 <.>, -.>, .>, <#>, -#>, #>+(<=>) :: a -> b env -> EP a b env+(<=>) = EP -prd a = a ($)-prdId nt = Seq nt $ End id -((chn,s) <.> ps) f = Seq s $ ps f'- where f' sem r = \x -> f sem (chn .=. x .*. r) --(pn,Lit s) -.> pp = \r -> Seq s $ pp (f r)- where f r ff p = \x -> r ff (pn .=. (\(Record HNil) -> x) .*. p) --s .> pp = \r -> Seq (Term s) $ pp (f r)- where f r ff p = \DTerm -> r ff p -+infixr 5 <.> -((chn,s) <#> sem) f = Seq s (End $ f')- where f' = \x -> f sem - (chn .=. x .*. emptyRecord)+data PreProd a b env = PreProd (a -> (Prod b env)) -(pn,Lit s) -#> ff = \r -> Seq s (End $ f r)- where f r = \x -> r ff (pn .=. (\(Record HNil) -> x) .*. emptyRecord)+class ProdSeq a b c d | a c -> b d where+ (<.>) :: a env -> b env -> PreProd c d env -s #> ff = \r -> Seq (Term s) (End $ f r)- where f r = \DTerm -> r ff emptyRecord +instance (HExtend (LVPair t v) l l') => ProdSeq + (EP t (Symbol b TNonT))+ (PreProd (l -> v -> t2) (b -> a))+ (l' -> t2)+ a where -{---- DOESN'T WORK+ (EP chn s) <.> (PreProd ps) = PreProd $ + \f -> let f' r = \x -> f (chn .=. x .*. r) + in Seq s $ ps f' -class ProdSeq a b c v v' | a -> b, b -> c where- (<.>) :: (HExtend (LVPair t v) l l') =>- (t, a env)-> - ((t1 -> l -> v' -> t2) -> Prod b env)-> - (t1 -> l' -> t2)-> - Prod c env+instance (HExtend (LVPair t (Record HNil -> v)) l l') => ProdSeq+ (EP t (Symbol b TAttT))+ (PreProd (l -> v -> t2) (b -> a))+ (l' -> t2)+ a where -instance ProdSeq (Symbol b) (b->a) a v v where- (pn,s) <.> pp = \r -> Seq s $ pp (f r)- where f r ff p = \x -> r ff (pn .=. x .*. p) + (EP pn s) <.> (PreProd pp) = PreProd $ \r -> Seq s $ pp (f r)+ where f r p = \x -> r (pn .=. (\(Record HNil) -> x) .*. p) -instance ProdSeq (Lit (Symbol b)) (b->a) a (Record HNil -> v) v where- (pn,Lit s) <..> pp = \r -> Seq s $ pp (f r)- where f r ff p = \x -> r ff (pn .=. (\(Record HNil) -> x) .*. p) ---- WORKS+instance ProdSeq+ (Symbol DTerm TTerm)+ (PreProd (t1 -> DTerm -> t2) (DTerm -> a))+ (t1 -> t2)+ a where -class ProdEnd a b | a -> b where- (<#>) :: (t, a env) -> t1-> (t1 -> Record (HCons (LVPair t b) HNil) -> t2) -> Prod t2 env+ s <.> (PreProd pp) = PreProd $ \r -> Seq s $ pp (f r)+ where f r p = \DTerm -> r p -instance ProdEnd (Symbol v) v where- (pn,s) <#> ff = \r -> Seq s (End $ f r)- where f r = \x -> r ff (pn .=. x .*. emptyRecord)+prdEnd :: PreProd (Record HNil -> b) b env+prdEnd = PreProd $ \f -> End (f emptyRecord) -instance ProdEnd (Lit (Symbol v)) (Record HNil -> v) where- (pn,Lit s) <#> ff = \r -> Seq s (End $ f r)- where f r = \x -> r ff (pn .=. (\(Record HNil) -> x) .*. emptyRecord)--}+prd :: (a -> b) -> PreProd (a -> b) t t1 -> Prod t t1+prd sem (PreProd ps) = ps sem +prdId :: Symbol a TNonT env -> Prod a env+prdId nt = Seq nt $ End id
src/Language/Grammars/SyntaxMacros.hs view
@@ -7,7 +7,7 @@ import Language.AbstractSyntax.TTTAS import Control.Arrow -import UU.Parsing hiding (Symbol,parse,Ok)+import UU.Parsing.Interface hiding (Symbol,parse,Ok) import qualified UU.Parsing as UU import Language.Grammars.SyntaxMacros.Scanner @@ -21,10 +21,10 @@ type SyntaxMacro env nts nts' = GramTrafo env (nts env) (nts' env) -data Export start nts env = Export (Symbol start env) (nts env)+data Export start nts env = Export (Symbol start TNonT env) (nts env) -- add a new non-terminal to the grammar-addNT :: GramTrafo env [Prod a env] (Symbol a env)+addNT :: GramTrafo env [Prod a env] (Symbol a TNonT env) addNT = proc p -> do r <- newSRef -< PS p returnA -< Nont r@@ -32,11 +32,12 @@ -- add productions to an existing non-terminal addProds :: GramTrafo env - (Symbol a env, [Prod a env]) ()-addProds = proc (Nont nt, prds) -> do+ (Symbol a TNonT env, [Prod a env]) ()+addProds = proc (nt, prds) -> do updateFinalEnv -< - updateEnv (\(PS ps) -> PS $ prds ++ ps) nt+ updateEnv (\(PS ps) -> PS $ prds ++ ps) (getRefNT nt) + -- close the grammar closeGram :: (forall env. ExtGram env (Export a nts)) -> Grammar a @@ -57,7 +58,7 @@ -- extensible record -newtype NTField nt a env = NTField { symbolNTField :: (Symbol a env) } +newtype NTField nt a env = NTField { symbolNTField :: (Symbol a TNonT env) } labelNTField :: NTField nt a env -> nt labelNTField _ = undefined@@ -79,11 +80,11 @@ instance Fail (Duplicated nt) => NotDuplicated nt (NTCons nt v l env) -- using overlapping instance NotDuplicated nt1 (l env) => NotDuplicated nt1 (NTCons nt2 v l env) -+ntNil :: NTNil env ntNil = NTNil infixr 4 ^= -(^=) :: nt -> (Symbol a env) -> NTField nt a env+(^=) :: nt -> (Symbol a TNonT env) -> NTField nt a env (^=) _ = NTField @@ -99,7 +100,7 @@ instance Fail (NotFound nt) => GetNT nt (NTNil env) r where getNT = undefined-instance GetNT nt (NTCons nt v l env) (Symbol v env) where -- using overlapping+instance GetNT nt (NTCons nt v l env) (Symbol v TNonT env) where -- using overlapping getNT _ (NTCons f _) = symbolNTField f instance GetNT nt1 (l env) r => GetNT nt1 (NTCons nt2 v l env) r where getNT nt (NTCons _ l) = getNT nt l@@ -119,6 +120,8 @@ pVar = id <$> pVarid pOp = id <$> pVarsym +pTerm :: (UU.Parsing.Interface.IsParser p Token) + => String -> p DTerm pTerm t = const DTerm <$> (pKey t) newtype Const f a s = C {unC :: f a}
src/Language/Grammars/Transformations/GramTrafo.hs view
@@ -6,12 +6,12 @@ import Language.Grammars.Grammar newtype MapA_X env a env'- = MapA_X (forall x. Symbol x env -> Maybe (Ref (x -> a) env'))+ = MapA_X (forall x t. Symbol x t env -> Maybe (Ref (x -> a) env')) emptyMap :: MapA_X env a env' emptyMap = MapA_X (const Nothing) -extendMap :: Symbol x env -> MapA_X env a env'+extendMap :: Symbol x t env -> MapA_X env a env' -> MapA_X env a (env',x->a) extendMap x (MapA_X m) = MapA_X (\s -> case matchSym s x of@@ -30,8 +30,8 @@ TrafoE _ f -> TrafoE Unit f ) -newNontR :: forall x env s a - . Symbol x env +newNontR :: forall x t env s a + . Symbol x t env -> GramTrafo env a s (Productions (x->a) s) (Ref (x->a) s) newNontR x = Trafo $ \m -> extEnv (extendMap x m)
src/Language/Grammars/Transformations/LeftCorner.hs view
@@ -54,7 +54,7 @@ rule2 :: Env Productions env env - -> Symbol x env + -> Symbol x t env -> GramTrafo env a s (T env s, Ref (x -> a) s) (Productions a s) rule2 _ (Term a) @@ -83,7 +83,7 @@ do returnA -< PS [rule2a' NontOp a_x] -rule2a' :: Symbol a s-> Ref (a -> b) s -> Prod b s+rule2a' :: Symbol a t s -> Ref (a -> b) s -> Prod b s rule2a' s refA_a = Seq s $ Seq (Nont refA_a) $ End ($) @@ -102,9 +102,9 @@ (mapProd tenv_s beta) (Nont a_b)) -insert :: forall env s a x+insert :: forall x t env s a . Env Productions env env - -> Symbol x env+ -> Symbol x t env -> GramTrafo env a s (T env s, Prod (x->a) s) (Productions a s) insert gram x =
src/Language/Grammars/Transformations/LeftFact.hs view
@@ -11,7 +11,7 @@ --list of repeated symbols (with hidden type)-data AnySym env = forall x. AnySym (Symbol x env)+data AnySym env = forall x t. AnySym (Symbol x t env) newtype BT env s = BT (Bool, T env s) @@ -93,7 +93,7 @@ -- added, so we obtain the reference of the nonterminal and add the new -- production. -- Otherwise, we have to create the new nonterminal (newNontR x).-rinsert :: forall env s a x. Symbol x env+rinsert :: forall t env s a x. Symbol x t env -> GramTrafo env a s (T env s, Prod (x->a) s) (Productions a s) rinsert x = Trafo (@@ -115,7 +115,7 @@ ) -addprod :: Symbol x env -> GramTrafo env a s (T env s, Ref (x -> a) s) +addprod :: Symbol x t env -> GramTrafo env a s (T env s, Ref (x -> a) s) (Productions a s) addprod (Term x) = proc (_, a__x) -> do returnA -< PS [ Seq (Term x) $ Seq (Nont a__x) $ End ($)]@@ -150,7 +150,7 @@ aux (Just Eq) = False aux Nothing = True -iselem :: Symbol t env -> [AnySym env] -> Bool+iselem :: Symbol a t env -> [AnySym env] -> Bool iselem _ [] = False iselem x ((AnySym y):ys) = case (matchSym x y) of (Just Eq) -> True