diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2007-09-24 08:12:11 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2007-09-24 08:12:11 +0000 |
| commit | 6aacec3591e0e6e1d3ddca4605f6467e302cb65f (patch) | |
| tree | b18525e17809f1bbef96c6778038085eb7bd8ea0 /src/GF/Formalism | |
| parent | 0cd5e62e836e8cb8d2b49f76bfb899081aa2366f (diff) | |
remove FTypes module and move all definitions to Formalism.FCFG
Diffstat (limited to 'src/GF/Formalism')
| -rw-r--r-- | src/GF/Formalism/FCFG.hs | 96 |
1 files changed, 85 insertions, 11 deletions
diff --git a/src/GF/Formalism/FCFG.hs b/src/GF/Formalism/FCFG.hs index 2fb4b0422..5b8edc434 100644 --- a/src/GF/Formalism/FCFG.hs +++ b/src/GF/Formalism/FCFG.hs @@ -7,32 +7,106 @@ -- Definitions of fast multiple context-free grammars ----------------------------------------------------------------------------- -module GF.Formalism.FCFG where +module GF.Formalism.FCFG + ( + -- * Token + FToken + + -- * Category + , FPath + , FCat(..) + + , initialFCat + , fcatString, fcatInt, fcatFloat + , fcat2cid + + -- * Symbol + , FIndex + , FSymbol(..) + + -- * Name + , FName + , isCoercionF + + -- * Grammar + , FPointPos + , FGrammar + , FRule(..) + ) where import Control.Monad (liftM) import Data.List (groupBy) import Data.Array +import GF.Formalism.Utilities +import qualified GF.Canon.GFCC.AbsGFCC as AbsGFCC import GF.Infra.PrintClass ------------------------------------------------------------ --- grammar types +-- Token +type FToken = String -type FLabel = Int -type FPointPos = Int -data FSymbol cat tok - = FSymCat cat {-# UNPACK #-} !FLabel {-# UNPACK #-} !Int - | FSymTok tok +------------------------------------------------------------ +-- Category +type FPath = [FIndex] +data FCat = FCat {-# UNPACK #-} !Int AbsGFCC.CId [FPath] [(FPath,FIndex)] + +initialFCat :: AbsGFCC.CId -> FCat +initialFCat cat = FCat 0 cat [] [] + +fcatString = FCat (-1) (AbsGFCC.CId "String") [[0]] [] +fcatInt = FCat (-2) (AbsGFCC.CId "Int") [[0]] [] +fcatFloat = FCat (-3) (AbsGFCC.CId "Float") [[0]] [] + +fcat2cid :: FCat -> AbsGFCC.CId +fcat2cid (FCat _ c _ _) = c + +instance Eq FCat where + (FCat id1 _ _ _) == (FCat id2 _ _ _) = id1 == id2 + +instance Ord FCat where + compare (FCat id1 _ _ _) (FCat id2 _ _ _) = compare id1 id2 + + +------------------------------------------------------------ +-- Symbol +type FIndex = Int +data FSymbol + = FSymCat FCat {-# UNPACK #-} !FIndex {-# UNPACK #-} !Int + | FSymTok FToken + + +------------------------------------------------------------ +-- Name +type FName = NameProfile AbsGFCC.CId + +isCoercionF :: FName -> Bool +isCoercionF (Name fun [Unify [0]]) = fun == AbsGFCC.CId "_" +isCoercionF _ = False + + +------------------------------------------------------------ +-- Grammar +type FGrammar = [FRule] +type FPointPos = Int +data FRule = FRule FName [FCat] FCat (Array FIndex (Array FPointPos FSymbol)) -type FCFGrammar cat name tok = [FCFRule cat name tok] -data FCFRule cat name tok = FRule name [cat] cat (Array FLabel (Array FPointPos (FSymbol cat tok))) ------------------------------------------------------------ -- pretty-printing -instance (Print c, Print t) => Print (FSymbol c t) where +instance Print AbsGFCC.CId where + prt (AbsGFCC.CId s) = s + +instance Print FCat where + prt (FCat _ (AbsGFCC.CId cat) rcs tcs) = cat ++ "{" ++ + prtSep ";" ([prt path | path <- rcs] ++ + [prt path ++ "=" ++ prt term | (path,term) <- tcs]) + ++ "}" + +instance Print FSymbol where prt (FSymCat c l n) = "($" ++ prt n ++ "!" ++ prt l ++ ")" prt (FSymTok t) = simpleShow (prt t) where simpleShow str = "\"" ++ concatMap mkEsc str ++ "\"" @@ -43,7 +117,7 @@ instance (Print c, Print t) => Print (FSymbol c t) where mkEsc chr = [chr] prtList = prtSep " " -instance (Print c, Print n, Print t) => Print (FCFRule n c t) where +instance Print FRule where prt (FRule name args res lins) = prt name ++ " : " ++ (if null args then "" else prtSep " " args ++ " -> ") ++ prt res ++ " =\n [" ++ prtSep "\n " ["("++prtSep " " [prt sym | (_,sym) <- assocs syms]++")" | (_,syms) <- assocs lins]++"]" prtList = prtSep "\n" |
