packages feed

SyntaxMacros 1.0 → 1.0.3

raw patch · 19 files changed

+558/−279 lines, 19 filesdep +ListLikedep +uu-parsinglibdep −haskell98PVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: ListLike, uu-parsinglib

Dependencies removed: haskell98

API changes (from Hackage documentation)

- Language.Grammars.Grammar: class ShowEnv a
- Language.Grammars.Grammar: instance Alternative (ListProd l env)
- Language.Grammars.Grammar: instance Applicative (ListProd l env)
- Language.Grammars.Grammar: instance Functor (ListProd l env)
- Language.Grammars.Grammar: instance Idiomatic l env f g => Idiomatic l env (a -> f) (ListProd l env a -> g)
- Language.Grammars.Grammar: instance Idiomatic l env x (Ii -> ListProd l env x)
- Language.Grammars.Grammar: instance Show (Grammar a)
- Language.Grammars.Grammar: instance Show (Prod l a env)
- Language.Grammars.Grammar: instance Show (Productions l a env)
- Language.Grammars.Grammar: instance Show (Ref a env)
- Language.Grammars.Grammar: instance Show (Symbol a t env)
- Language.Grammars.Grammar: instance ShowEnv (Env (Productions l) env env')
- Language.Grammars.Grammar: instance ShowEnv (Env (Productions l) env env') => Show (Env (Productions l) env env')
- Language.Grammars.Grammar: newtype ListProd l env a
- Language.Grammars.Grammar: prodToFL :: Prod l a env -> Prod (FL b) a env
- Language.Grammars.Grammar: showEnv :: ShowEnv a => Int -> a -> String
- Language.Grammars.Grammar: toFL :: ListProd l env a -> ListProd (FL b) env a
- Language.Grammars.Grammar: type DTerm = String
- Language.Grammars.SyntaxMacros: (<++>) :: (NTRecord (nts env), NTRecord (nts' env)) => ExtGram env start nts -> SyntaxMacro env start nts start' nts' -> ExtGram env start' nts'
- Language.Grammars.SyntaxMacros: C :: f a -> Const f a s
- Language.Grammars.SyntaxMacros: Ok :: a -> ParseResult a
- Language.Grammars.SyntaxMacros: Rep :: a -> [ParseMsg] -> ParseResult a
- Language.Grammars.SyntaxMacros: compile :: Grammar a -> Parser Token a
- Language.Grammars.SyntaxMacros: data ParseResult a
- Language.Grammars.SyntaxMacros: instance [overlap ok] Show a => Show (ParseResult a)
- Language.Grammars.SyntaxMacros: mapEnv :: (forall a. f a s -> g a s) -> Env f s env -> Env g s env
- Language.Grammars.SyntaxMacros: newtype Const f a s
- Language.Grammars.SyntaxMacros: pChr :: Parser Token Char
- Language.Grammars.SyntaxMacros: pCon :: Parser Token String
- Language.Grammars.SyntaxMacros: pInt :: Parser Token Int
- Language.Grammars.SyntaxMacros: pOp :: Parser Token String
- Language.Grammars.SyntaxMacros: pTerm :: IsParser p Token => String -> p DTerm
- Language.Grammars.SyntaxMacros: pVar :: Parser Token String
- Language.Grammars.SyntaxMacros: parse :: Parser Token a -> [Token] -> ParseResult a
- Language.Grammars.SyntaxMacros: rparse :: Parser Token a -> [Token] -> (a, [ParseMsg])
- Language.Grammars.SyntaxMacros: type ParseMsg = Message Token (Maybe Token)
- Language.Grammars.SyntaxMacros: unC :: Const f a s -> f a
- Language.Grammars.SyntaxMacros.Scanner: pCBrack :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCBrackPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pCCurly :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCCurlyPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pCParen :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCParenPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pChar :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCharPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pComma :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCommaPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pConid :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pConidPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pConsym :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pConsymPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pFraction :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pFractionPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pInteger10 :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pInteger10Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger16 :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pInteger16Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger8 :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pInteger8Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pIntegerPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pOBrack :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOBrackPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pOCurly :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOCurlyPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pOParen :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOParenPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pSemi :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pSemiPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pString :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pStringPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pTextln :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pTextlnPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pTextnm :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pTextnmPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pVarid :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pVaridPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pVarsym :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pVarsymPos :: IsParser p Token => p (String, Pos)
+ Language.Grammars.Grammar: DTerm :: Pos -> a -> DTerm a
+ Language.Grammars.Grammar: Pos :: !Line -> !Column -> Pos
+ Language.Grammars.Grammar: PosFile :: !Line -> !Column -> Filename -> Pos
+ Language.Grammars.Grammar: data DTerm a
+ Language.Grammars.Grammar: data NF
+ Language.Grammars.Grammar: data Pos
+ Language.Grammars.Grammar: instance Alternative (PreProductions l env)
+ Language.Grammars.Grammar: instance Applicative (PreProductions l env)
+ Language.Grammars.Grammar: instance Functor (PreProductions l env)
+ Language.Grammars.Grammar: instance Idiomatic l env f g => Idiomatic l env ((Record HNil -> a) -> f) (Symbol a TAttT env -> g)
+ Language.Grammars.Grammar: instance Idiomatic l env f g => Idiomatic l env (a -> f) (PreProductions l env a -> g)
+ Language.Grammars.Grammar: instance Idiomatic l env f g => Idiomatic l env (a -> f) (Symbol a TNonT env -> g)
+ Language.Grammars.Grammar: instance Idiomatic l env x (Ii -> PreProductions l env x)
+ Language.Grammars.Grammar: instance Show Pos
+ Language.Grammars.Grammar: newtype PreProductions l env a
+ Language.Grammars.Grammar: opt :: PreProductions l env a -> a -> PreProductions l env a
+ Language.Grammars.Grammar: pFoldr :: (a -> b -> b, b) -> PreProductions (FL b) env a -> PreProductions TL env b
+ Language.Grammars.Grammar: pMaybe :: (b, a -> b) -> PreProductions TL env a -> PreProductions TL env b
+ Language.Grammars.Grammar: pos :: DTerm a -> Pos
+ Language.Grammars.Grammar: type Column = Int
+ Language.Grammars.Grammar: type Filename = String
+ Language.Grammars.Grammar: type Line = Int
+ Language.Grammars.Grammar: type PreGramEnv = Env (Productions TL)
+ Language.Grammars.Grammar: value :: DTerm a -> a
+ Language.Grammars.SyntaxMacros: (+>>) :: (NTRecord (nts env), NTRecord (nts' env)) => ExtGram env start nts -> SyntaxMacro env start nts start' nts' -> ExtGram env start' nts'
+ Language.Grammars.SyntaxMacros: extendExport :: Export start t env -> (t env -> nts env) -> Export start nts env
+ Language.Grammars.SyntaxMacros: type PreGramTrafo = Trafo Unit (Productions TL)
+ Language.Grammars.SyntaxMacros.Scanner: pComma, pCCurly, pOCurly, pCBrack, pOBrack, pCParen, pOParen, pSemi :: IsParser p Token => p String
+ Language.Grammars.SyntaxMacros.Scanner: pCommaPos, pCCurlyPos, pOCurlyPos, pCBrackPos, pOBrackPos, pCParenPos, pOParenPos, pSemiPos :: IsParser p Token => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pString, pConsym, pVarsym, pInteger, pTextln, pTextnm, pConid, pVarid, pFraction, pInteger16, pInteger10, pInteger8, pChar :: IsParser p Token => p String
+ Language.Grammars.SyntaxMacros.Scanner: pStringPos, pConsymPos, pVarsymPos, pIntegerPos, pTextlnPos, pTextnmPos, pConidPos, pVaridPos, pFractionPos, pInteger16Pos, pInteger10Pos, pInteger8Pos, pCharPos :: IsParser p Token => p (String, Pos)
+ Language.Grammars.SyntaxMacros.UULib: C :: f a -> Const f a s
+ Language.Grammars.SyntaxMacros.UULib: Ok :: a -> ParseResult a
+ Language.Grammars.SyntaxMacros.UULib: Rep :: a -> [ParseMsg] -> ParseResult a
+ Language.Grammars.SyntaxMacros.UULib: compile :: Grammar a -> Parser Token a
+ Language.Grammars.SyntaxMacros.UULib: data ParseResult a
+ Language.Grammars.SyntaxMacros.UULib: instance Show a => Show (ParseResult a)
+ Language.Grammars.SyntaxMacros.UULib: mapEnv :: (forall a. f a s -> g a s) -> Env f s env -> Env g s env
+ Language.Grammars.SyntaxMacros.UULib: newtype Const f a s
+ Language.Grammars.SyntaxMacros.UULib: pChr :: Parser Token (DTerm Char)
+ Language.Grammars.SyntaxMacros.UULib: pCon :: Parser Token (DTerm String)
+ Language.Grammars.SyntaxMacros.UULib: pInt :: Parser Token (DTerm Int)
+ Language.Grammars.SyntaxMacros.UULib: pOp :: Parser Token (DTerm String)
+ Language.Grammars.SyntaxMacros.UULib: pTerm :: IsParser p Token => String -> p (DTerm String)
+ Language.Grammars.SyntaxMacros.UULib: pVar :: Parser Token (DTerm String)
+ Language.Grammars.SyntaxMacros.UULib: parse :: Parser Token a -> [Token] -> ParseResult a
+ Language.Grammars.SyntaxMacros.UULib: rparse :: Parser Token a -> [Token] -> (a, [ParseMsg])
+ Language.Grammars.SyntaxMacros.UULib: toDTerm :: (a -> b) -> (a, Pos) -> DTerm b
+ Language.Grammars.SyntaxMacros.UULib: toPos :: Pos -> Pos
+ Language.Grammars.SyntaxMacros.UULib: type ParseMsg = Message Token (Maybe Token)
+ Language.Grammars.SyntaxMacros.UULib: unC :: Const f a s -> f a
+ Language.Grammars.SyntaxMacros.UUParsing: C :: f a -> Const f a s
+ Language.Grammars.SyntaxMacros.UUParsing: Ok :: a -> ParseResult a
+ Language.Grammars.SyntaxMacros.UUParsing: Rep :: a -> [Error LineCol] -> ParseResult a
+ Language.Grammars.SyntaxMacros.UUParsing: compile :: Grammar a -> Parser a
+ Language.Grammars.SyntaxMacros.UUParsing: data ParseResult a
+ Language.Grammars.SyntaxMacros.UUParsing: instance Show a => Show (ParseResult a)
+ Language.Grammars.SyntaxMacros.UUParsing: lc2Pos :: LineCol -> Pos
+ Language.Grammars.SyntaxMacros.UUParsing: mapEnv :: (forall a. f a s -> g a s) -> Env f s env -> Env g s env
+ Language.Grammars.SyntaxMacros.UUParsing: newtype Const f a s
+ Language.Grammars.SyntaxMacros.UUParsing: pChr :: Parser Char
+ Language.Grammars.SyntaxMacros.UUParsing: pCon :: Parser String
+ Language.Grammars.SyntaxMacros.UUParsing: pIdChar :: Parser Char
+ Language.Grammars.SyntaxMacros.UUParsing: pInt :: Parser Int
+ Language.Grammars.SyntaxMacros.UUParsing: pOp :: Parser String
+ Language.Grammars.SyntaxMacros.UUParsing: pTerm :: String -> Parser String
+ Language.Grammars.SyntaxMacros.UUParsing: pVar :: Parser String
+ Language.Grammars.SyntaxMacros.UUParsing: parse :: Parser a -> String -> ParseResult a
+ Language.Grammars.SyntaxMacros.UUParsing: spaces :: Parser String
+ Language.Grammars.SyntaxMacros.UUParsing: type Parser a = P (Str Char String LineCol) a
+ Language.Grammars.SyntaxMacros.UUParsing: unC :: Const f a s -> f a
- Language.Grammars.Grammar: (<=>) :: LabelSymbol t v v' => label -> Symbol v t env -> ListProd l env (LVPair label v')
+ Language.Grammars.Grammar: (<=>) :: LabelSymbol t v v' => label -> Symbol v t env -> PreProductions l env (LVPair label v')
- Language.Grammars.Grammar: Fix :: Productions (FL a) a env -> Prod l a env
+ Language.Grammars.Grammar: Fix :: Productions (FL a) a env -> Prod TL a env
- Language.Grammars.Grammar: FlipStar :: Prod l a env -> Prod l (a -> b) env -> Prod l b env
+ Language.Grammars.Grammar: FlipStar :: Prod NF a env -> Prod NF (a -> b) env -> Prod NF b env
- Language.Grammars.Grammar: Grammar :: (Ref a env) -> (GramEnv env env) -> Grammar a
+ Language.Grammars.Grammar: Grammar :: (Ref a env) -> (FinalEnv (Productions NF) env) -> Grammar a
- Language.Grammars.Grammar: PP :: [Prod l a env] -> ListProd l env a
+ Language.Grammars.Grammar: PP :: [Prod l a env] -> PreProductions l env a
- Language.Grammars.Grammar: Term :: String -> Symbol DTerm TTerm env
+ Language.Grammars.Grammar: Term :: String -> Symbol (DTerm String) TTerm env
- Language.Grammars.Grammar: TermChar :: Symbol Char TAttT env
+ Language.Grammars.Grammar: TermChar :: Symbol (DTerm Char) TAttT env
- Language.Grammars.Grammar: TermConid :: Symbol String TAttT env
+ Language.Grammars.Grammar: TermConid :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: TermInt :: Symbol Int TAttT env
+ Language.Grammars.Grammar: TermInt :: Symbol (DTerm Int) TAttT env
- Language.Grammars.Grammar: TermOp :: Symbol String TAttT env
+ Language.Grammars.Grammar: TermOp :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: TermVarid :: Symbol String TAttT env
+ Language.Grammars.Grammar: TermVarid :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: char :: Symbol Char TAttT env
+ Language.Grammars.Grammar: char :: Symbol (DTerm Char) TAttT env
- Language.Grammars.Grammar: con :: Symbol String TAttT env
+ Language.Grammars.Grammar: con :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: fixPrd :: ListProd (FL a) env a -> ListProd l env a
+ Language.Grammars.Grammar: fixPrd :: PreProductions (FL a) env a -> PreProductions TL env a
- Language.Grammars.Grammar: idiomatic :: Idiomatic l env f g => ListProd l env f -> g
+ Language.Grammars.Grammar: idiomatic :: Idiomatic l env f g => PreProductions l env f -> g
- Language.Grammars.Grammar: int :: Symbol Int TAttT env
+ Language.Grammars.Grammar: int :: Symbol (DTerm Int) TAttT env
- Language.Grammars.Grammar: nt :: Symbol a TNonT env -> ListProd l env a
+ Language.Grammars.Grammar: nt :: Symbol a TNonT env -> PreProductions l env a
- Language.Grammars.Grammar: ntPrd :: Symbol a TNonT env -> ListProd l env a
+ Language.Grammars.Grammar: ntPrd :: Symbol a TNonT env -> PreProductions l env a
- Language.Grammars.Grammar: op :: Symbol String TAttT env
+ Language.Grammars.Grammar: op :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: pMany :: ListProd (FL [a]) env a -> ListProd l env [a]
+ Language.Grammars.Grammar: pMany :: PreProductions (FL [a]) env a -> PreProductions TL env [a]
- Language.Grammars.Grammar: pSome :: ListProd (FL [a]) env a -> ListProd l env [a]
+ Language.Grammars.Grammar: pSome :: PreProductions (FL [a]) env a -> PreProductions TL env [a]
- Language.Grammars.Grammar: prod :: ListProd l env a -> Productions l a env
+ Language.Grammars.Grammar: prod :: PreProductions l env a -> Productions l a env
- Language.Grammars.Grammar: sym :: Symbol a t env -> ListProd l env a
+ Language.Grammars.Grammar: sym :: Symbol a t env -> PreProductions l env a
- Language.Grammars.Grammar: tr :: String -> ListProd l env DTerm
+ Language.Grammars.Grammar: tr :: String -> PreProductions l env (DTerm String)
- Language.Grammars.Grammar: type GramEnv = Env (Productions TL)
+ Language.Grammars.Grammar: type GramEnv = Env (Productions NF)
- Language.Grammars.Grammar: unPP :: ListProd l env a -> [Prod l a env]
+ Language.Grammars.Grammar: unPP :: PreProductions l env a -> [Prod l a env]
- Language.Grammars.Grammar: var :: Symbol String TAttT env
+ Language.Grammars.Grammar: var :: Symbol (DTerm String) TAttT env
- Language.Grammars.Grammar: varPrd :: ListProd (FL a) env a
+ Language.Grammars.Grammar: varPrd :: PreProductions (FL a) env a
- Language.Grammars.SyntaxMacros: addNT :: GramTrafo env (ListProd TL env a) (Symbol a TNonT env)
+ Language.Grammars.SyntaxMacros: addNT :: PreGramTrafo env (PreProductions TL env a) (Symbol a TNonT env)
- Language.Grammars.SyntaxMacros: addProds :: GramTrafo env (Symbol a TNonT env, ListProd TL env a) ()
+ Language.Grammars.SyntaxMacros: addProds :: PreGramTrafo env (Symbol a TNonT env, PreProductions TL env a) ()
- Language.Grammars.SyntaxMacros: exportNTs :: NTRecord (nts env) => GramTrafo env (Export start nts env) (Export start nts env)
+ Language.Grammars.SyntaxMacros: exportNTs :: NTRecord (nts env) => PreGramTrafo env (Export start nts env) (Export start nts env)
- Language.Grammars.SyntaxMacros: type ExtGram env start nts = GramTrafo env () (Export start nts env)
+ Language.Grammars.SyntaxMacros: type ExtGram env start nts = PreGramTrafo env () (Export start nts env)
- Language.Grammars.SyntaxMacros: type GramTrafo = Trafo Unit (Productions TL)
+ Language.Grammars.SyntaxMacros: type GramTrafo = Trafo Unit (Productions NF)
- Language.Grammars.SyntaxMacros: type SyntaxMacro env start nts start' nts' = GramTrafo env (Export start nts env) (Export start' nts' env)
+ Language.Grammars.SyntaxMacros: type SyntaxMacro env start nts start' nts' = PreGramTrafo env (Export start nts env) (Export start' nts' env)

Files

SyntaxMacros.cabal view
@@ -1,5 +1,5 @@ name:               SyntaxMacros -version:            1.0+version:            1.0.3 cabal-version:      >= 1.2.3   license:            LGPL license-file:       COPYRIGHT@@ -13,11 +13,13 @@ copyright:          Universiteit Utrecht extra-source-files: README, LICENSE-LGPL  library-        build-depends:      base>=4 && <5, haskell98, template-haskell>=2.4.0.1, TTTAS>=0.4.0, AspectAG>=0.2,-                            uulib>=0.9.12, containers>=0.3, HList>=0.2+        build-depends:      base>=4 && <5, template-haskell>=2.4.0.1, TTTAS>=0.4.0, AspectAG>=0.2,+                            uulib>=0.9.12, uu-parsinglib >= 2.7.1, ListLike >= 3.1.0, containers>=0.3, HList>=0.2         exposed-modules:    Language.Grammars.Grammar,                              Language.Grammars.SyntaxMacros, -                            Language.Grammars.SyntaxMacros.Scanner+                            Language.Grammars.SyntaxMacros.Scanner,+                            Language.Grammars.SyntaxMacros.UUParsing,+                            Language.Grammars.SyntaxMacros.UULib         other-modules:      Language.Grammars.SyntaxMacros.Machine,                              Language.Grammars.SyntaxMacros.Token,                              Language.Grammars.SyntaxMacros.TokenParser, 
examples/LangDef.hs view
@@ -22,7 +22,26 @@  import UU.Pretty.Basic +prds = proc () -> do +         rec     root    <- addNT -<  (iI semAGItf exp Ii)+                 exp     <- addNT -<  (iI semLet "let" var  "=" exp "in" exp Ii) +                                      <|> +                                      (iI semAdd exp "+" term Ii)+                                      <|> +                                      iI id term Ii +                 term    <- addNT -<  (iI semMul term  "*"  factor Ii)+                                      <|>+                                      iI id factor Ii+                 factor  <- addNT -<  (iI semCst int Ii)+                                      <|> +                                      (iI semVar var Ii)++         exportNTs -< exportList root  $   export ntExp     exp +                                       .   export ntTerm    term +                                       .   export ntFactor  factor  ++{- prds = proc () -> do           rec     root    <- addNT -<  (iI (`semAGItf` emptyRecord) (ch_expr <=> exp) Ii)@@ -42,7 +61,7 @@          exportNTs -< exportList root  $   export ntExp     exp                                         .   export ntTerm    term                                         .   export ntFactor  factor  - +-}  {- -- another possible version prds = proc () -> do
examples/LangExt.hs view
@@ -13,7 +13,7 @@ import Language.Grammars.AspectAG.Derive  import Language.Grammars.SyntaxMacros-import Language.Grammars.Grammar+import Language.Grammars.Grammar hiding ((<=>))   import LangSem@@ -39,8 +39,11 @@                           (HCons (LVPair (Proxy Att_sval) Int) HNil))  ++ --Square-$(chLabel "se" ''T_Expr)+-- $(chLabel "se" ''T_Expr)+$(addProd "Sq" [ ("se",''T_Expr) ])  sppSq = synM spp $ do me1 <- at ch_se                        return $ "square" >#< (me1 # spp)   @@ -48,12 +51,16 @@ se2m r = (ch_me1 .=. (r # ch_se) .*. ch_me2 .=. (r # ch_se) .*. emptyRecord) m2se r = (ch_se .=. (r # ch_me1) .*. emptyRecord) -aspSq = sppSq `ext` (adapt aspMul se2m se2m m2se)-semSq = \s -> knit aspSq (s .*. emptyRecord)   +-- aspSq = sppSq `ext` (adapt aspMul se2m se2m m2se)+aspSq = sppSq `ext` (mapChildren aspMul (ch_me1 .=. ch_se .*. ch_me2 .=. ch_se .*. emptyRecord)) +-- semSq = \s -> knit aspSq (s .*. emptyRecord)  +semSq = semP_Sq aspSq+ --Pyth-$(chLabels ["pe1","pe2"] ''T_Expr)+-- $(chLabels ["pe1","pe2"] ''T_Expr)+$(addProd "Pyth" [ ("pe1",''T_Expr), ("pe2",''T_Expr) ])  sppSq' = synM spp $ do liftM (# spp) (at ch_se)  aspSq' = sppSq' `ext` aspSq @@ -61,23 +68,62 @@ sppPyth  = synM spp  $ do  pe1 <- at ch_pe1                            pe2 <- at ch_pe2                             return $ "pyth" >#< (pe1 # spp) >#< (pe2 # spp)   -+{- aspAdd' =  graft  (graft  aspAdd-                          (ch_ae2 .=. ch_ae2 .*. hNil)+                          (ch_ae2 .=. ch_ae2 .*. emptyRecord)                           ch_ae1                            aspSq' -                          (ch_se .=. ch_pe1 .*. hNil))-                  (ch_pe1 .=. ch_pe1 .*. hNil)+                          (ch_se .=. ch_pe1 .*. emptyRecord))+                  (ch_pe1 .=. ch_pe1 .*. emptyRecord)                   ch_ae2                   aspSq' -                  (ch_se .=. ch_pe2 .*. hNil)+                  (ch_se .=. ch_pe2 .*. emptyRecord)+-} +aspAdd' =  agMacro  (aspAdd, ch_ae1 ==> (aspSq', ch_se --> ch_pe1)+                             <.> +                             ch_ae2 ==> (aspSq', ch_se --> ch_pe2))++ aspPyth    = sppPyth `ext` aspAdd'-semPyth = \p1 p2 -> knit  aspPyth (p1 .*. p2 .*. emptyRecord)  -                +-- semPyth = \p1 p2 -> knit  aspPyth (p1 .*. p2 .*. emptyRecord)  +semPyth = semP_Pyth aspPyth ++--AddSq+$(addProd "AddSq" [ ("as1",''T_Expr), ("as2",''T_Expr) ])+++sppAddSq  = synM spp  $ do  as1 <- at ch_as1+                            as2 <- at ch_as2 +                            return $ "addsq" >#< (as1 # spp) >#< (as2 # spp)   ++++{-+aspAddSq = sppAddSq `ext`+           (graft  (graft  aspMul+                           (ch_me2 .=. ch_me2 .*. emptyRecord)+                           ch_me1 +                           aspAdd +                           (ch_ae1 .=. ch_as1 .*. ch_ae2 .=. ch_as2 .*. emptyRecord))+                   (ch_as1 .=. ch_as1 .*. ch_as2 .=. ch_as2 .*. emptyRecord)+                   ch_me2+                   aspAdd +                   (ch_ae1 .=. ch_as1 .*. ch_ae2 .=. ch_as2 .*. emptyRecord))+-}++aspAddSq = sppAddSq `ext`+            agMacro  (aspMul   ,   ch_me1 ==> (aspAdd, ch_ae1 --> ch_as1 <.> ch_ae2 --> ch_as2)+                              <.>  ch_me2 ==> (aspAdd, ch_ae1 --> ch_as1 <.> ch_ae2 --> ch_as2))+++semAddSq = semP_AddSq aspAddSq++ --Parenthesis-$(chLabel "pe" ''T_Expr)+-- $(chLabel "pe" ''T_Expr)+$(addProd "Par" [ ("pe",''T_Expr) ])  sppPar  = syn spp  $ do  pe <- at ch_pe                          return $ "(" >|< pe # spp >|< ")" @@ -85,17 +131,17 @@ ienvPar = copy ienv exprNT  aspPar = sppPar `ext` ienvPar `ext` svalPar-   -semPar = \e -> knit aspPar (e .*. emptyRecord)+-- semPar = \e -> knit aspPar (e .*. emptyRecord)+semPar = semP_Par aspPar   --Substitution-sppSubst = synM spp $ do  lnm   <- at ch_lnm+sppSubst = synM spp $ do  lnm   <- valAt ch_lnm                           val   <- at ch_val                           body  <- at ch_body                           return $ (body # spp) >|< "[" >|< (pp lnm)  >|< " | " >|< (val # spp) >|< "]"  -semSubst = \l v b -> knit (sppSubst `ext` aspLet) (l .*. v .*. b .*. emptyRecord)+semSubst = \b l v -> semP_Let (sppSubst `ext` aspLet) l v b   @@ -111,12 +157,13 @@          let term    = getNT ntTerm    imported          let factor  = getNT ntFactor  imported -         addProds   -<  (exp,     ( iI semSubst  (ch_body <=> exp) "[" (ch_lnm <=> var) "|" (ch_val <=> exp) "]" Ii))+         addProds   -<  (exp,     ( iI semSubst  exp "[" var "|" exp "]" Ii)) -         addProds   -<  (term,    ( iI semSq     "square"  (ch_se  <=> factor) Ii) <|>-                                  ( iI semPyth   "pyth"    (ch_pe1 <=> factor) (ch_pe2 <=> factor) Ii))+         addProds   -<  (term,    ( iI semSq     "square"  factor Ii)  <|>+                                  ( iI semPyth   "pyth"    factor factor Ii) <|>+                                  ( iI semAddSq  "addsq"   factor factor Ii))  -         addProds   -<  (factor,  ( iI semPar    "(" (ch_pe <=> exp) ")" Ii )    )+         addProds   -<  (factor,  ( iI semPar    "(" exp ")" Ii )    )                    exportNTs  -< imported @@ -129,43 +176,55 @@ --Syntax Macro 2 --------------------------------------------------------------  --Double-$(chLabel "de" ''T_Expr)--aspTwo = fixCst aspCst ch_cv 2+-- $(chLabel "de" ''T_Expr)+$(addProd "Db" [ ("de",''T_Expr) ]) +--aspTwo = fixCst aspCst ch_cv 2+{- aspMul' =  graft  aspMul-                  (ch_me2 .=. ch_de .*. hNil) +                  (ch_me2 .=. ch_de .*. emptyRecord)                    ch_me1                   aspTwo-                  hNil +                  emptyRecord +-} +aspMul' =  agMacro  (aspMul   ,   ch_me1 ==> (aspCst, ch_cv ~~> (DTerm undefined 2))+                             <.>  ch_me2 --> ch_de)+                  + sppDb = synM spp $ do de <- at ch_de                        return $ "double" >#< (de # spp)     aspDb = sppDb `ext` aspMul'                 -semDb = \d -> knit aspDb (d .*. emptyRecord)-+--semDb = \d -> knit aspDb (d .*. emptyRecord)+semDb = semP_Db aspDb               --AddMul-$(chLabels ["am1","am2","am3"] ''T_Expr)+-- $(chLabels ["am1","am2","am3"] ''T_Expr)+$(addProd "AddMul" [ ("am1",''T_Expr), ("am2",''T_Expr), ("am3",''T_Expr) ])   sppAddMul = synM spp $ do  am1 <- at ch_am1                             am2 <- at ch_am2                             am3 <- at ch_am3                             return $ "addmul" >#< (am1 # spp) >#< (am2 # spp) >#< (am3 # spp)  -+{- aspAddMul = ext sppAddMul $  graft  aspAdd-                                    (ch_ae1 .=. ch_am1 .*. hNil)+                                    (ch_ae1 .=. ch_am1 .*. emptyRecord)                                     ch_ae2                                      aspMul-                                    (ch_me1 .=. ch_am2 .*. ch_me2 .=. ch_am3 .*. hNil)+                                    (ch_me1 .=. ch_am2 .*. ch_me2 .=. ch_am3 .*. emptyRecord)+-}+aspAddMul = sppAddMul `ext`+            agMacro  (aspAdd   ,  ch_ae1 --> ch_am1+                              <.> ch_ae2 ==> (aspMul, ch_me1 --> ch_am2 <.> ch_me2 --> ch_am3))+  -semAddMul = \p1 p2 p3 -> knit aspAddMul (p1 .*. p2 .*. p3 .*. emptyRecord)-                          +-- semAddMul = \p1 p2 p3 -> knit aspAddMul (p1 .*. p2 .*. p3 .*. emptyRecord)+semAddMul = semP_AddMul aspAddMul                             --Grammar Extension@@ -179,8 +238,8 @@          let factor  = getNT ntFactor  imported  -         addProds   -<  (term,     (iI semDb      "double"  (ch_de   <=> factor) Ii) <|>-                                   (iI semAddMul  "addmul"  (ch_am1  <=> factor) (ch_am2  <=> factor) (ch_am3  <=> factor) Ii))+         addProds   -<  (term,     (iI semDb      "double"  factor Ii) <|>+                                   (iI semAddMul  "addmul"  factor factor factor Ii))                     exportNTs  -< imported
examples/LangSem.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS -fcontext-stack=100 #-} {-# LANGUAGE TemplateHaskell, EmptyDataDecls, NoMonomorphismRestriction #-}  module LangSem where@@ -15,6 +16,8 @@  import Control.Monad  +import Language.Grammars.Grammar (DTerm(..))+ data AGItf = AGItf { expr :: T_Expr}           deriving Show @@ -29,7 +32,10 @@  syn = syndefM inh = inhdefM+valAt = liftM value . at+posAt = liftM pos . at + $(deriveAG ''AGItf)  exprNT = nt_T_Expr .*. hNil@@ -40,8 +46,8 @@ $(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)+sppCst    = syn spp $ liftM pp      (valAt ch_cv)+sppVar    = syn spp $ liftM pp      (valAt ch_vnm) sppMul    = syn spp $ do  e1 <- at ch_me1                            e2 <- at ch_me2                           return $ e1 # spp >|< " * " >|< e2 # spp @@ -49,7 +55,7 @@                           e2 <- at ch_ae2                           return $ e1 # spp >|< " + " >|< e2 # spp  -sppLet    = syn spp $ do  lnm  <- at ch_lnm+sppLet    = syn spp $ do  lnm  <- valAt ch_lnm                           val  <- at ch_val                           body <- at ch_body                           return $ "let " >|< pp lnm >|< " = " >|< val # spp >|< " in " >|< body # spp    @@ -64,7 +70,7 @@ ienvVar   = ienvRule ienvMul   = ienvRule ienvAdd   = ienvRule-ienvLet   = inh ienv exprNT $ do lnm <- at ch_lnm+ienvLet   = inh ienv exprNT $ do lnm <- valAt ch_lnm                                  val <- at ch_val                                  lhs <- at lhs                                  return  $  ch_val   .=.  lhs # ienv .*.@@ -74,8 +80,8 @@  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 +svalCst   = syn sval $ liftM id (valAt ch_cv)+svalVar   = syn sval $ do  vnm <- valAt ch_vnm                             lhs <- at lhs                            return $ fromJust (lookup vnm (lhs # ienv))  svalMul   = svalRule ((*)::Int->Int->Int)@@ -91,11 +97,11 @@ aspLet   = sppLet   `ext` ienvLet   `ext` svalLet  -semAGItf  = \r -> knit aspAGItf (r .*. emptyRecord)   -semCst    = \c -> knit aspCst (c .*. emptyRecord)  -semVar    = \v -> knit aspVar (v .*. emptyRecord)  -semMul    = \m1 m2 -> knit aspMul  (m1 .*. m2 .*. emptyRecord)  -semAdd    = \a1 a2 -> knit aspAdd  (a1 .*. a2 .*. emptyRecord)-semLet    = \l v b -> knit aspLet  (l .*. v .*. b .*. emptyRecord)+semAGItf  = semP_AGItf aspAGItf +semCst    = semP_Cst aspCst +semVar    = semP_Var aspVar +semMul    = semP_Mul aspMul+semAdd    = semP_Add aspAdd+semLet    = semP_Let aspLet   
examples/Main.hs view
@@ -10,43 +10,54 @@ import LangExt  import Language.Grammars.SyntaxMacros-import Language.Grammars.SyntaxMacros.Scanner+import Language.Grammars.SyntaxMacros.UUParsing  import Language.Grammars.AspectAG   gram = closeGram prds+test1 = lang1 "prog.src"+lang1 s = do+--        tokens <- scanFile gramOpts "prog.src"+        tokens <- readFile s -test1 = do-        tokens <- scanFile gramOpts "prog.src"         let r = (parse . compile ) gram tokens          case ( parse . compile ) gram tokens of-           (Ok res) -> do print $ res # spp+           (Ok fres) -> do +                          let res = fres emptyRecord+                          print $ res # spp                           print $ res # sval            (Rep _ err) -> print err    -gram' = closeGram (prds <++> prds') --test2 = do-        tokens <- scanFile (gramOpts' gramOpts) "prog2.src"+gram' = closeGram (prds +>> prds') +test2 = lang2 "prog2.src"+lang2 s = do+--        tokens <- scanFile (gramOpts' gramOpts) "prog2.src"+        tokens <- readFile s         case ( parse . compile ) gram' tokens of-           (Ok res) -> do print $ res # spp+           (Ok fres) -> do +                          let res = fres emptyRecord+                          print $ res # spp                           print $ res # sval            (Rep _ err) -> print err -gram'' = closeGram (prds <++> prds' <++> prds'') --test3 = do-        tokens <- scanFile ((gramOpts'' . gramOpts') gramOpts) "prog3.src"+gram'' = closeGram (prds +>> prds' +>> prds'') +test3 = lang3 "prog3.src"+lang3 s = do+--        tokens <- scanFile ((gramOpts'' . gramOpts') gramOpts) "prog3.src"+        tokens <- readFile s         case ( parse . compile ) gram'' tokens of-           (Ok res) -> do print $ res # spp+           (Ok fres) -> do +                          let res = fres emptyRecord+                          print $ res # spp                           print $ res # sval            (Rep _ err) -> print err   main = test1 >> test2 >> test3+ 
examples/prog.src view
@@ -1,1 +1,1 @@-let letter= 2 + 10 in 3 * letter + 104+let letter = 2 + 10 in letter * 104
examples/prog2.src view
@@ -1,1 +1,1 @@-let letter= pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + square 2)+let letter = pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + square 2)
examples/prog3.src view
@@ -1,1 +1,1 @@-let letter= pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + addmul 2 3 4 + square ( double 3 ))+let letter = pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + addmul 2 3 4 + square ( double 3 ))
− src/Language/Grammars/.Grammar.hs.swp

