packages feed

SyntaxMacros 0.2 → 1.0

raw patch · 18 files changed

+950/−513 lines, 18 filesdep +HListbinary-addedPVP ok

version bump matches the API change (PVP)

Dependencies added: HList

API changes (from Hackage documentation)

- Language.Grammars.Grammar: (<.>) :: (ProdSeq a b c d) => a env -> b env -> PreProd c d env
- Language.Grammars.Grammar: DTerm :: DTerm
- Language.Grammars.Grammar: EP :: a -> (b env) -> EP a b env
- Language.Grammars.Grammar: End :: a -> Prod a env
- Language.Grammars.Grammar: NontChar :: Symbol Char TAttT env
- Language.Grammars.Grammar: NontConid :: Symbol String TAttT env
- Language.Grammars.Grammar: NontInt :: Symbol Int TAttT env
- Language.Grammars.Grammar: NontOp :: Symbol String TAttT env
- Language.Grammars.Grammar: NontVarid :: Symbol String TAttT env
- Language.Grammars.Grammar: PreProd :: (a -> (Prod b env)) -> PreProd a b env
- Language.Grammars.Grammar: Seq :: Symbol b t env -> Prod (b -> a) env -> Prod a env
- Language.Grammars.Grammar: append :: (a -> b -> c) -> Prod a env -> Symbol b t env -> Prod c env
- Language.Grammars.Grammar: class ProdSeq a b c d | a c -> b d
- Language.Grammars.Grammar: data DTerm
- Language.Grammars.Grammar: data EP a b env
- Language.Grammars.Grammar: data PreProd a b 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: 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: (^=) :: nt -> (Symbol a TNonT env) -> NTField nt a env
- Language.Grammars.SyntaxMacros: NTField :: (Symbol a TNonT env) -> NTField nt a env
- Language.Grammars.SyntaxMacros: instance [overlap ok] (Fail (Duplicated nt)) => NotDuplicated nt (NTCons nt v l env)
- Language.Grammars.SyntaxMacros: instance [overlap ok] (Fail (NotFound nt)) => GetNT nt (NTNil env) r
- Language.Grammars.SyntaxMacros: instance [overlap ok] (GetNT nt1 (l env) r) => GetNT nt1 (NTCons nt2 v l env) r
- Language.Grammars.SyntaxMacros: instance [overlap ok] (NotDuplicated nt1 (l env)) => NotDuplicated nt1 (NTCons nt2 v l env)
- Language.Grammars.SyntaxMacros: instance [overlap ok] (Show a) => Show (ParseResult a)
- Language.Grammars.SyntaxMacros: labelNTField :: NTField nt a env -> nt
- Language.Grammars.SyntaxMacros: newtype NTField nt a env
- Language.Grammars.SyntaxMacros: symbolNTField :: NTField nt a env -> (Symbol a TNonT env)
+ Language.Grammars.Grammar: (^=) :: nt -> Symbol a t env -> LSPair nt a t env
+ Language.Grammars.Grammar: Fix :: Productions (FL a) a env -> Prod l a env
+ Language.Grammars.Grammar: FlipStar :: Prod l a env -> Prod l (a -> b) env -> Prod l b env
+ Language.Grammars.Grammar: Ii :: Ii
+ Language.Grammars.Grammar: LSPair :: (Symbol a t env) -> LSPair nt a t env
+ Language.Grammars.Grammar: PP :: [Prod l a env] -> ListProd l env a
+ Language.Grammars.Grammar: Pure :: a -> Prod l a env
+ Language.Grammars.Grammar: Star :: Prod l (a -> b) env -> Prod l a env -> Prod l b env
+ Language.Grammars.Grammar: Sym :: Symbol a t env -> Prod l a env
+ Language.Grammars.Grammar: TermChar :: Symbol Char TAttT env
+ Language.Grammars.Grammar: TermConid :: Symbol String TAttT env
+ Language.Grammars.Grammar: TermInt :: Symbol Int TAttT env
+ Language.Grammars.Grammar: TermOp :: Symbol String TAttT env
+ Language.Grammars.Grammar: TermVarid :: Symbol String TAttT env
+ Language.Grammars.Grammar: Var :: Prod (FL a) a env
+ Language.Grammars.Grammar: class Idiomatic l env f g | g -> f l env
+ Language.Grammars.Grammar: class LabelSymbol t v v' | t v -> v'
+ Language.Grammars.Grammar: class ShowEnv a
+ Language.Grammars.Grammar: data FL a
+ Language.Grammars.Grammar: data Ii
+ Language.Grammars.Grammar: data TL
+ Language.Grammars.Grammar: fixPrd :: ListProd (FL a) env a -> ListProd l env a
+ Language.Grammars.Grammar: iI :: Idiomatic l env (a -> a) g => g
+ Language.Grammars.Grammar: idiomatic :: Idiomatic l env f g => ListProd l env f -> g
+ 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 -> b) -> f) ((a -> b) -> g)
+ 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 f g => Idiomatic l env f (String -> g)
+ Language.Grammars.Grammar: instance Idiomatic l env x (Ii -> ListProd l env x)
+ Language.Grammars.Grammar: instance LabelSymbol TAttT v (Record HNil -> v)
+ Language.Grammars.Grammar: instance LabelSymbol TNonT v v
+ Language.Grammars.Grammar: instance LabelSymbol TTerm v v
+ 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: labelLSPair :: LSPair nt a t env -> nt
+ Language.Grammars.Grammar: newtype LSPair nt a t env
+ Language.Grammars.Grammar: newtype ListProd l env a
+ Language.Grammars.Grammar: nt :: Symbol a TNonT env -> ListProd l env a
+ Language.Grammars.Grammar: ntPrd :: Symbol a TNonT env -> ListProd l env a
+ Language.Grammars.Grammar: pMany :: ListProd (FL [a]) env a -> ListProd l env [a]
+ Language.Grammars.Grammar: pSome :: ListProd (FL [a]) env a -> ListProd l env [a]
+ Language.Grammars.Grammar: prod :: ListProd l env a -> Productions l a env
+ 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: sym :: Symbol a t env -> ListProd l env a
+ Language.Grammars.Grammar: symLSPair :: LSPair nt a t env -> (Symbol a t env)
+ Language.Grammars.Grammar: toFL :: ListProd l env a -> ListProd (FL b) env a
+ Language.Grammars.Grammar: tr :: String -> ListProd l env DTerm
+ Language.Grammars.Grammar: type DTerm = String
+ Language.Grammars.Grammar: type GramEnv = Env (Productions TL)
+ Language.Grammars.Grammar: unPP :: ListProd l env a -> [Prod l a env]
+ Language.Grammars.Grammar: varPrd :: ListProd (FL a) env 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: export :: (NTRecord (l env), NotDuplicated nt (l env)) => nt -> Symbol a TNonT env -> l env -> NTCons nt a l env
+ Language.Grammars.SyntaxMacros: exportList :: Symbol start TNonT env -> (NTNil env -> nts env) -> Export start nts env
+ Language.Grammars.SyntaxMacros: getStart :: Export start nts env -> (Symbol start TNonT env)
+ Language.Grammars.SyntaxMacros: instance [overlap ok] Fail (Duplicated nt) => NotDuplicated nt (NTCons nt v l env)
+ Language.Grammars.SyntaxMacros: instance [overlap ok] Fail (NotFound nt) => GetNT nt (NTNil env) r
+ Language.Grammars.SyntaxMacros: instance [overlap ok] GetNT nt (nts env) r => GetNT nt (Export start nts env) r
+ Language.Grammars.SyntaxMacros: instance [overlap ok] GetNT nt1 (l env) r => GetNT nt1 (NTCons nt2 v l env) r
+ Language.Grammars.SyntaxMacros: instance [overlap ok] NotDuplicated nt1 (l env) => NotDuplicated nt1 (NTCons nt2 v l env)
+ Language.Grammars.SyntaxMacros: instance [overlap ok] Show a => Show (ParseResult a)
- Language.Grammars.Grammar: (<=>) :: a -> b env -> EP a b env
+ Language.Grammars.Grammar: (<=>) :: LabelSymbol t v v' => label -> Symbol v t env -> ListProd l env (LVPair label v')
- Language.Grammars.Grammar: Grammar :: (Ref a env) -> (Env Productions env env) -> Grammar a
+ Language.Grammars.Grammar: Grammar :: (Ref a env) -> (GramEnv env env) -> Grammar a
- Language.Grammars.Grammar: PS :: [Prod a env] -> Productions a env
+ Language.Grammars.Grammar: PS :: [Prod l a env] -> Productions l a env
- Language.Grammars.Grammar: data Prod a env
+ Language.Grammars.Grammar: data Prod l a env
- Language.Grammars.Grammar: newtype Productions a env
+ Language.Grammars.Grammar: newtype Productions l a env
- Language.Grammars.Grammar: unPS :: Productions a env -> [Prod a env]
+ Language.Grammars.Grammar: unPS :: Productions l a env -> [Prod l a env]
- Language.Grammars.SyntaxMacros: (^|) :: (NTRecord (NTCons nt a l env)) => NTField nt a env -> l env -> NTCons nt a l env
+ Language.Grammars.SyntaxMacros: (^|) :: NTRecord (NTCons nt a l env) => LSPair nt a TNonT env -> l env -> NTCons nt a l env
- Language.Grammars.SyntaxMacros: NTCons :: (NTField nt v env) -> (l env) -> NTCons nt v l env
+ Language.Grammars.SyntaxMacros: NTCons :: (LSPair nt v TNonT env) -> (l env) -> NTCons nt v l env
- Language.Grammars.SyntaxMacros: addNT :: GramTrafo env [Prod a env] (Symbol a TNonT env)
+ Language.Grammars.SyntaxMacros: addNT :: GramTrafo env (ListProd TL env a) (Symbol a TNonT env)
- Language.Grammars.SyntaxMacros: addProds :: GramTrafo env (Symbol a TNonT env, [Prod a env]) ()
+ Language.Grammars.SyntaxMacros: addProds :: GramTrafo env (Symbol a TNonT env, ListProd TL env a) ()
- Language.Grammars.SyntaxMacros: closeGram :: (forall env. ExtGram env (Export a nts)) -> Grammar a
+ Language.Grammars.SyntaxMacros: closeGram :: (forall env. ExtGram env a nts) -> Grammar 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) => GramTrafo env (Export start nts env) (Export start nts env)
- Language.Grammars.SyntaxMacros: extendGram :: (NTRecord (nts env), NTRecord (nts' env)) => ExtGram env (Export start nts) -> SyntaxMacro env (Export start nts) (Export start' nts') -> ExtGram env (Export start' nts')
+ Language.Grammars.SyntaxMacros: extendGram :: (NTRecord (nts env), NTRecord (nts' env)) => ExtGram env start nts -> SyntaxMacro env start nts start' nts' -> ExtGram env start' nts'
- Language.Grammars.SyntaxMacros: getNT :: (GetNT nt r v) => nt -> r -> v
+ Language.Grammars.SyntaxMacros: getNT :: GetNT nt r v => nt -> r -> v
- Language.Grammars.SyntaxMacros: pTerm :: (IsParser p Token) => String -> p DTerm
+ Language.Grammars.SyntaxMacros: pTerm :: IsParser p Token => String -> p DTerm
- Language.Grammars.SyntaxMacros: type ExtGram env nts = GramTrafo env () (nts env)
+ Language.Grammars.SyntaxMacros: type ExtGram env start nts = GramTrafo env () (Export start nts env)
- Language.Grammars.SyntaxMacros: type GramTrafo = Trafo Unit Productions
+ Language.Grammars.SyntaxMacros: type GramTrafo = Trafo Unit (Productions TL)
- Language.Grammars.SyntaxMacros: type SyntaxMacro env nts nts' = GramTrafo env (nts env) (nts' env)
+ Language.Grammars.SyntaxMacros: type SyntaxMacro env start nts start' nts' = GramTrafo env (Export start nts env) (Export start' nts' env)
- Language.Grammars.SyntaxMacros.Scanner: pBracks :: (IsParser p Token) => p a -> p a
+ Language.Grammars.SyntaxMacros.Scanner: pBracks :: IsParser p Token => p a -> p a
- Language.Grammars.SyntaxMacros.Scanner: pBracks_pCommas :: (IsParser p Token) => p a -> p [a]
+ Language.Grammars.SyntaxMacros.Scanner: pBracks_pCommas :: IsParser p Token => p a -> p [a]
- Language.Grammars.SyntaxMacros.Scanner: pCBrack :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pCBrack :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCBrackPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pCBrackPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pCCurly :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pCCurly :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCCurlyPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pCCurlyPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pCParen :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pCParen :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCParenPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pCParenPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pChar :: (IsParser p Token) => p String
+ 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: pCharPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pComma :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pComma :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pCommaPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pCommaPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pCommas :: (IsParser p Token) => p a -> p [a]
+ Language.Grammars.SyntaxMacros.Scanner: pCommas :: IsParser p Token => p a -> p [a]
- Language.Grammars.SyntaxMacros.Scanner: pConid :: (IsParser p Token) => p String
+ 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: pConidPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pConsym :: (IsParser p Token) => p String
+ 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: pConsymPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pCurly :: (IsParser p Token) => p a -> p a
+ Language.Grammars.SyntaxMacros.Scanner: pCurly :: IsParser p Token => p a -> p a
- Language.Grammars.SyntaxMacros.Scanner: pCurly_pSemics :: (IsParser p Token) => p a -> p [a]
+ Language.Grammars.SyntaxMacros.Scanner: pCurly_pSemics :: IsParser p Token => p a -> p [a]
- Language.Grammars.SyntaxMacros.Scanner: pFraction :: (IsParser p Token) => p String
+ 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: pFractionPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pInteger :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pInteger10 :: (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: pInteger10Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger16 :: (IsParser p Token) => p String
+ 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: pInteger16Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pInteger8 :: (IsParser p Token) => p String
+ 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: pInteger8Pos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pIntegerPos :: (IsParser p Token) => p (String, Pos)
+ Language.Grammars.SyntaxMacros.Scanner: pIntegerPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pKey :: (IsParser p Token) => String -> p String
+ Language.Grammars.SyntaxMacros.Scanner: pKey :: IsParser p Token => String -> p String
- Language.Grammars.SyntaxMacros.Scanner: pKeyPos :: (IsParser p Token) => String -> p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pKeyPos :: IsParser p Token => String -> p Pos
- Language.Grammars.SyntaxMacros.Scanner: pOBrack :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pOBrack :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOBrackPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pOBrackPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pOCurly :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pOCurly :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOCurlyPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pOCurlyPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pOParen :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pOParen :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pOParenPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pOParenPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pParens :: (IsParser p Token) => p a -> p a
+ Language.Grammars.SyntaxMacros.Scanner: pParens :: IsParser p Token => p a -> p a
- Language.Grammars.SyntaxMacros.Scanner: pParens_pCommas :: (IsParser p Token) => p a -> p [a]
+ Language.Grammars.SyntaxMacros.Scanner: pParens_pCommas :: IsParser p Token => p a -> p [a]
- Language.Grammars.SyntaxMacros.Scanner: pSemi :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pSemi :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pSemiPos :: (IsParser p Token) => p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pSemiPos :: IsParser p Token => p Pos
- Language.Grammars.SyntaxMacros.Scanner: pSemics :: (IsParser p Token) => p a -> p [a]
+ Language.Grammars.SyntaxMacros.Scanner: pSemics :: IsParser p Token => p a -> p [a]
- Language.Grammars.SyntaxMacros.Scanner: pSpec :: (IsParser p Token) => Char -> p String
+ Language.Grammars.SyntaxMacros.Scanner: pSpec :: IsParser p Token => Char -> p String
- Language.Grammars.SyntaxMacros.Scanner: pSpecPos :: (IsParser p Token) => Char -> p Pos
+ Language.Grammars.SyntaxMacros.Scanner: pSpecPos :: IsParser p Token => Char -> p Pos
- Language.Grammars.SyntaxMacros.Scanner: pString :: (IsParser p Token) => p String
+ 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: pStringPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pTextln :: (IsParser p Token) => p String
+ 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: pTextlnPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pTextnm :: (IsParser p Token) => p String
+ 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: pTextnmPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pVarid :: (IsParser p Token) => p String
+ 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: pVaridPos :: IsParser p Token => p (String, Pos)
- Language.Grammars.SyntaxMacros.Scanner: pVarsym :: (IsParser p Token) => p String
+ Language.Grammars.SyntaxMacros.Scanner: pVarsym :: IsParser p Token => p String
- Language.Grammars.SyntaxMacros.Scanner: pVarsymPos :: (IsParser p Token) => p (String, Pos)
+ Language.Grammars.SyntaxMacros.Scanner: pVarsymPos :: IsParser p Token => p (String, Pos)

Files

SyntaxMacros.cabal view
@@ -1,5 +1,6 @@ name:               SyntaxMacros -version:            0.2+version:            1.0+cabal-version:      >= 1.2.3   license:            LGPL license-file:       COPYRIGHT maintainer:         Marcos Viera <mviera@fing.edu.uy>@@ -10,23 +11,25 @@ category:           Development  stability:          Experimental copyright:          Universiteit Utrecht-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-cabal-version:      >= 1.2.3  -exposed-modules:    Language.Grammars.Grammar, -                    Language.Grammars.SyntaxMacros, -                    Language.Grammars.SyntaxMacros.Scanner-other-modules:      Language.Grammars.SyntaxMacros.Machine, -                    Language.Grammars.SyntaxMacros.Token, -                    Language.Grammars.SyntaxMacros.TokenParser, -                    Language.Grammars.SyntaxMacros.ScanUtils, -                    Language.Grammars.SyntaxMacros.Utils, -                    Language.Grammars.Transformations.GramTrafo,-                    Language.Grammars.Transformations.LeftCorner,-                    Language.Grammars.Transformations.LeftFact-extensions:         EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies,-                    MultiParamTypeClasses, RankNTypes, ScopedTypeVariables,-                    TypeSynonymInstances, UndecidableInstances, GADTs-hs-source-dirs:     src extra-source-files: README, LICENSE-LGPL -ghc-options:        -Wall+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+        exposed-modules:    Language.Grammars.Grammar, +                            Language.Grammars.SyntaxMacros, +                            Language.Grammars.SyntaxMacros.Scanner+        other-modules:      Language.Grammars.SyntaxMacros.Machine, +                            Language.Grammars.SyntaxMacros.Token, +                            Language.Grammars.SyntaxMacros.TokenParser, +                            Language.Grammars.SyntaxMacros.ScanUtils, +                            Language.Grammars.SyntaxMacros.Utils, +                            Language.Grammars.Transformations.GramTrafo,+                            Language.Grammars.Transformations.RemoveEmpties,+                            Language.Grammars.Transformations.RemoveFix,+                            Language.Grammars.Transformations.LeftCorner+        extensions:         EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies,+                            MultiParamTypeClasses, RankNTypes, ScopedTypeVariables,+                           TypeSynonymInstances, UndecidableInstances, GADTs+        hs-source-dirs:     src+        ghc-options:        -Wall+
examples/LangDef.hs view
@@ -1,13 +1,13 @@-{-# LANGUAGE  Arrows, DoRec, EmptyDataDecls, FlexibleContexts #-}+{-# OPTIONS -fcontext-stack=100 #-} +{-# LANGUAGE  Arrows, DoRec #-}+ module LangDef where  import qualified Data.Set as Set  import Control.Arrow -import UU.Pretty- import Language.Grammars.SyntaxMacros import Language.Grammars.Grammar @@ -16,28 +16,57 @@ import LangSem import Utils +import Control.Applicative +import Data.HList++import UU.Pretty.Basic++ 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 ]+         rec     root    <- addNT -<  (iI (`semAGItf` emptyRecord) (ch_expr <=> exp) Ii)+                 exp     <- addNT -<  (iI semLet "let" (ch_lnm   <=> var)  "=" (ch_val <=> exp) "in" (ch_body <=> exp) Ii)+                                      <|>+                                      (iI semAdd (ch_ae1  <=>  exp) "+" (ch_ae2 <=> term) Ii)+                                      <|>+                                      ntPrd term+                 term    <- addNT -<  (iI semMul (ch_me1  <=>  term)  "*"  (ch_me2 <=> factor) Ii)+                                      <|>+                                      ntPrd factor -              factor  <- addNT -<  [  prd semCst $ ch_cv<=>int  <.> prdEnd -                                   ,  prd semVar $ ch_vnm<=>var <.> prdEnd ]+                 factor  <- addNT -<  (iI semCst (ch_cv <=> int) Ii)+                                      <|> +                                      (iI semVar (ch_vnm <=> var) Ii) -         exportNTs -< Export root $   ntExp     ^=  exp     ^| -                                      ntTerm    ^=  term    ^|-                                      ntFactor  ^=  factor  ^|  -                                      ntNil +         exportNTs -< exportList root  $   export ntExp     exp +                                       .   export ntTerm    term +                                       .   export ntFactor  factor  + +{-+-- another possible version+prds = proc () -> do +         rec     root    <- addNT -<  (`semAGItf` emptyRecord) <$> ch_expr <=> exp+                 exp     <- addNT -<  semLet <$  tr "let" <*>  ch_lnm   <=> var  <*  tr "=" <*> ch_val <=> exp <* tr "in"  <*>  ch_body <=> exp+                                      <|>+                                      semAdd <$>  ch_ae1  <=>  exp   <* tr "+"  <*>  ch_ae2 <=> term+                                      <|>+                                      ntPrd term+                 term    <- addNT -<  semMul <$>  ch_me1  <=>  term  <* tr "*"  <*>  ch_me2 <=> factor+                                      <|>+                                      ntPrd factor +                 factor  <- addNT -<  semCst <$>  ch_cv <=> int+                                      <|> +                                      semVar <$>  ch_vnm <=> var +         exportNTs -< exportList root  $   export ntExp     exp +                                       .   export ntTerm    term +                                       .   export ntFactor  factor  ++-}+ gramOpts :: ScanOpts gramOpts   =  defaultScanOpts@@ -45,4 +74,5 @@         ,   scoSpecChars        =   Set.fromList "=+*"         ,   scoDollarIdent      =   True         }+  
examples/LangExt.hs view
@@ -1,4 +1,6 @@-{-# LANGUAGE  Arrows, DoRec, EmptyDataDecls, FlexibleContexts, TemplateHaskell, NoMonomorphismRestriction #-}+{-# OPTIONS -fcontext-stack=100 #-}+{-# LANGUAGE  Arrows, DoRec, EmptyDataDecls, FlexibleContexts, TemplateHaskell, NoMonomorphismRestriction,+    RankNTypes #-}  module LangExt where @@ -17,41 +19,64 @@ import LangSem import Utils +import Control.Applicative+ 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)   +--Syntax Macro 1 --------------------------------------------------------------  -semSq r = knit (sppSq `ext` aspMul)  -               (ch_me1 .=. (r # ch_se) .*. ch_me2 .=. (r # ch_se) .*. emptyRecord)+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))  -$(chLabels ["pe1","pe2"] ''T_Expr)+--Square+$(chLabel "se" ''T_Expr) -sppPyth  = synM spp  $ do  ae1 <- at ch_ae1-                           ae2 <- at ch_ae2 -                           return $ "pyth " >|< (ae1 # spp) >|< " "-                                            >|< (ae2 # spp)   +sppSq = synM spp $ do me1 <- at ch_se +                      return $ "square" >#< (me1 # spp)    -svalPyth = synM sval $ do  ae1 <- at ch_ae1-                           ae2 <- at ch_ae2-                           return  $ (\p1 p2 -> p1 * p1 + p2 * p2 )(ae1 # sval) (ae2 # sval)     +se2m r = (ch_me1 .=. (r # ch_se) .*. ch_me2 .=. (r # ch_se) .*. emptyRecord)+m2se r = (ch_se .=. (r # ch_me1) .*. emptyRecord) -semPyth r = knit (sppPyth `ext` svalPyth `ext` aspAdd) -                 (ch_ae1 .=. (r # ch_pe1) .*. ch_ae2 .=. (r # ch_pe2) .*. emptyRecord)+aspSq = sppSq `ext` (adapt aspMul se2m se2m m2se)+semSq = \s -> knit aspSq (s .*. emptyRecord)    +--Pyth+$(chLabels ["pe1","pe2"] ''T_Expr) +sppSq' = synM spp $ do liftM (# spp) (at ch_se) +aspSq' = sppSq' `ext` aspSq  +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_ae1 +                          aspSq' +                          (ch_se .=. ch_pe1 .*. hNil))+                  (ch_pe1 .=. ch_pe1 .*. hNil)+                  ch_ae2+                  aspSq' +                  (ch_se .=. ch_pe2 .*. hNil)++aspPyth    = sppPyth `ext` aspAdd'+semPyth = \p1 p2 -> knit  aspPyth (p1 .*. p2 .*. emptyRecord)  +                ++--Parenthesis $(chLabel "pe" ''T_Expr)  sppPar  = syn spp  $ do  pe <- at ch_pe@@ -59,44 +84,111 @@ svalPar = syn sval $ do  liftM (# sval) (at ch_pe) ienvPar = copy ienv exprNT +aspPar = sppPar `ext` ienvPar `ext` svalPar    -semPar = knit (sppPar `ext` ienvPar `ext` svalPar)+semPar = \e -> knit aspPar (e .*. emptyRecord)  +--Substitution 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+semSubst = \l v b -> knit (sppSubst `ext` aspLet) (l .*. v .*. b .*. emptyRecord)   ---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))+--Grammar Extension+prds'  ::  ( NTRecord (nts env) +           , GetNT NTExp    (nts env)  (Symbol AttExpr TNonT env)+           , GetNT NTTerm   (nts env)  (Symbol AttExpr TNonT env)+           , GetNT NTFactor (nts env)  (Symbol AttExpr TNonT env)) +       =>    SyntaxMacro env start nts start nts+prds' = proc imported -> do+         let exp     = getNT ntExp     imported+         let term    = getNT ntTerm    imported+         let factor  = getNT ntFactor  imported +         addProds   -<  (exp,     ( iI semSubst  (ch_body <=> exp) "[" (ch_lnm <=> var) "|" (ch_val <=> exp) "]" Ii)) -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    ])+         addProds   -<  (term,    ( iI semSq     "square"  (ch_se  <=> factor) Ii) <|>+                                  ( iI semPyth   "pyth"    (ch_pe1 <=> factor) (ch_pe2 <=> factor) Ii))  --         let factor  = getNT ntFactor  nts-         addProds   -<  (factor,  [  prd semPar $ trm "(" <.> ch_pe<=>exp <.> trm ")" <.>  prdEnd  ])+         addProds   -<  (factor,  ( iI semPar    "(" (ch_pe <=> exp) ")" Ii )    )          -         exportNTs  -< (Export root nts)+         exportNTs  -< imported ++ gramOpts' gramOpts = gramOpts `extKeywordsTxt` [ "square", "pyth" ] `extSpecChars` "()[|]"++++--Syntax Macro 2 --------------------------------------------------------------++--Double+$(chLabel "de" ''T_Expr)++aspTwo = fixCst aspCst ch_cv 2++aspMul' =  graft  aspMul+                  (ch_me2 .=. ch_de .*. hNil) +                  ch_me1+                  aspTwo+                  hNil ++sppDb = synM spp $ do de <- at ch_de +                      return $ "double" >#< (de # spp)   ++aspDb = sppDb `ext` aspMul'+                +semDb = \d -> knit aspDb (d .*. emptyRecord)++           +++--AddMul+$(chLabels ["am1","am2","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_ae2 +                                    aspMul+                                    (ch_me1 .=. ch_am2 .*. ch_me2 .=. ch_am3 .*. hNil)+ +semAddMul = \p1 p2 p3 -> knit aspAddMul (p1 .*. p2 .*. p3 .*. emptyRecord)+                          +++--Grammar Extension++prds''  ::    ( NTRecord (nts env) +              , GetNT NTTerm   (nts env)  (Symbol AttExpr TNonT env)+              , GetNT NTFactor (nts env)  (Symbol AttExpr TNonT env)) +       =>    SyntaxMacro env start nts start nts+prds'' = proc imported -> do+         let term    = getNT ntTerm    imported+         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))++         +         exportNTs  -< imported++++gramOpts'' gramOpts = gramOpts `extKeywordsTxt` [ "double", "addmul" ] `extSpecChars` "()[|]"+   
examples/LangSem.hs view
@@ -23,7 +23,7 @@              |  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+          deriving Show   @@ -91,11 +91,11 @@ 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  +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)  
examples/Main.hs view
@@ -6,8 +6,8 @@  import LangDef import LangSem-import LangExt +import LangExt  import Language.Grammars.SyntaxMacros import Language.Grammars.SyntaxMacros.Scanner@@ -19,14 +19,18 @@  test1 = do         tokens <- scanFile gramOpts "prog.src"-        let (Ok res) = (parse . compile ) gram tokens-        print $ res # spp-        print $ res # sval+        let r = (parse . compile ) gram tokens +        case ( parse . compile ) gram tokens of+           (Ok res) -> do print $ res # spp+                          print $ res # sval+           (Rep _ err) -> print err  -gram' = closeGram (extendGram prds prds')  ++gram' = closeGram (prds <++> prds') + test2 = do         tokens <- scanFile (gramOpts' gramOpts) "prog2.src"         case ( parse . compile ) gram' tokens of@@ -34,7 +38,15 @@                           print $ res # sval            (Rep _ err) -> print err +gram'' = closeGram (prds <++> prds' <++> prds'')  -main = test1 >> test2 +test3 = do+        tokens <- scanFile ((gramOpts'' . gramOpts') gramOpts) "prog3.src"+        case ( parse . compile ) gram'' tokens of+           (Ok res) -> do print $ res # spp+                          print $ res # sval+           (Rep _ err) -> print err ++main = test1 >> test2 >> test3 
− examples/README.txt
@@ -1,9 +0,0 @@-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/prog2.src view
@@ -1,1 +1,1 @@-let letter= pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + square 4)+let letter= pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + square 2)
+ examples/prog3.src view
@@ -0,0 +1,1 @@+let letter= pyth ( 2 + 1) 3 in ( (x + 1) [x | 10]) * (letter + addmul 2 3 4 + square ( double 3 ))
− examples/test
@@ -1,5 +0,0 @@-cd ..-runghc Setup.hs build-sudo runghc Setup.hs install-cd examples-ghci Main
− pru.hs
@@ -1,11 +0,0 @@-{-# 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.swp view

binary file changed (absent → 24576 bytes)

src/Language/Grammars/Grammar.hs view
@@ -1,26 +1,46 @@-{-# LANGUAGE ExistentialQuantification, GADTs, EmptyDataDecls, -    MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts, UndecidableInstances  #-}+{-# LANGUAGE ExistentialQuantification, GADTs, EmptyDataDecls,+    MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, FlexibleContexts, UndecidableInstances #-}  module Language.Grammars.Grammar where  import Language.AbstractSyntax.TTTAS-import Language.Grammars.AspectAG hiding (append)+import Data.HList +import Control.Applicative+import Unsafe.Coerce ++-------------------------------------------+-- GRAMMAR REPRESENTATION+-------------------------------------------++data TL+data FL a++ data Grammar a     = forall env . Grammar  (Ref a env)  -                          (Env Productions env env)+                          (GramEnv env env) -newtype Productions a env -  = PS {unPS :: [Prod a env]}+type GramEnv = Env (Productions TL) -data Prod a env where-      Seq   ::  Symbol    b  t     env  ->  Prod   (b -> a)  env  -                                        ->  Prod   a         env-      End   ::  a                       ->  Prod   a         env+newtype Productions l a env +  = PS {unPS :: [Prod l a env]} -data DTerm = DTerm+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 +      Fix       ::  Productions (FL a) a env               ->  Prod l      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+ data TTerm data TNonT data TAttT@@ -30,13 +50,14 @@    Nont    :: Ref a env ->  Symbol  a        TNonT   env   -- attributed terminals-  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 +  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    --- TODO: the rest of EnumValToken + getRefNT :: Symbol a TNonT env -> Ref a env getRefNT (Nont ref) = ref @@ -49,82 +70,194 @@           ->  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-matchSym NontConid  NontConid            = Just Eq-matchSym NontOp     NontOp               = Just Eq+matchSym TermInt    TermInt              = Just Eq+matchSym TermVarid  TermVarid            = Just Eq+matchSym TermConid  TermConid            = Just Eq+matchSym TermOp     TermOp               = Just Eq matchSym _          _                    = Nothing  -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)-- 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   =  NontInt-char  =  NontChar-var   =  NontVarid-con   =  NontConid-op    =  NontOp+int   =  TermInt+char  =  TermChar+var   =  TermVarid+con   =  TermConid+op    =  TermOp  -data EP a b env = EP a (b env)+------------------------+-- 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  s = PP [ Sym $ s ]++nt :: Symbol a  TNonT  env -> ListProd l env a+nt s = sym s++ntPrd :: Symbol a  TNonT  env -> ListProd l env a+ntPrd s =  id <$> nt s+ ++tr ::  String -> ListProd l env DTerm+tr s = PP [ Sym $ Term s ]+++varPrd   ::  ListProd (FL a) env a+varPrd    = PP [ Var ]+fixPrd  ::  ListProd (FL a) env a -> ListProd l env a+fixPrd p  = PP [ (Fix . prod) p ]+++instance Functor (ListProd l env) where+ fmap f (PP p) = PP [ Star (Pure f) p' | p' <- p ]++instance Applicative (ListProd 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+ empty = PP []+ + (PP f) <|> (PP g) = PP (f ++ g)++ some p = fixPrd (one <|> more)+     where  one  = (:[]) <$> toFL p +            more = (:)   <$> toFL p <*> varPrd+++ many p = fixPrd (none <|> more) +     where  none = pure [] +            more = (:)   <$> toFL p <*> varPrd++toFL :: ListProd l env a -> ListProd (FL b) env a+toFL (PP p) = PP $ map prodToFL p++prodToFL :: Prod l a env -> Prod (FL b) a env+prodToFL (Star      f  g)  = Star      (prodToFL f) (prodToFL g)+prodToFL (FlipStar  f  g)  = FlipStar  (prodToFL f) (prodToFL g)+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+++pSome :: ListProd (FL [a]) env a -> ListProd l env [a]+pSome p = fixPrd (one <|> more)+     where  one  = (:[]) <$> p +            more = (:)   <$> p <*> varPrd++pMany :: ListProd (FL [a]) env a -> ListProd l env [a]+pMany p = fixPrd (none <|> more)+     where  none = pure [] +            more = (:)   <$> p <*> varPrd+++------------------------+-- IDIOMS++-- | The  `Ii` is to be pronounced as @stop@+data Ii = Ii ++-- | 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++instance  Idiomatic l env x  (Ii -> ListProd 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+    idiomatic isf is = idiomatic (isf <*> is)++instance Idiomatic l env f g => Idiomatic l env ((a -> b) -> f)  ((a -> b) -> g) where+    idiomatic isf f = idiomatic (isf <*> (pure f))++instance (Idiomatic  l env f g) +       => Idiomatic  l env f (String -> g) where+    idiomatic isf str = idiomatic (isf <* (tr str))+++-------------------------------------------------------------------------------+++newtype  LSPair nt a t env = LSPair { symLSPair :: (Symbol a t env) }  ++labelLSPair :: LSPair nt a t env -> nt+labelLSPair _ = undefined++infixr 6 ^= +(^=) :: nt -> Symbol a t env -> LSPair nt a t env+(^=) _ = LSPair+ infixr 6 <=> -(<=>) ::  a -> b env -> EP a b env-(<=>) = EP+class LabelSymbol t v v' | t v -> v' where + (<=>) :: label -> Symbol v t env -> ListProd l env (LVPair label v')  -infixr 5 <.>+instance LabelSymbol TAttT v (Record HNil -> v) where+ l <=> v =  (\x -> l .=. (\(Record HNil) -> x)) <$> (PP [ Sym v ]) -data PreProd a b env = PreProd (a -> (Prod b env))+instance LabelSymbol TNonT v v where+ l <=> v =  (l .=.) <$> (PP [ Sym v ]) -class ProdSeq a b c d | a c -> b d  where-  (<.>) :: a env -> b env -> PreProd c d env+instance LabelSymbol TTerm v v where -- only to have all the instances+ l <=> v =  (l .=.) <$> (PP [ Sym v ]) -instance (HExtend (LVPair t v) l l') => ProdSeq  -        (EP t (Symbol b TNonT))-        (PreProd (l -> v -> t2) (b -> a))-        (l' -> t2)-        a where -  (EP chn s)   <.>  (PreProd ps) = PreProd $ -         \f ->  let f' r = \x -> f (chn .=. x .*. r) -                in   Seq s $ ps f' -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+-------------------------------------------------------------------------------+-- Show instances for the Grammars+-- Just for debugging purposes -   (EP pn s) <.> (PreProd pp) =  PreProd $ \r ->  Seq s $ pp (f r)-               where f r p = \x -> r (pn .=. (\(Record HNil) -> x) .*. p) +instance Show (Grammar a) where+ show (Grammar r prods) = show r ++ "\n" ++ show prods +instance ShowEnv (Env (Productions l) env env') => Show (Env (Productions l) env env') where+ show env = showEnv 0 env -instance ProdSeq-        (Symbol DTerm TTerm)-        (PreProd (t1 -> DTerm -> t2) (DTerm -> a))-        (t1 -> t2)-        a where+class ShowEnv a where+    showEnv :: Int -> a -> String -  s  <.> (PreProd pp) = PreProd $ \r -> Seq s $ pp (f r)-               where f r p = \DTerm -> r p +instance ShowEnv (Env (Productions l) env env') where+    showEnv _ (Empty)         = "\n"+    showEnv n (Ext nts nont)  = show n ++ "->" ++ show nont ++ "\n" ++ showEnv (n+1) nts+ +instance Show (Productions l a env) where+ show (PS prods) = show prods -prdEnd ::  PreProd (Record HNil -> b) b env-prdEnd = PreProd $ \f -> End (f emptyRecord)+instance Show (Prod l a env) where+ show (Star pf pa)      = "(" ++ show pf ++ "<*>" ++ show pa ++ ")"+ show (FlipStar pa pf)  = "(" ++ show pa ++ "<**>" ++ show pf  ++ ")"+ show (Sym s)           = show s + show (Pure _)          = "pure"+ show (Fix f)           = "fix " ++ show f+ show Var               = "var" -prd ::  (a -> b) -> PreProd (a -> b) t t1 -> Prod t t1-prd sem (PreProd ps) = ps sem  +instance Show (Symbol a t env) where+ show (Term s)    = show s+ show (Nont r)    = show r+ show (TermInt)   = "int"+ show (TermChar)  = "char"+ show (TermVarid) = "var"+ show (TermConid) = "con"+ show (TermOp)    = "op" -prdId ::  Symbol a TNonT env -> Prod a env-prdId nt = Seq nt  $ End id+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,69 +1,72 @@ {-# LANGUAGE Arrows, ExistentialQuantification, GADTs, Rank2Types, FlexibleContexts, ScopedTypeVariables     , EmptyDataDecls, MultiParamTypeClasses, FlexibleInstances, OverlappingInstances, FunctionalDependencies, UndecidableInstances-    , TypeFamilies  #-}+  #-}  module Language.Grammars.SyntaxMacros where  import Language.AbstractSyntax.TTTAS import Control.Arrow -import UU.Parsing.Interface hiding (Symbol,parse,Ok) import qualified UU.Parsing as UU import Language.Grammars.SyntaxMacros.Scanner -import Language.Grammars.Grammar+import Language.Grammars.Grammar +import Language.Grammars.Transformations.RemoveFix+import Language.Grammars.Transformations.RemoveEmpties import Language.Grammars.Transformations.LeftCorner-import Language.Grammars.Transformations.LeftFact -type GramTrafo = Trafo Unit Productions-type ExtGram      env      nts   -           = GramTrafo env  ()   (nts env)-type SyntaxMacro  env nts  nts'  -           = GramTrafo env  (nts env)  (nts' env) +type GramTrafo = Trafo Unit (Productions TL)+type ExtGram      env  start  nts   +           = GramTrafo env  ()   (Export start nts env)+type SyntaxMacro  env  start  nts  start' nts'  +           = GramTrafo 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 [Prod a env] (Symbol a TNonT env)+addNT  ::  GramTrafo env (ListProd TL env a) (Symbol a TNonT env) addNT  =  proc  p -> do -                r  <- newSRef -< PS p+                r  <- newSRef -< prod p                 returnA -< Nont r   -- add productions to an existing non-terminal addProds  ::  GramTrafo  env -                         (Symbol a TNonT env, [Prod a env]) ()-addProds  = proc (nt, prds) -> do+                         (Symbol a TNonT env, ListProd TL env a) ()+addProds  = proc (nont, prds) -> do       updateFinalEnv  -< -         updateEnv (\(PS ps) -> PS $ prds ++ ps) (getRefNT nt)+         updateEnv (\ps -> PS $ (unPP prds) ++ (unPS ps)) (getRefNT nont)    -- close the grammar-closeGram :: (forall env. ExtGram  env (Export a nts)) +closeGram :: (forall env. ExtGram  env a nts)                  -> Grammar a  closeGram prds  = case runTrafo prds Unit () of      Result _ (Export (Nont r) _) gram -            -> (leftfactoring . leftcorner) $ Grammar r gram-+            -> (leftCorner . removeEmpties . removeFix) $ Grammar r gram  extendGram  ::  (NTRecord (nts env), NTRecord (nts' env))  -            =>  ExtGram env (Export start nts) -                -> SyntaxMacro env (Export start nts) (Export start' nts') -                -> ExtGram env (Export start' nts')+            =>  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))  +            =>  ExtGram env start nts +                -> SyntaxMacro env start nts start' nts' +                -> ExtGram env start' nts'++(<++>) = extendGram+ exportNTs ::  NTRecord (nts env) => GramTrafo env (Export start nts env) (Export start nts env) exportNTs = returnA   -- extensible record -newtype  NTField nt a env = NTField { symbolNTField :: (Symbol a TNonT env) }   -labelNTField :: NTField nt a env -> nt-labelNTField _ = undefined--data  NTCons nt v l env  = NTCons (NTField nt v env) (l env)+data  NTCons nt v l env  = NTCons (LSPair nt v TNonT env) (l env) data  NTNil         env  = NTNil  class NTRecord r @@ -83,13 +86,10 @@ ntNil :: NTNil env ntNil = NTNil -infixr 4 ^= -(^=) :: nt -> (Symbol a TNonT env) -> NTField nt a env-(^=) _ = NTField  -infixr 2 ^| -(^|) :: NTRecord (NTCons nt a l env) => NTField nt a env -> l env -> NTCons nt a l env+infixr 4 ^| +(^|) :: NTRecord (NTCons nt a l env) => LSPair nt a TNonT env -> l env -> NTCons nt a l env (^|) = NTCons  @@ -101,58 +101,70 @@ instance Fail (NotFound nt) => GetNT nt (NTNil env) r where  getNT = undefined instance GetNT nt  (NTCons nt v l env) (Symbol v TNonT env) where -- using overlapping- getNT _ (NTCons f _)  = symbolNTField f+ getNT _     (NTCons f _)    = symLSPair f instance GetNT nt1 (l env) r => GetNT nt1 (NTCons nt2 v l env) r where- getNT nt (NTCons _ l)  = getNT nt l+ getNT nont  (NTCons _ l)    = getNT nont l +instance GetNT nt (nts env) r => GetNT nt (Export start nts env) r where+ getNT nont  (Export _ nts)  = getNT nont nts +getStart :: Export start nts env ->  (Symbol start TNonT env)+getStart (Export start _) = start++exportList :: Symbol start TNonT env -> (NTNil env -> nts env) -> Export start nts env+exportList r l = Export r $ l ntNil++export  ::  (NTRecord (l env), NotDuplicated nt (l env))+        =>  nt -> Symbol a TNonT env +        -> l env ->  NTCons nt a l env+export l nont = (^|) (l ^= nont) + -- COMPILE -------------------------------------------------------------------- -pInt            ::   Parser Token Int-pChr            ::   Parser Token Char-pCon            ::   Parser Token String-pVar            ::   Parser Token String-pOp             ::   Parser Token String+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 <$> pChar-pInt            =    read <$> pInteger-pCon            =    id <$> pConid-pVar            =    id <$> pVarid-pOp             =    id <$> pVarsym+pChr            =    head UU.<$> pChar+pInt            =    read UU.<$> pInteger+pCon            =    id UU.<$> pConid+pVar            =    id UU.<$> pVarid+pOp             =    id UU.<$> pVarsym -pTerm           ::  (UU.Parsing.Interface.IsParser p Token) +pTerm           ::  (UU.IsParser p Token)                  =>  String -> p DTerm-pTerm t         =  const DTerm <$>   (pKey t)+pTerm t         =   pKey t  newtype Const f a s = C {unC :: f a}  -compile :: Grammar a -> Parser Token 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 (<|>) [ comp p | p <- ps]))+          (\ (PS ps) -> C (foldr1 (UU.<|>) [ comp p | p <- ps]))           rules-         comp :: forall t . Prod t env -> Parser Token t-         comp (End x)   = pLow x -         comp (Seq (Term t) ss) -                       = flip ($)  <$> pTerm t <*> comp ss -         comp (Seq (Nont n) ss) -                       = flip ($)  <$> unC (lookupEnv n result)-                                     <*> comp ss-         comp (Seq (NontInt) ss) -                       = flip ($)  <$> pInt <*> comp ss -         comp (Seq (NontChar) ss) -                       = flip ($)  <$> pChr <*> comp ss -         comp (Seq (NontVarid) ss) -                       = flip ($)  <$> pVar <*> comp ss -         comp (Seq (NontConid) ss) -                       = flip ($)  <$> pCon <*> comp ss -         comp (Seq (NontOp) ss) -                       = flip ($)  <$> pOp  <*> comp ss  +         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@@ -161,28 +173,28 @@  -- PARSE ---------------------------------------------------------------------- -type ParseMsg = Message Token (Maybe Token)+type ParseMsg = UU.Message Token (Maybe Token)  data ParseResult a = Ok  a                    | Rep a [ParseMsg]        deriving Show -parse :: Parser Token a -> [Token] -> ParseResult a+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 :: Parser Token a -> [Token] -> (a, [ParseMsg])-rparse p input = let ((Pair a _),msgs) =  eval (UU.parse p input)+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 :: Steps a Token (Maybe Token) -> (a, [ParseMsg])-       eval (OkVal v        r) = let (a,msgs) = v `seq` eval r -                                 in  (v a,msgs)-       eval (UU.Ok          r) = eval r-       eval (Cost  _        r) = eval  r-       eval (StRepair _ msg r) = let (v,msgs) = eval r -                                 in  (v,msg:msgs)-       eval (Best _   r     _) = eval  r-       eval (NoMoreSteps v   ) = (v,[]) + 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/Transformations/GramTrafo.hs view
@@ -1,64 +1,75 @@-{-# OPTIONS -fglasgow-exts #-}-+{-# LANGUAGE RankNTypes, GADTs #-} module Language.Grammars.Transformations.GramTrafo where  import Language.AbstractSyntax.TTTAS import Language.Grammars.Grammar -newtype MapA_X env a env'-  = MapA_X (forall x t. Symbol x t env -> Maybe (Ref (x -> a) env'))+data MapA_X env a env'+  = MapA_X (forall x t. Symbol (x->a)  t env -> Maybe (Ref x       env')) -- Star+           (forall x t. Symbol x       t env -> Maybe (Ref (x->a)  env')) -- Flip + emptyMap :: MapA_X env a env'-emptyMap  = MapA_X (const Nothing)+emptyMap  = MapA_X (const Nothing) (const Nothing) -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+extendMapS :: Symbol (x->a) t env -> MapA_X env a env'+           -> MapA_X env a (env',x)+extendMapS  x (MapA_X ms mf) +        = MapA_X  (\s -> case matchSym s x of                                      Just Eq -> Just Zero-                                     Nothing -> fmap Suc (m s)-                      )+                                     Nothing -> fmap Suc (ms s))+                  (\s -> fmap Suc (mf s)) +extendMapF :: Symbol x t env -> MapA_X env a env'+           -> MapA_X env a (env',x->a)+extendMapF  x (MapA_X ms mf) +        = MapA_X  (\s -> fmap Suc (ms s))+                  (\s -> case matchSym s x of+                                     Just Eq -> Just Zero+                                     Nothing -> fmap Suc (mf s))+                  -type GramTrafo env a = Trafo (MapA_X env a) Productions +type GramTrafo env a = Trafo (MapA_X env a) (Productions TL) + initMap :: GramTrafo env a s c d-        -> Trafo Unit Productions s c d+        -> Trafo Unit (Productions TL) s c d initMap (Trafo st)          = Trafo (\_ -> case st emptyMap of                             TrafoE _ f -> TrafoE Unit f                 ) -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)+newNontRS  ::  forall x t env s a +           .   Symbol (x->a) t env +           ->  GramTrafo env a s (Productions TL 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)+newNontRF x = Trafo $ \m -> extEnv (extendMapF x m) + newtype Mapping old new             = Mapping (Env Ref new old)   map2trans :: Mapping env s -> T env s map2trans (Mapping env) -     = T (\r -> (lookupEnv r env))+     = T (flip lookupEnv env) -mapProd  :: T env1 env2 -> Prod a env1 -> Prod a env2-mapProd _ (End x)            = End x-mapProd t (Seq (Term x) r)   = Seq  (Term x) -                                    (mapProd t r) -mapProd t (Seq (Nont x) r)   = Seq (Nont (unT t x)) -                                   (mapProd t r)-mapProd t (Seq NontInt r)    = Seq NontInt -                                   (mapProd t r)-mapProd t (Seq NontChar r)   = Seq NontChar -                                   (mapProd t r)-mapProd t (Seq NontVarid r)  = Seq NontVarid -                                   (mapProd t r)-mapProd t (Seq NontConid r)  = Seq NontConid -                                   (mapProd t r)-mapProd t (Seq NontOp r)     = Seq NontOp -                                   (mapProd t r)-+mapProd  :: T env1 env2 -> Prod l a env1 -> Prod l a env2+mapProd t (Sym (Nont x))      = Sym (Nont (unT t x)) +mapProd _ (Sym (Term x))      = Sym  (Term x) +mapProd _ (Sym TermInt)       = Sym TermInt +mapProd _ (Sym TermChar)      = Sym TermChar +mapProd _ (Sym TermVarid)     = Sym TermVarid +mapProd _ (Sym TermConid)     = Sym TermConid +mapProd _ (Sym TermOp)        = Sym TermOp +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
@@ -1,6 +1,6 @@ {-# OPTIONS -XExistentialQuantification -XArrows -XDoRec -XGADTs #-} -module Language.Grammars.Transformations.LeftCorner (leftcorner) where+module Language.Grammars.Transformations.LeftCorner (leftCorner) where  import Language.AbstractSyntax.TTTAS import Language.Grammars.Grammar@@ -8,24 +8,24 @@ import Control.Arrow  -leftcorner :: forall a . Grammar a -> Grammar a-leftcorner (Grammar start productions)+leftCorner :: forall a . Grammar a -> Grammar a+leftCorner (Grammar start productions)       = case runTrafo (lctrafo productions) Unit () of             Result _ (T tt) gram ->                   Grammar (tt start) gram -lctrafo :: Env Productions env env -        -> Trafo Unit Productions s () (T env s)+lctrafo :: GramEnv env env +        -> Trafo Unit (Productions TL) s () (T env s) lctrafo productions = proc _ ->             do   rec  let tenv_s = map2trans menv_s                       menv_s <- (rules1 productions productions) -< tenv_s                  returnA -< tenv_s  -rules1  ::  Env Productions env env-        ->  Env Productions env env' -        ->  Trafo  Unit Productions s (T env s) -                                      (Mapping env' s)+rules1  ::  GramEnv env env+        ->  GramEnv env env' +        ->  Trafo  Unit (Productions TL) s (T env s) +                                           (Mapping env' s) rules1 _ Empty                = proc _ ->         returnA -< Mapping Empty  @@ -36,94 +36,188 @@             r <- newSRef -< p                Mapping e <- rules1 productions ps -< tenv_s             returnA -< Mapping (Ext e r)- -app_rule1 :: forall env a s. Env Productions env env-          -> [Prod a env]-          -> Trafo Unit Productions s (T env s) (Productions a s)+++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) app_rule1 productions prods =  initMap            ( proc tenv_s -> -                do pss <- sequenceA  (map  (rule1 productions) prods) -< tenv_s +                do pss <- sequenceA  (map  (rule1 productions . accessLeftMost) prods) -< tenv_s                     returnA -< PS (concatMap unPS pss)           ) -rule1  :: Env Productions env env -> Prod a env -       -> GramTrafo env a s (T env s) (Productions a s)-rule1 gram (Seq x beta) +rule1  :: GramEnv env env -> Prod TL a env +       -> GramTrafo env a s (T env s) (Productions TL a s)++rule1 gram (Star (Sym x) beta)       = proc tenv_s ->-        do  insert gram x -< (tenv_s, mapProd tenv_s beta)-                      +        do  insertS gram x -< (tenv_s, mapProd tenv_s beta) -rule2  :: Env Productions env env -       -> Symbol x t env -       -> GramTrafo env a s (T env s, Ref (x -> a) s) -                            (Productions a s)-rule2 _    (Term a) +rule1 gram (FlipStar (Sym x) beta) +     = proc tenv_s ->+        do  insertF gram x -< (tenv_s, mapProd tenv_s beta)++rule1 gram (Sym x) +     = rule1 gram $ FlipStar (Sym x) (Pure id)++rule1 _ (Pure _) +     = error "Left-Corner(1): The grammar has empty productions."+rule1 _ _+     = error "Left-Corner(2): error in the transformation!!!"+++accessLeftMost :: Prod TL a env -> Prod TL 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) +  = accessLeftMost $ FlipStar f (Star (Star (Pure flip)                      g) h)+accessLeftMost (FlipStar  (Star      f g) h) +  = accessLeftMost $ FlipStar f (Star (Star (Pure (\g' h' f' -> h' (f' g'))) g) h)+accessLeftMost (FlipStar  (FlipStar  f g) h) +  = accessLeftMost $ FlipStar f (Star (Star (Pure (\g' h' f' -> h' (g' f'))) g) h)+accessLeftMost p = p ++rule2S  :: GramEnv env env +        -> Symbol (x->a) t env +        -> GramTrafo env a s (T env s, Ref x s) +                             (Productions TL a s)+rule2S gram (Nont b) +     = case lookupEnv b gram of+          PS ps ->  proc (tenv_s, a_x) ->+                      do pss <- sequenceA  +                                (map  (rule2bS gram  . accessLeftMost) ps) -< (tenv_s, a_x)+                         returnA -< PS (concatMap unPS pss)++++rule2bS  :: GramEnv env env +         -> Prod TL (b->a) env +         -> GramTrafo env a s (T env s, Ref b s) +                              (Productions TL a s)++rule2bS gram (Star (Sym x) beta) +     = proc (tenv_s, a_b) ->+         do insertF gram x -< (tenv_s, Star (Star (Pure (\b y bya -> bya b y)) (mapProd tenv_s beta)) (Sym $ Nont a_b) )++rule2bS gram (FlipStar (Sym x) beta) +     = proc (tenv_s, a_b) ->+         do insertF gram x -< (tenv_s, Star (Star (Pure (\bya y b -> bya b y)) (mapProd tenv_s beta)) (Sym $ Nont a_b) )++rule2bS gram (Sym x) +     = rule2bS gram $ FlipStar (Sym x) (Pure id)++rule2bS _ (Pure _)+     = error "Left-Corner(3): The grammar has empty productions."++rule2bS _ _+     = error "Left-Corner(4): error in the transformation!!!"++--++rule2F  :: GramEnv env env +        -> Symbol x t env +        -> GramTrafo env a s (T env s, Ref (x->a) s) +                             (Productions TL a s)+rule2F _    (Term a)       = proc (_, a_x) ->-        do  returnA -< PS [rule2a a a_x]-rule2 gram (Nont b) +        do  returnA -< PS [rule2aF a a_x]+rule2F gram (Nont b)       = case lookupEnv b gram of           PS ps ->  proc (tenv_s, a_x) ->                       do pss <- sequenceA  -                                (map  (rule2b gram) ps) -< (tenv_s, a_x)+                                (map  (rule2bF gram  . accessLeftMost) ps) -< (tenv_s, a_x)                          returnA -< PS (concatMap unPS pss)-rule2 _    NontInt +rule2F _    TermInt       = proc (_, a_x) ->-        do  returnA -< PS [rule2a' NontInt a_x]-rule2 _    NontChar +        do  returnA -< PS [rule2a'F TermInt a_x]+rule2F _    TermChar       = proc (_, a_x) ->-        do  returnA -< PS [rule2a' NontChar a_x]-rule2 _    NontVarid +        do  returnA -< PS [rule2a'F TermChar a_x]+rule2F _    TermVarid       = proc (_, a_x) ->-        do  returnA -< PS [rule2a' NontVarid a_x]-rule2 _    NontConid +        do  returnA -< PS [rule2a'F TermVarid a_x]+rule2F _    TermConid       = proc (_, a_x) ->-        do  returnA -< PS [rule2a' NontConid a_x]-rule2 _    NontOp +        do  returnA -< PS [rule2a'F TermConid a_x]+rule2F _    TermOp       = proc (_, a_x) ->-        do  returnA -< PS [rule2a' NontOp a_x]+        do  returnA -< PS [rule2a'F TermOp a_x]  -rule2a' :: Symbol a t s -> Ref (a -> b) s -> Prod b s-rule2a' s refA_a-     =  Seq s $ Seq (Nont refA_a) $ End ($) +rule2a'F :: Symbol a t s -> Ref (a->b) s -> Prod TL b s+rule2a'F s refA_a+     =  FlipStar (Sym s) (Sym $ Nont refA_a) -- (flip ($)) <$> (Sym s) <*> nont refA_a  -rule2a :: String -> Ref (DTerm -> a) s -> Prod a s-rule2a a refA_a-     =  Seq (Term a) $ Seq (Nont refA_a) $ End ($) +rule2aF :: String -> Ref (DTerm -> a) s -> Prod TL a s+rule2aF a refA_a+     =  FlipStar (Sym $ Term a) (Sym $ Nont refA_a) -- (flip ($)) <$> term a <*> nont refA_a -rule2b  :: Env Productions env env -        -> Prod b env -        -> GramTrafo env a s (T env s, Ref (b -> a) s) -                             (Productions a s)-rule2b gram (Seq x beta) ++rule2bF  :: GramEnv env env +         -> Prod TL b env +         -> GramTrafo env a s (T env s, Ref (b -> a) s) +                              (Productions TL a s)++rule2bF gram (Star (Sym x) beta)       = proc (tenv_s, a_b) ->-         do insert gram x -< (tenv_s, append  (flip (.)) -                                              (mapProd tenv_s beta) -                                              (Nont a_b))+         do insertF gram x -< (tenv_s, Star (Star (Pure (\b xa bx -> xa (bx b))) (mapProd tenv_s beta)) (Sym $ Nont a_b) ) -insert ::  forall x t env s a-       .   Env Productions env env -       ->  Symbol x t env-       ->  GramTrafo env a s  (T env s, Prod (x->a) s)-                              (Productions a s)-insert gram x = +rule2bF gram (FlipStar (Sym x) beta) +     = proc (tenv_s, a_b) ->+         do insertF gram x -< (tenv_s, Star (Star (Pure (flip (.))) (mapProd tenv_s beta)) (Sym $ Nont a_b) )++rule2bF gram (Sym x) +     = rule2bF gram $ FlipStar (Sym x) (Pure id)++rule2bF _ (Pure _)+     = error "Left-Corner(5): The grammar has empty productions."++rule2bF _ _+     = error "Left-Corner(6): error in the transformation!!!"++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)+insertS gram x =       Trafo (-           \(MapA_X m) -> case m x of-                       Just r   -> extendA_X (MapA_X m) r+           \(MapA_X ms mf) -> case ms x of+                       Just r   -> extendA_X (MapA_X ms mf) r+                                   Nothing  -> let  Trafo step = insertNewA_X -                                   in   step (MapA_X m)+                                   in   step (MapA_X ms mf)            )      where        insertNewA_X = proc (tenv_s,p) ->-                     do  r <- newNontR x -< PS [p]-                         rule2 gram x    -< (tenv_s,r)+                     do  r <- newNontRS x  -< PS [p]+                         rule2S gram x     -< (tenv_s,r)  -extendA_X :: m env2-> Ref (x->a) env2-> TrafoE m Productions s env2 (t, Prod (x->a) s) (Productions a env)-extendA_X m r = fmap  (const $ PS []) $ -                      updateSRef m r (\(_,p) (PS ps) -> PS (p:ps))+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)+insertF gram x = +     Trafo (+           \(MapA_X ms mf) -> case mf x of+                       Just r   -> extendA_X (MapA_X ms mf) r+           +                       Nothing  -> let  Trafo step = insertNewA_X +                                   in   step (MapA_X ms mf)+           )+     where+       insertNewA_X = proc (tenv_s,p) ->+                     do  r <- newNontRF x  -< PS [p]+                         rule2F gram x     -< (tenv_s,r)  +extendA_X  :: m env2 -> Ref x env2 +            -> TrafoE m (Productions TL) s env2 (t, Prod TL x s) (Productions TL a env)+extendA_X m r = fmap  (const $ PS []) $ +                       updateSRef m r (\(_,p) (PS ps) -> PS (p:ps))  
− src/Language/Grammars/Transformations/LeftFact.hs
@@ -1,158 +0,0 @@-{-# OPTIONS -XExistentialQuantification -XArrows -XDoRec #-}--module Language.Grammars.Transformations.LeftFact (leftfactoring) where--import Language.AbstractSyntax.TTTAS-import Language.Grammars.Grammar-import Language.Grammars.Transformations.GramTrafo-import Control.Arrow-import Data.Maybe------list of repeated symbols (with hidden type)-data AnySym env = forall x t. AnySym (Symbol x t env)--newtype BT env s = BT (Bool, T env s)---- The 'leftfactoring' function makes a feed-back loop to apply the --- transformation to the Grammar.--- If the transformation has produced new nonterminals (repeated initial--- symbols have been found) the 'leftfactoring' function is called again.-leftfactoring :: forall a. Grammar a -> Grammar a-leftfactoring (Grammar start productions)-      = case runTrafo (lftrafo productions) Unit () of-            Result _ (BT (b,T tt)) gram -> -                 let g = Grammar (tt start) gram-                 in  if b then leftfactoring g-                          else g --lftrafo :: Env Productions env env -        -> Trafo Unit Productions s () (BT env s)-lftrafo productions = proc _ ->-            do   rec  let tenv_s = map2trans menv_s-                      (b,menv_s) <- (rules productions) -< tenv_s-                 returnA -< BT (b,tenv_s)----- The function 'rules' is defined by induction over the original Grammar. --- Applies the "transformation rule" for each nonterminal (and--- its corresponding productions) of the Grammar.--- First of all, the list of "repeated initial symbols" in the productions--- of a nonterminal is found.--- Having this list, the rule is applied to the productions.--- The nonterminal is added to the new Grammar, with the productions--- generated by the rule.--- The output of the Trafo is compound by a boolean indicating if repeated--- symbols were found, and the Mapping from the positions in the new Grammar--- for each nonterminal of the old Grammar.-rules  ::  Env Productions env env' -        -> Trafo Unit Productions s (T env s) (Bool,(Mapping env' s))-rules Empty           -       = proc _ ->-          returnA -< (False, Mapping Empty)--rules (Ext ps (PS prods)) = -    let rep = getrepeated prods-    in proc tenv_s ->-         do p <- app_rule rep prods -< tenv_s-            r <- newSRef -< p   -            (bs,Mapping e) <- rules ps -< tenv_s-            returnA -< ((length rep > 0) || bs, Mapping (Ext e r))- -app_rule :: forall env a s. [AnySym env]-         -> [Prod a env]-         -> Trafo Unit Productions s (T env s) (Productions a s)-app_rule rep prods =  initMap -          ( proc tenv_s -> -                do pss <- sequenceA  (map  (rule rep) prods) -< tenv_s -                   returnA -< PS (concatMap unPS pss)-          )---- If the first symbol of the production is in the list of "repeated--- initial symbols", the transformation generated by 'rinstert'--- is called with input the rest of the production. So, a new nonterminal--- A_Rest_X is generated (if necessary) and the rest (beta) of the production--- is stored as a production of it.--- In other case the production (with its references mapped to the--- to the new Grammar) is returned. -rule :: [AnySym env] -> Prod a env-     -> GramTrafo env a s (T env s) (Productions a s)-rule _   (End a) = proc env2s ->-                    do returnA -< PS [ mapProd env2s (End a) ]-                        -rule rep (Seq x beta) -      | x `iselem` rep = proc env2s ->-                        do  rinsert x -< (env2s, mapProd env2s beta)-      | otherwise    = proc env2s ->-                        do returnA -< PS [ mapProd env2s (Seq x beta) ]----- Insertion of a new production into one "rest" nonterminal.--- If the symbol 'x' is in the MapA_X the nonterminal was already--- 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 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 (-           \(MapA_X m) -> case m x of-                       Nothing -> case proc (env2s,p) ->-                                          do r <- newNontR x -< PS [p]-                                             addprod x -< (env2s,r) -                                  of Trafo step -> step (MapA_X m)-                       Just r  -> TrafoE (MapA_X m)-                                         (\(_,p) t e f ->-                                              ( PS []-                                              , t-                                              , updateEnv (\(PS ps) -                                                             -> PS (p:ps))-                                                          r e-                                              , f-                                              )-                                         )-           )---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 ($)]-addprod (Nont r) = proc (env2s, a__x) -> -                      do returnA -< PS [ Seq (Nont (unT env2s r)) $ Seq (Nont a__x) -                                         $ End ($)]-addprod (NontInt) = proc (_, a__x) -> -                      do returnA -< PS [ Seq NontInt $ Seq (Nont a__x) $ End ($)]-addprod (NontChar) = proc (_, a__x) -> -                      do returnA -< PS [ Seq NontChar $ Seq (Nont a__x) $ End ($)]-addprod (NontVarid) = proc (_, a__x) -> -                      do returnA -< PS [ Seq NontVarid $ Seq (Nont a__x) $ End ($)]-addprod (NontConid) = proc (_, a__x) -> -                      do returnA -< PS [ Seq NontConid $ Seq (Nont a__x) $ End ($)]-addprod (NontOp) = proc (_, a__x) -> -                      do returnA -< PS [ Seq NontOp $ Seq (Nont a__x) $ End ($)]---- Get the list of symbols that are repeated as "first symbol" in the list--- of productions.-getrepeated :: [Prod a env] -> [AnySym env]-getrepeated prods = repeated $ mapMaybe head' prods-      where head' (End _  ) = Nothing-            head' (Seq x _) = Just (AnySym x)-            repeated [] = []-            repeated (ax@(AnySym x):xs) -              | x `iselem` xs = ax : repeated (filter (noteqAny ax) xs)-              | otherwise     = repeated xs--            noteqAny (AnySym x) (AnySym y) = (aux $ matchSym x y)-                                               -aux :: Maybe (Equal a b) -> Bool-aux (Just Eq) = False-aux Nothing   = True  --iselem :: Symbol a t env -> [AnySym env] -> Bool-iselem _ []              = False-iselem x ((AnySym y):ys) = case (matchSym x y) of-                                  (Just Eq) -> True-                                  Nothing   -> iselem x ys -
+ src/Language/Grammars/Transformations/RemoveEmpties.hs view
@@ -0,0 +1,154 @@++module Language.Grammars.Transformations.RemoveEmpties (removeEmpties) where+++import Language.Grammars.Grammar+import Language.AbstractSyntax.TTTAS+++data HasEmpty a env = Unknown | HasEmpty (Prod TL a env) | HasNotEmpty+ deriving (Show)+++removeEmpties :: Grammar a -> Grammar a+removeEmpties (Grammar start prods) +     =  Grammar start $ removeEmptiesEnv (findEmpties prods) prods ++++findEmpties :: GramEnv env env -> Env HasEmpty env env +findEmpties prods = findEmpties' prods (initEmpties prods)+         where+            findEmpties' prds empties = +                  case stepFindEmpties empties prds empties of+                      (empties', True,  _)     -> findEmpties' prds empties'+                      (empties', False, False) -> empties'+                      (_,        False, True)  -> error "Remove Empties(1): Incorrect Grammar!!"++initEmpties :: GramEnv use def -> Env HasEmpty use def +initEmpties Empty        = Empty+initEmpties (Ext nts _)  = Ext (initEmpties nts) Unknown++stepFindEmpties :: Env HasEmpty use use -> GramEnv use def -> Env HasEmpty use def +                -> (Env HasEmpty use def, Bool, Bool) +stepFindEmpties _       Empty          Empty        +    = (Empty, False, False)+stepFindEmpties empties (Ext rprd prd) (Ext re e)   +    = let (re',rchanged,rhasUnk) = stepFindEmpties empties rprd re+          (e', changed, hasUnk)  = updateEmpty empties prd e+      in  (Ext re' e', changed || rchanged, hasUnk || rhasUnk)+stepFindEmpties _       _              _ +    = error "RemoveEmpties(2): Error in the transformation!!!"        +++updateEmpty :: Env HasEmpty use use -> (Productions TL) a use -> HasEmpty a use  +            -> (HasEmpty a use, Bool, Bool) +updateEmpty _       _   (HasEmpty p) = (HasEmpty p,  False, False)+updateEmpty _       _   HasNotEmpty  = (HasNotEmpty, False, False)+updateEmpty empties prd Unknown      = case hasEmpty empties prd of+                                        Unknown -> (Unknown, False, True)+                                        e       -> (e,       True,  False)++hasEmpty :: Env HasEmpty env env -> (Productions TL) a env -> HasEmpty a env+hasEmpty empties (PS ps)= foldr (\p re -> combHasEmpty (isEmpty p empties) re) HasNotEmpty ps+++combHasEmpty :: HasEmpty a env -> HasEmpty a env -> HasEmpty a env+combHasEmpty (HasEmpty _)     (HasEmpty _)     = error "Remove Empties(3): Ambiguous Grammar!!!"+combHasEmpty _                (HasEmpty p)     = HasEmpty p+combHasEmpty (HasEmpty p)     _                = HasEmpty p+combHasEmpty HasNotEmpty      HasNotEmpty      = HasNotEmpty+combHasEmpty _                Unknown          = Unknown+combHasEmpty Unknown          _                = Unknown+++isEmpty :: Prod TL a env -> Env HasEmpty env env -> HasEmpty a env+isEmpty (Pure a)              _       = HasEmpty (Pure a)+isEmpty (Sym (Term _))        _       = HasNotEmpty+isEmpty (Sym (TermInt))       _       = HasNotEmpty+isEmpty (Sym (TermChar))      _       = HasNotEmpty+isEmpty (Sym (TermVarid))     _       = HasNotEmpty+isEmpty (Sym (TermConid))     _       = HasNotEmpty+isEmpty (Sym (TermOp))        _       = HasNotEmpty+isEmpty (Sym (Nont r))        empties = lookupEnv r empties+isEmpty (Star pl pr)          empties = case isEmpty pl empties of+                                         HasEmpty (Pure f)  -> case isEmpty pr empties of+                                                                HasEmpty (Pure x)  -> HasEmpty $ Pure (f x)+                                                                HasEmpty _         -> error "RemoveEmpties(4): Error in the transformation!!!"+                                                                HasNotEmpty        -> HasNotEmpty+                                                                Unknown            -> Unknown+                                         HasEmpty _         -> error "RemoveEmpties(5): Error in the transformation!!!"+                                         HasNotEmpty        -> HasNotEmpty+                                         Unknown            -> case isEmpty pr empties of+                                                                HasNotEmpty        -> HasNotEmpty+                                                                _                  -> Unknown+isEmpty (FlipStar pl pr)      empties = case isEmpty pl empties of+                                         HasEmpty (Pure x)  -> case isEmpty pr empties of+                                                                HasEmpty (Pure f)  -> HasEmpty $ Pure (f x)+                                                                HasEmpty _         -> error "RemoveEmpties(6): Error in the transformation!!!"+                                                                HasNotEmpty        -> HasNotEmpty+                                                                Unknown            -> Unknown+                                         HasEmpty _         -> error "RemoveEmpties(7): Error in the transformation!!!"+                                         HasNotEmpty        -> HasNotEmpty+                                         Unknown            -> case isEmpty pr empties of+                                                                HasNotEmpty        -> HasNotEmpty+                                                                _                  -> Unknown++isEmpty (Fix _)               _       = error "RemoveEmpties(8): cannot transform grammars with Fix constructions."++++removeEmptiesEnv :: Env HasEmpty use use -> GramEnv use def -> GramEnv use def+removeEmptiesEnv _       Empty         +    = Empty+removeEmptiesEnv empties (Ext rprds prds)    +    = Ext (removeEmptiesEnv empties rprds) (removeEmpty empties prds)+++removeEmpty :: Env HasEmpty env env -> Productions TL a env -> Productions TL a env+removeEmpty empties (PS prds) = PS $ foldr ((++) . remEmptyProd) [] prds +  where +     -- if we don't allow the starting point to be empty, +     -- then we can ignore the empty part+     remEmptyProd prd = let (prd',_) = splitEmpty empties prd+                        in  prd'+++splitEmpty :: Env HasEmpty env env -> Prod TL a env -> ([Prod TL a env], Maybe (Prod TL a env))++splitEmpty  empties  (Star f g)  +    =  let (fne, fe) = splitEmpty empties f +           (gne, ge) = splitEmpty empties g ++           fne_gne   = [ Star fv gv | fv <- fne, gv <- gne ] +           fne_ge    = case ge of+                         Nothing -> []+                         Just gv -> [ Star fv gv | fv <- fne] ++           fe_gne  = case fe of+                         Nothing -> []+                         Just fv -> [ FlipStar gv fv | gv <- gne] +           fe_ge   = do +                         (Pure fv) <- fe+                         (Pure gv) <- ge+                         return $ Pure (fv gv)++       in  (fne_gne ++ fne_ge ++ fe_gne , fe_ge)+++splitEmpty  empties  (Sym (Nont r))  +    = 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!!!"++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
@@ -0,0 +1,78 @@+{-# LANGUAGE  RankNTypes, Arrows, DoRec #-} ++module Language.Grammars.Transformations.RemoveFix (removeFix) where+++import Language.AbstractSyntax.TTTAS+import Language.Grammars.Grammar+import Language.Grammars.Transformations.GramTrafo++import Control.Arrow++removeFix :: forall a . Grammar a -> Grammar a+removeFix (Grammar 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 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) +                                                (Mapping env' s)+remfixProds Empty          +     = proc _ ->+        returnA -< Mapping Empty  ++remfixProds (Ext p (PS prods)) +     = proc tenv_s ->+        do  ps <- sequenceA  (map  remfixProd prods) -< tenv_s +            r  <- newSRef -< PS ps   +            Mapping e <- remfixProds p -< tenv_s+            returnA -< Mapping (Ext e r)++++remfixProd  :: Prod l a env +            -> Trafo Unit (Productions TL) s (T env s) (Prod l 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')     +            returnA -< (Sym $ Nont r)++remfixProd (Star f g) +     = proc tenv_s ->+        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 +     = proc tenv_s ->+        do  returnA -< mapProd tenv_s p++++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!!!"++