binary file changed (24576 → absent bytes)

src/Language/Grammars/Grammar.hs view
@@ -7,7 +7,6 @@ import Data.HList  import Control.Applicative-import Unsafe.Coerce   -------------------------------------------@@ -16,45 +15,67 @@  data TL data FL a+data NF   data Grammar a     = forall env . Grammar  (Ref a env)  -                          (GramEnv env env)+                          (FinalEnv (Productions NF) env) -type GramEnv = Env (Productions TL)  newtype Productions l a env    = PS {unPS :: [Prod l a env]}  data Prod l a env where-      Star      ::  Prod l (a->b) env -> Prod l a      env ->  Prod l b  env-      FlipStar  ::  Prod l a      env -> Prod l (a->b) env ->  Prod l b  env-      Sym       ::  Symbol a t env                         ->  Prod l a  env-      Pure      ::  a                                      ->  Prod l a  env+      Star      ::  Prod l (a->b) env -> Prod l  a      env +                ->  Prod l b  env+      FlipStar  ::  Prod NF a     env -> Prod NF (a->b) env +                ->  Prod NF b  env+      Sym       ::  Symbol a t env                         +                ->  Prod l a  env+      Pure      ::  a                                      +                ->  Prod l a  env -      Fix       ::  Productions (FL a) a env               ->  Prod l      a  env-      Var       ::                                             Prod (FL a) a  env +      Fix       ::  Productions (FL a) a env               +                ->  Prod TL     a  env+      Var       ::  Prod (FL a) a  env   -- I tried with HOAS, but it is more restrictive --      Fix       ::  (forall s. Prod a s -> Productions a s)  -> Prod a env  -type DTerm = String +type GramEnv = Env (Productions NF)+type PreGramEnv = Env (Productions TL)+++newtype PreProductions l env a +  = PP {unPP :: [Prod l a env]}+++type Line      = Int+type Column    = Int+type Filename  = String++data Pos  =  Pos      !Line !Column +          |  PosFile  !Line !Column Filename+  deriving Show++data DTerm a = DTerm {pos :: Pos, value :: a}+ data TTerm data TNonT data TAttT  data Symbol a t env where-  Term    :: String    ->  Symbol  DTerm    TTerm   env+  Term    :: String    ->  Symbol  (DTerm String)    TTerm   env -  Nont    :: Ref a env ->  Symbol  a        TNonT   env+  Nont    :: Ref a env ->  Symbol  a                 TNonT   env   -- attributed terminals-  TermInt   ::             Symbol  Int      TAttT   env-  TermChar  ::             Symbol  Char     TAttT   env-  TermVarid ::             Symbol  String   TAttT   env-  TermConid ::             Symbol  String   TAttT   env-  TermOp    ::             Symbol  String   TAttT   env +  TermInt   ::             Symbol  (DTerm Int)       TAttT   env+  TermChar  ::             Symbol  (DTerm Char)      TAttT   env+  TermVarid ::             Symbol  (DTerm String)    TAttT   env+  TermConid ::             Symbol  (DTerm String)    TAttT   env+  TermOp    ::             Symbol  (DTerm String)    TAttT   env    --- TODO: the rest of EnumValToken  @@ -77,11 +98,11 @@ matchSym _          _                    = Nothing  -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   ::  Symbol (DTerm Int)     TAttT  env+char  ::  Symbol (DTerm Char)    TAttT  env+var   ::  Symbol (DTerm String)  TAttT  env+con   ::  Symbol (DTerm String)  TAttT  env+op    ::  Symbol (DTerm String)  TAttT  env  int   =  TermInt char  =  TermChar@@ -94,45 +115,42 @@ -- APPLICATIVE INTERFACE  -newtype ListProd l env a = PP { unPP :: [ Prod l a env ] }---prod :: ListProd l env a -> Productions l a env-prod (PP ps) = PS ps--sym  ::  Symbol a  t  env -> ListProd l env a+sym  ::  Symbol a  t  env -> PreProductions l env a sym  s = PP [ Sym $ s ] -nt :: Symbol a  TNonT  env -> ListProd l env a+nt :: Symbol a  TNonT  env -> PreProductions l env a nt s = sym s -ntPrd :: Symbol a  TNonT  env -> ListProd l env a+ntPrd :: Symbol a  TNonT  env -> PreProductions l env a ntPrd s =  id <$> nt s   -tr ::  String -> ListProd l env DTerm+tr ::  String -> PreProductions l env (DTerm String) tr s = PP [ Sym $ Term s ]  -varPrd   ::  ListProd (FL a) env a+prod :: PreProductions l env a -> Productions l a env+prod (PP ps) = PS ps++varPrd   ::  PreProductions (FL a) env a varPrd    = PP [ Var ]-fixPrd  ::  ListProd (FL a) env a -> ListProd l env a+fixPrd  ::  PreProductions (FL a) env a -> PreProductions TL env a fixPrd p  = PP [ (Fix . prod) p ]  -instance Functor (ListProd l env) where+instance Functor (PreProductions l env) where  fmap f (PP p) = PP [ Star (Pure f) p' | p' <- p ] -instance Applicative (ListProd l env) where+instance Applicative (PreProductions l env) where  pure f = PP [ Pure f ]    (PP f) <*> (PP g) = PP [ Star f' g' | f' <- f, g' <- g ] -instance Alternative (ListProd l env) where+instance Alternative (PreProductions l env) where  empty = PP []    (PP f) <|> (PP g) = PP (f ++ g)-+{-  some p = fixPrd (one <|> more)      where  one  = (:[]) <$> toFL p              more = (:)   <$> toFL p <*> varPrd@@ -142,7 +160,7 @@      where  none = pure []              more = (:)   <$> toFL p <*> varPrd -toFL :: ListProd l env a -> ListProd (FL b) env a+toFL :: PreProductions l env a -> PreProductions (FL b) env a toFL (PP p) = PP $ map prodToFL p  prodToFL :: Prod l a env -> Prod (FL b) a env@@ -151,46 +169,89 @@ prodToFL (Sym       s)     = Sym s prodToFL (Pure      a)     = Pure a prodToFL (Fix       f)     = Fix f-prodToFL Var               = unsafeCoerce Var -- the other option is to add an error here-+prodToFL Var               = error "ERROR: Language.Grammars.Grammar:1"+-} -pSome :: ListProd (FL [a]) env a -> ListProd l env [a]+pSome :: PreProductions (FL [a]) env a -> PreProductions TL env [a] pSome p = fixPrd (one <|> more)      where  one  = (:[]) <$> p              more = (:)   <$> p <*> varPrd -pMany :: ListProd (FL [a]) env a -> ListProd l env [a]+pMany :: PreProductions (FL [a]) env a -> PreProductions TL env [a] pMany p = fixPrd (none <|> more)      where  none = pure []              more = (:)   <$> p <*> varPrd+{-+pMaybe :: PreProductions l env a -> PreProductions l env (Maybe a)+pMaybe p = (nothing <|> just)+     where  nothing = pure Nothing +            just    = Just   <$> p   +pEither :: PreProductions l env a -> PreProductions l env b -> PreProductions l env (Either a b)+pEither p q = (left <|> right)+     where  left  = Left  <$> p+            right = Right <$> q +-}++opt :: PreProductions l env a -> a -> PreProductions l env a+opt p a = p <|> pure a++pMaybe :: (b, (a -> b)) -> PreProductions TL env a -> PreProductions TL env b+pMaybe (n, j) p = (nothing <|> just)+     where  nothing = pure n +            just    = j  <$> p +++pFoldr :: (a -> b -> b, b) -> PreProductions (FL b) env a -> PreProductions TL env b+pFoldr (c, e) p = fixPrd (none <|> more)+     where  none = pure e +            more = c   <$> p <*> varPrd+ ------------------------ -- IDIOMS --- | The  `Ii` is to be pronounced as @stop@+-- | The  'Ii' is to be pronounced as @stop@ data Ii = Ii  --- | The function `iI` is to be pronounced as @start@+-- | The function 'iI' is to be pronounced as @start@ iI ::Idiomatic  l env (a -> a) g => g iI = idiomatic (pure id)  class Idiomatic l env f g  | g -> f l env  where-    idiomatic :: ListProd l env f -> g+    idiomatic :: PreProductions l env f -> g -instance  Idiomatic l env x  (Ii -> ListProd l env x) where+instance  Idiomatic l env x  (Ii -> PreProductions l env x) where     idiomatic ix Ii = ix-instance  Idiomatic l env f g  => Idiomatic  l env (a -> f) (ListProd l env a -> g) where+++instance  Idiomatic l env f g  => Idiomatic  l env (a -> f) (PreProductions l env a -> g) where     idiomatic isf is = idiomatic (isf <*> is) +instance  Idiomatic l env f g  => Idiomatic  l env (a -> f) (Symbol a TNonT env -> g) where+    idiomatic isf is = idiomatic (isf <*> (sym is))++instance  Idiomatic l env f g  => Idiomatic  l env ((Record HNil -> a) -> f) (Symbol a TAttT env -> g) where+    idiomatic isf is = idiomatic (isf <*> ((\x (Record HNil) -> x) <$> (sym is :: PreProductions l env a)))++ instance Idiomatic l env f g => Idiomatic l env ((a -> b) -> f)  ((a -> b) -> g) where-    idiomatic isf f = idiomatic (isf <*> (pure f))+    idiomatic isf f = idiomatic (isf <*> (pure f :: PreProductions l env (a->b)))  instance (Idiomatic  l env f g)         => Idiomatic  l env f (String -> g) where     idiomatic isf str = idiomatic (isf <* (tr str)) +{-+data Pos = Pos String +pt :: String -> Pos+pt = Pos++instance  Idiomatic l env f g  => Idiomatic  l env ((Record HNil -> DTerm String) -> f) (Pos -> g) where+    idiomatic isf (Pos is) = idiomatic (isf <*> ((\x (Record HNil) -> x) <$> (tr is)))+-}+ -------------------------------------------------------------------------------  @@ -206,20 +267,20 @@ infixr 6 <=>  class LabelSymbol t v v' | t v -> v' where - (<=>) :: label -> Symbol v t env -> ListProd l env (LVPair label v')+ (<=>) :: label -> Symbol v t env -> PreProductions l env (LVPair label v')   instance LabelSymbol TAttT v (Record HNil -> v) where- l <=> v =  (\x -> l .=. (\(Record HNil) -> x)) <$> (PP [ Sym v ])+ l <=> v =  (\x -> l .=. (\(Record HNil) -> x)) <$> (sym v)  instance LabelSymbol TNonT v v where- l <=> v =  (l .=.) <$> (PP [ Sym v ])+ l <=> v =  (l .=.) <$> (sym v)  instance LabelSymbol TTerm v v where -- only to have all the instances- l <=> v =  (l .=.) <$> (PP [ Sym v ])-+ l <=> v =  (l .=.) <$> (sym v)  +{- ------------------------------------------------------------------------------- -- Show instances for the Grammars -- Just for debugging purposes@@ -260,4 +321,4 @@ instance Show (Ref a env) where  show Zero     = "0"  show (Suc r)  = show  $ (1::Int) + ((read . show) r)-+-}
src/Language/Grammars/SyntaxMacros.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE Arrows, ExistentialQuantification, GADTs, Rank2Types, FlexibleContexts, ScopedTypeVariables     , EmptyDataDecls, MultiParamTypeClasses, FlexibleInstances, OverlappingInstances, FunctionalDependencies, UndecidableInstances+    , NoMonomorphismRestriction   #-}  module Language.Grammars.SyntaxMacros where@@ -7,33 +8,32 @@ import Language.AbstractSyntax.TTTAS import Control.Arrow -import qualified UU.Parsing as UU-import Language.Grammars.SyntaxMacros.Scanner- import Language.Grammars.Grammar  import Language.Grammars.Transformations.RemoveFix import Language.Grammars.Transformations.RemoveEmpties import Language.Grammars.Transformations.LeftCorner  -type GramTrafo = Trafo Unit (Productions TL)+type GramTrafo    = Trafo Unit (Productions NF)+type PreGramTrafo = Trafo Unit (Productions TL)+ type ExtGram      env  start  nts   -           = GramTrafo env  ()   (Export start nts env)+           = PreGramTrafo env  ()   (Export start nts env) type SyntaxMacro  env  start  nts  start' nts'  -           = GramTrafo env  (Export start nts env)  (Export start' nts' env)+           = PreGramTrafo env  (Export start nts env)  (Export start' 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 (ListProd TL env a) (Symbol a TNonT env)+addNT  ::  PreGramTrafo env (PreProductions TL env a) (Symbol a TNonT env) addNT  =  proc  p -> do                  r  <- newSRef -< prod p                 returnA -< Nont r   -- add productions to an existing non-terminal-addProds  ::  GramTrafo  env -                         (Symbol a TNonT env, ListProd TL env a) ()+addProds  ::  PreGramTrafo  env +                         (Symbol a TNonT env, PreProductions TL env a) () addProds  = proc (nont, prds) -> do       updateFinalEnv  -<           updateEnv (\ps -> PS $ (unPP prds) ++ (unPS ps)) (getRefNT nont)@@ -44,25 +44,44 @@                 -> Grammar a  closeGram prds  = case runTrafo prds Unit () of      Result _ (Export (Nont r) _) gram -            -> (leftCorner . removeEmpties . removeFix) $ Grammar r gram+            -> (leftCorner . removeEmpties) (removeFix r gram) +-- extend a grammar extendGram  ::  (NTRecord (nts env), NTRecord (nts' env))               =>  ExtGram env start nts                  -> SyntaxMacro env start nts start' nts'                  -> ExtGram env start' nts' extendGram g sm = g >>> sm -(<++>)      ::  (NTRecord (nts env), NTRecord (nts' env))  ++(+>>)      ::  (NTRecord (nts env), NTRecord (nts' env))               =>  ExtGram env start nts                  -> SyntaxMacro env start nts start' nts'                  -> ExtGram env start' nts' -(<++>) = extendGram+(+>>) = extendGram -exportNTs ::  NTRecord (nts env) => GramTrafo env (Export start nts env) (Export start nts env)++-- export+exportNTs ::  NTRecord (nts env) => PreGramTrafo env (Export start nts env) (Export start nts env) exportNTs = returnA +-- compose grammars+{-+compG  ::  (NTUnion nts1 nts2 nts)+       =>  ExtGram env start nts1+       ->  ExtGram env start nts2+       ->  ExtGram env start nts +compG g1 g2 =  proc  () -> do+                (Export s1 ns1) <- g1 -< ()+                (Export s2 ns2) <- g2 -< ()+ +                s  <- addNT -< iI s1 Ii <|> iI s2 Ii++                returnA -< Export s (ntUnion ns1 ns2)+-}+ -- extensible record  @@ -119,82 +138,7 @@         -> l env ->  NTCons nt a l env export l nont = (^|) (l ^= nont)  --- COMPILE -------------------------------------------------------------------- -pInt            ::   UU.Parser Token Int-pChr            ::   UU.Parser Token Char-pCon            ::   UU.Parser Token String-pVar            ::   UU.Parser Token String-pOp             ::   UU.Parser Token String--pChr            =    head UU.<$> pChar-pInt            =    read UU.<$> pInteger-pCon            =    id UU.<$> pConid-pVar            =    id UU.<$> pVarid-pOp             =    id UU.<$> pVarsym--pTerm           ::  (UU.IsParser p Token) -                =>  String -> p DTerm-pTerm t         =   pKey t--newtype Const f a s = C {unC :: f a}---compile :: Grammar a -> UU.Parser Token a-compile (Grammar (start :: Ref a env) rules) -                       = unC (lookupEnv start result)-  where  result  =  -          mapEnv -          (\ (PS ps) -> C (foldr1 (UU.<|>) [ comp p | p <- ps]))-          rules--         comp :: forall t . Prod TL t env -> UU.Parser Token t--         comp (Star     x y)   = comp x UU.<*>   comp y-         comp (FlipStar x y)   = comp x UU.<**>  comp y-         comp (Pure     x)     = UU.pLow x--         comp (Sym (Term t))   = pTerm t-         comp (Sym (Nont n))   = unC (lookupEnv n result)--         comp (Sym TermInt)    = pInt-         comp (Sym TermChar)   = pChr-         comp (Sym TermVarid)  = pVar-         comp (Sym TermConid)  = pCon-         comp (Sym TermOp)     = pOp--         comp (Fix _)          = error "This shouldn't be happening!"--mapEnv  ::  (forall a . f a s -> g a s)  -        ->  Env f s env -> Env g s env-mapEnv  _ Empty       = Empty-mapEnv  f (Ext r v)   = Ext (mapEnv f r) (f v)----- PARSE ------------------------------------------------------------------------type ParseMsg = UU.Message Token (Maybe Token)--data ParseResult a = Ok  a-                   | Rep a [ParseMsg] -      deriving Show--parse :: UU.Parser Token a -> [Token] -> ParseResult a-parse p input = case rparse p input of-                  (a,[]  ) -> Ok a-                  (a,msgs) -> Rep a msgs---rparse :: UU.Parser Token a -> [Token] -> (a, [ParseMsg])-rparse p input = let (UU.Pair a _,msgs) =  eval (UU.parse p input)-                 in (a,msgs)- where eval :: UU.Steps a Token (Maybe Token) -> (a, [ParseMsg])-       eval (UU.OkVal v        r) = let (a,msgs) = v `seq` eval r -                                    in  (v a,msgs)-       eval (UU.Ok             r) = eval r-       eval (UU.Cost  _        r) = eval  r-       eval (UU.StRepair _ msg r) = let (v,msgs) = eval r -                                    in  (v,msg:msgs)-       eval (UU.Best _   r     _) = eval  r-       eval (UU.NoMoreSteps v   ) = (v,[]) +extendExport :: Export start t env -> (t env -> nts env) -> Export start nts env+extendExport (Export r nts) ext = Export r (ext nts) 
src/Language/Grammars/SyntaxMacros/Machine.hs view
@@ -3,7 +3,7 @@ import Data.Char import Data.List import Data.Maybe-import IO+import System.IO import UU.Scanner.Position import qualified Data.Set as Set 
src/Language/Grammars/SyntaxMacros/ScanUtils.hs view
@@ -14,7 +14,7 @@   )   where -import IO+import System.IO import Data.Char import Data.List import qualified Data.Set as Set
+ src/Language/Grammars/SyntaxMacros/UULib.hs view
@@ -0,0 +1,90 @@+module Language.Grammars.SyntaxMacros.UULib where++import qualified UU.Parsing as UU+import Language.Grammars.SyntaxMacros.Scanner hiding (Pos)+import qualified Language.Grammars.SyntaxMacros.Scanner as S++import Language.Grammars.Grammar+import Language.AbstractSyntax.TTTAS++toPos :: S.Pos -> Pos+toPos (S.Pos l c f) = PosFile l c f++toDTerm :: (a -> b) -> (a, S.Pos) -> DTerm b+toDTerm f p =  DTerm ((toPos . snd) p) ((f . fst) p)++pChr            ::   UU.Parser Token (DTerm Char)+pChr            =    (toDTerm head) UU.<$> pCharPos+pInt            ::   UU.Parser Token (DTerm Int)+pInt            =    (toDTerm read) UU.<$> pIntegerPos+pCon            ::   UU.Parser Token (DTerm String)+pCon            =    (toDTerm id)   UU.<$> pConidPos+pVar            ::   UU.Parser Token (DTerm String)+pVar            =    (toDTerm id)   UU.<$> pVaridPos+pOp             ::   UU.Parser Token (DTerm String)+pOp             =    (toDTerm id)   UU.<$> pVarsymPos++pTerm           ::  (UU.IsParser p Token) +                =>  String -> p (DTerm String)+pTerm t         =   (toDTerm id . (\loc -> (t,loc)))  UU.<$> pKeyPos t++newtype Const f a s = C {unC :: f a}+++compile :: Grammar a -> UU.Parser Token a+compile (Grammar (start :: Ref a env) rules) +                       = unC (lookupEnv start result)+  where  result  =  +          mapEnv +          (\ (PS ps) -> C (foldr1 (UU.<|>) [ comp p | p <- ps]))+          rules++         comp :: forall t . Prod NF t env -> UU.Parser Token t++         comp (Star     x y)   = comp x UU.<*>   comp y+         comp (FlipStar x y)   = comp x UU.<**>  comp y+         comp (Pure     x)     = UU.pLow x++         comp (Sym (Term t))   = pTerm t+         comp (Sym (Nont n))   = unC (lookupEnv n result)++         comp (Sym TermInt)    = pInt+         comp (Sym TermChar)   = pChr+         comp (Sym TermVarid)  = pVar+         comp (Sym TermConid)  = pCon+         comp (Sym TermOp)     = pOp+++mapEnv  ::  (forall a . f a s -> g a s)  +        ->  Env f s env -> Env g s env+mapEnv  _ Empty       = Empty+mapEnv  f (Ext r v)   = Ext (mapEnv f r) (f v)+++-- PARSE ----------------------------------------------------------------------++type ParseMsg = UU.Message Token (Maybe Token)++data ParseResult a = Ok  a+                   | Rep a [ParseMsg] +      deriving Show++parse :: UU.Parser Token a -> [Token] -> ParseResult a+parse p input = case rparse p input of+                  (a,[]  ) -> Ok a+                  (a,msgs) -> Rep a msgs+++rparse :: UU.Parser Token a -> [Token] -> (a, [ParseMsg])+rparse p input = let (UU.Pair a _,msgs) =  eval (UU.parse p input)+                 in (a,msgs)+ where eval :: UU.Steps a Token (Maybe Token) -> (a, [ParseMsg])+       eval (UU.OkVal v        r) = let (a,msgs) = v `seq` eval r +                                    in  (v a,msgs)+       eval (UU.Ok             r) = eval r+       eval (UU.Cost  _        r) = eval  r+       eval (UU.StRepair _ msg r) = let (v,msgs) = eval r +                                    in  (v,msg:msgs)+       eval (UU.Best _   r     _) = eval  r+       eval (UU.NoMoreSteps v   ) = (v,[]) +
+ src/Language/Grammars/SyntaxMacros/UUParsing.hs view
@@ -0,0 +1,84 @@+module Language.Grammars.SyntaxMacros.UUParsing where+++import qualified Text.ParserCombinators.UU.Core as UU+import Text.ParserCombinators.UU+import Text.ParserCombinators.UU.Utils+import Text.ParserCombinators.UU.BasicInstances hiding (Parser,input,msgs)++import Language.Grammars.Grammar+import Language.AbstractSyntax.TTTAS+++type Parser a = P (Str Char String LineCol) a++pInt :: Parser Int+pInt  = pInteger+pChr :: Parser Char+pChr  = pAscii++pVar :: Parser String+pVar  = ((:) <$> pLower <*> pList pIdChar `micro` 2) <* spaces ++pCon :: Parser String+pCon  = ((:) <$> pUpper <*> pList pIdChar `micro` 2) <* spaces++pIdChar :: Parser Char+pIdChar = pLower <|> pUpper <|> pDigit <|> pAnySym "='"++pOp :: Parser String+pOp   = (pList1 $ pAnySym ('|':"!#$%&*+./<=>?@\\^-~:") `micro` 2) <* spaces++pTerm :: String -> Parser String+pTerm keyw = pToken keyw `micro` 1 <* spaces+spaces :: Parser String+spaces = pMunch (`elem` " \n")++lc2Pos :: LineCol -> Pos+lc2Pos (LineCol l c) = Pos l c++newtype Const f a s = C {unC :: f a}++-- | The function 'compile' generates a parser out of a closed grammar +compile :: Grammar a -> Parser a+compile (Grammar (start :: Ref a env) rules) +                       = unC (lookupEnv start result)+  where  result  =  +          mapEnv +          (\ (PS ps) -> C (foldr1 (<|>) [ comp p | p <- ps]))+          rules++         comp :: forall t . Prod NF t env -> Parser t++         comp (Star     x y)   = comp x <*>   comp y+         comp (FlipStar x y)   = comp x <**>  comp y+         comp (Pure     x)     = pure x++         comp (Sym (Term t))   = (DTerm . lc2Pos) <$> pPos <*> pTerm t+         comp (Sym (Nont n))   = unC (lookupEnv n result)++         comp (Sym TermInt)    = (DTerm . lc2Pos) <$> pPos <*> pInt+         comp (Sym TermChar)   = (DTerm . lc2Pos) <$> pPos <*> pChr+         comp (Sym TermVarid)  = (DTerm . lc2Pos) <$> pPos <*> pVar+         comp (Sym TermConid)  = (DTerm . lc2Pos) <$> pPos <*> pCon+         comp (Sym TermOp)     = (DTerm . lc2Pos) <$> pPos <*> pOp+++mapEnv  ::  (forall a . f a s -> g a s)  +        ->  Env f s env -> Env g s env+mapEnv  _ Empty       = Empty+mapEnv  f (Ext r v)   = Ext (mapEnv f r) (f v)++++data ParseResult a = Ok  a+                   | Rep a [Error LineCol] +      deriving Show++-- | The function 'parse' runs the parser for an input.+parse :: Parser a -> String -> ParseResult a+parse p input = case UU.parse ( (,) <$> p <*> pEnd) (createStr (LineCol 0 0) input) of+                  (a,[]  ) -> Ok a+                  (a,msgs) -> Rep a msgs++
src/Language/Grammars/Transformations/GramTrafo.hs view
@@ -30,11 +30,11 @@                    -type GramTrafo env a = Trafo (MapA_X env a) (Productions TL)+type GramTrafo env a = Trafo (MapA_X env a) (Productions NF)   initMap :: GramTrafo env a s c d-        -> Trafo Unit (Productions TL) s c d+        -> Trafo Unit (Productions NF) s c d initMap (Trafo st)          = Trafo (\_ -> case st emptyMap of                             TrafoE _ f -> TrafoE Unit f@@ -42,12 +42,12 @@  newNontRS  ::  forall x t env s a             .   Symbol (x->a) t env -           ->  GramTrafo env a s (Productions TL x s) (Ref x s)+           ->  GramTrafo env a s (Productions NF x s) (Ref x s) newNontRS x = Trafo $ \m -> extEnv (extendMapS x m)  newNontRF  ::  forall x t env s a             .   Symbol x t env -           ->  GramTrafo env a s (Productions TL (x->a) s) (Ref (x->a) s)+           ->  GramTrafo env a s (Productions NF (x->a) s) (Ref (x->a) s) newNontRF x = Trafo $ \m -> extEnv (extendMapF x m)  @@ -59,7 +59,7 @@      = T (flip lookupEnv env)  -mapProd  :: T env1 env2 -> Prod l a env1 -> Prod l a env2+mapProd  :: T env1 env2 -> Prod NF a env1 -> Prod NF a env2 mapProd t (Sym (Nont x))      = Sym (Nont (unT t x))  mapProd _ (Sym (Term x))      = Sym  (Term x)  mapProd _ (Sym TermInt)       = Sym TermInt @@ -70,6 +70,4 @@ mapProd _ (Pure x)            = Pure x mapProd t (Star r l)          = Star     (mapProd t r) (mapProd t l) mapProd t (FlipStar r l)      = FlipStar (mapProd t r) (mapProd t l)-mapProd t (Fix (PS ps))       = Fix $ PS (map (mapProd t) ps)-mapProd _ Var                 = Var 
src/Language/Grammars/Transformations/LeftCorner.hs view
@@ -15,7 +15,7 @@                  Grammar (tt start) gram  lctrafo :: GramEnv env env -        -> Trafo Unit (Productions TL) s () (T env s)+        -> Trafo Unit (Productions NF) s () (T env s) lctrafo productions = proc _ ->             do   rec  let tenv_s = map2trans menv_s                       menv_s <- (rules1 productions productions) -< tenv_s@@ -24,7 +24,7 @@  rules1  ::  GramEnv env env         ->  GramEnv env env' -        ->  Trafo  Unit (Productions TL) s (T env s) +        ->  Trafo  Unit (Productions NF) s (T env s)                                             (Mapping env' s) rules1 _ Empty                = proc _ ->@@ -39,16 +39,16 @@   app_rule1 :: forall env a s. GramEnv env env-          -> [Prod TL a env]-          -> Trafo Unit (Productions TL) s (T env s) (Productions TL a s)+          -> [Prod NF a env]+          -> Trafo Unit (Productions NF) s (T env s) (Productions NF a s) app_rule1 productions prods =  initMap            ( proc tenv_s ->                  do pss <- sequenceA  (map  (rule1 productions . accessLeftMost) prods) -< tenv_s                     returnA -< PS (concatMap unPS pss)           ) -rule1  :: GramEnv env env -> Prod TL a env -       -> GramTrafo env a s (T env s) (Productions TL a s)+rule1  :: GramEnv env env -> Prod NF a env +       -> GramTrafo env a s (T env s) (Productions NF a s)  rule1 gram (Star (Sym x) beta)       = proc tenv_s ->@@ -67,7 +67,7 @@      = error "Left-Corner(2): error in the transformation!!!"  -accessLeftMost :: Prod TL a env -> Prod TL a env+accessLeftMost :: Prod NF a env -> Prod NF a env accessLeftMost (Star      (Star      f g) h)    = accessLeftMost $ FlipStar f (Star (Star (Pure (\g' h' f' -> f' g' h'))   g) h) accessLeftMost (Star      (FlipStar  f g) h) @@ -81,7 +81,7 @@ rule2S  :: GramEnv env env          -> Symbol (x->a) t env          -> GramTrafo env a s (T env s, Ref x s) -                             (Productions TL a s)+                             (Productions NF a s) rule2S gram (Nont b)       = case lookupEnv b gram of           PS ps ->  proc (tenv_s, a_x) ->@@ -92,9 +92,9 @@   rule2bS  :: GramEnv env env -         -> Prod TL (b->a) env +         -> Prod NF (b->a) env           -> GramTrafo env a s (T env s, Ref b s) -                              (Productions TL a s)+                              (Productions NF a s)  rule2bS gram (Star (Sym x) beta)       = proc (tenv_s, a_b) ->@@ -118,7 +118,7 @@ rule2F  :: GramEnv env env          -> Symbol x t env          -> GramTrafo env a s (T env s, Ref (x->a) s) -                             (Productions TL a s)+                             (Productions NF a s) rule2F _    (Term a)       = proc (_, a_x) ->         do  returnA -< PS [rule2aF a a_x]@@ -145,20 +145,20 @@         do  returnA -< PS [rule2a'F TermOp a_x]  -rule2a'F :: Symbol a t s -> Ref (a->b) s -> Prod TL b s+rule2a'F :: Symbol a t s -> Ref (a->b) s -> Prod NF b s rule2a'F s refA_a      =  FlipStar (Sym s) (Sym $ Nont refA_a) -- (flip ($)) <$> (Sym s) <*> nont refA_a  -rule2aF :: String -> Ref (DTerm -> a) s -> Prod TL a s+rule2aF :: String -> Ref (DTerm String -> a) s -> Prod NF a s rule2aF a refA_a      =  FlipStar (Sym $ Term a) (Sym $ Nont refA_a) -- (flip ($)) <$> term a <*> nont refA_a   rule2bF  :: GramEnv env env -         -> Prod TL b env +         -> Prod NF b env           -> GramTrafo env a s (T env s, Ref (b -> a) s) -                              (Productions TL a s)+                              (Productions NF a s)  rule2bF gram (Star (Sym x) beta)       = proc (tenv_s, a_b) ->@@ -180,8 +180,8 @@ insertS ::  forall x t env s a         .   GramEnv env env          ->  Symbol (x->a) t env-        ->  GramTrafo env a s  (T env s, Prod TL x s)-                               (Productions TL a s)+        ->  GramTrafo env a s  (T env s, Prod NF x s)+                               (Productions NF a s) insertS gram x =       Trafo (            \(MapA_X ms mf) -> case ms x of@@ -199,8 +199,8 @@ insertF ::  forall x t env s a         .   GramEnv env env          ->  Symbol x t env-        ->  GramTrafo env a s  (T env s, Prod TL (x->a) s)-                               (Productions TL a s)+        ->  GramTrafo env a s  (T env s, Prod NF (x->a) s)+                               (Productions NF a s) insertF gram x =       Trafo (            \(MapA_X ms mf) -> case mf x of@@ -216,8 +216,7 @@   extendA_X  :: m env2 -> Ref x env2 -            -> TrafoE m (Productions TL) s env2 (t, Prod TL x s) (Productions TL a env)+            -> TrafoE m (Productions NF) s env2 (t, Prod NF x s) (Productions NF a env) extendA_X m r = fmap  (const $ PS []) $                         updateSRef m r (\(_,p) (PS ps) -> PS (p:ps))- 
src/Language/Grammars/Transformations/RemoveEmpties.hs view
@@ -6,8 +6,8 @@ import Language.AbstractSyntax.TTTAS  -data HasEmpty a env = Unknown | HasEmpty (Prod TL a env) | HasNotEmpty- deriving (Show)+data HasEmpty a env = Unknown | HasEmpty (Prod NF a env) | HasNotEmpty+--  deriving (Show)   removeEmpties :: Grammar a -> Grammar a@@ -41,7 +41,7 @@     = error "RemoveEmpties(2): Error in the transformation!!!"          -updateEmpty :: Env HasEmpty use use -> (Productions TL) a use -> HasEmpty a use  +updateEmpty :: Env HasEmpty use use -> Productions NF a use -> HasEmpty a use               -> (HasEmpty a use, Bool, Bool)  updateEmpty _       _   (HasEmpty p) = (HasEmpty p,  False, False) updateEmpty _       _   HasNotEmpty  = (HasNotEmpty, False, False)@@ -49,7 +49,7 @@                                         Unknown -> (Unknown, False, True)                                         e       -> (e,       True,  False) -hasEmpty :: Env HasEmpty env env -> (Productions TL) a env -> HasEmpty a env+hasEmpty :: Env HasEmpty env env -> Productions NF a env -> HasEmpty a env hasEmpty empties (PS ps)= foldr (\p re -> combHasEmpty (isEmpty p empties) re) HasNotEmpty ps  @@ -62,7 +62,7 @@ combHasEmpty Unknown          _                = Unknown  -isEmpty :: Prod TL a env -> Env HasEmpty env env -> HasEmpty a env+isEmpty :: Prod NF a env -> Env HasEmpty env env -> HasEmpty a env isEmpty (Pure a)              _       = HasEmpty (Pure a) isEmpty (Sym (Term _))        _       = HasNotEmpty isEmpty (Sym (TermInt))       _       = HasNotEmpty@@ -94,7 +94,6 @@                                                                 HasNotEmpty        -> HasNotEmpty                                                                 _                  -> Unknown -isEmpty (Fix _)               _       = error "RemoveEmpties(8): cannot transform grammars with Fix constructions."   @@ -105,7 +104,7 @@     = Ext (removeEmptiesEnv empties rprds) (removeEmpty empties prds)  -removeEmpty :: Env HasEmpty env env -> Productions TL a env -> Productions TL a env+removeEmpty :: Env HasEmpty env env -> Productions NF a env -> Productions NF a env removeEmpty empties (PS prds) = PS $ foldr ((++) . remEmptyProd) [] prds    where       -- if we don't allow the starting point to be empty, @@ -114,7 +113,7 @@                         in  prd'  -splitEmpty :: Env HasEmpty env env -> Prod TL a env -> ([Prod TL a env], Maybe (Prod TL a env))+splitEmpty :: Env HasEmpty env env -> Prod NF a env -> ([Prod NF a env], Maybe (Prod NF a env))  splitEmpty  empties  (Star f g)       =  let (fne, fe) = splitEmpty empties f @@ -140,15 +139,14 @@     = case lookupEnv r empties of               HasEmpty (Pure f)  -> ([Sym $ Nont r], Just (Pure f))               HasEmpty _         -> error "RemoveEmpties(9): Error in the transformation!!!"-              HasNotEmpty        -> ([Sym $ Nont r], Nothing)-              Unknown            -> error "RemoveEmpties(10): Error in the transformation!!!"+              _                  -> ([Sym $ Nont r], Nothing)+--              HasNotEmpty        -> ([Sym $ Nont r], Nothing)+--              Unknown            -> error "RemoveEmpties(10): Error in the transformation!!!"  splitEmpty  _        (Sym  s)  = ([Sym s], Nothing) splitEmpty  _        (Pure a)  = ([],Just $ Pure a)  splitEmpty  _        (FlipStar _ _)       = error "RemoveEmpties(11): FlipStar cannot be used to define grammars."-splitEmpty  _        (Fix _)  -    = error "RemoveEmpties(12): cannot transform grammars with Fix constructions."  
src/Language/Grammars/Transformations/RemoveFix.hs view
@@ -9,22 +9,23 @@  import Control.Arrow -removeFix :: forall a . Grammar a -> Grammar a-removeFix (Grammar start productions)++removeFix :: forall env a. Ref a env -> PreGramEnv env env -> Grammar a+removeFix start productions       = case runTrafo (remfixtrafo productions) Unit () of             Result _ (T tt) gram ->                   Grammar (tt start) gram -remfixtrafo :: GramEnv env env -        -> Trafo Unit (Productions TL) s () (T env s)+remfixtrafo :: PreGramEnv env env +        -> Trafo Unit (Productions NF) s () (T env s) remfixtrafo productions = proc _ ->             do   rec  let tenv_s = map2trans menv_s                       menv_s <- (remfixProds productions) -< tenv_s                  returnA -< tenv_s  -remfixProds  ::  GramEnv env env' -             ->  Trafo  Unit (Productions TL) s (T env s) +remfixProds  ::  PreGramEnv env env' +             ->  Trafo  Unit (Productions NF) s (T env s)                                                  (Mapping env' s) remfixProds Empty                = proc _ ->@@ -39,13 +40,12 @@   -remfixProd  :: Prod l a env -            -> Trafo Unit (Productions TL) s (T env s) (Prod l a s)+remfixProd  :: Prod TL a env +            -> Trafo Unit (Productions NF) s (T env s) (Prod NF a s)  remfixProd (Fix (PS ps))       = proc tenv_s ->-        do  rec  ps' <- sequenceA (map remfixProd ps) -< tenv_s-                 r   <- newSRef -<  PS (map (remVar r) ps')     +        do  rec  r   <- newSRef -<  PS (map (remVar r tenv_s) ps)                  returnA -< (Sym $ Nont r)  remfixProd (Star f g) @@ -53,26 +53,34 @@         do  f' <- remfixProd f -< tenv_s             g' <- remfixProd g -< tenv_s             returnA -< Star f' g'-+{- remfixProd (FlipStar f g)       = proc tenv_s ->         do  f' <- remfixProd f -< tenv_s             g' <- remfixProd g -< tenv_s             returnA -< FlipStar f' g'--remfixProd p +-}+remfixProd (Sym s)       = proc tenv_s ->-        do  returnA -< mapProd tenv_s p+        do  returnA -< Sym $ mapSym tenv_s s +remfixProd (Pure x) +     = proc _ ->+        do  returnA -< Pure x  -remVar  :: Ref b env -> Prod (FL b) a env -> Prod TL a env-remVar _ (Sym s)             = Sym s -remVar _ (Pure x)            = Pure x-remVar r  (Star f g)         = Star (remVar r f) (remVar r g)-remVar r  (FlipStar f g)     = FlipStar (remVar r f) (remVar r g)-remVar r  Var                = Sym (Nont r) --remVar _ (Fix _)             = error "RemoveFix(1): error in the transformation!!!"+mapSym :: T env1 env2 -> Symbol a t env1 -> Symbol a t env2+mapSym t (Nont x)      = Nont (unT t x)+mapSym _ (Term x)      = Term x+mapSym _ TermInt       = TermInt +mapSym _ TermChar      = TermChar +mapSym _ TermVarid     = TermVarid +mapSym _ TermConid     = TermConid +mapSym _ TermOp        = TermOp  +remVar  :: Ref b s -> T env s -> Prod (FL b) a env -> Prod NF a s+remVar _  t  (Sym s)             = Sym $ mapSym t s +remVar _  _  (Pure x)            = Pure x+remVar r  t  (Star f g)          = Star (remVar r t f) (remVar r t g)+remVar r  _  Var                 = Sym (Nont r)