1
0
forked from GitHub/gf-core

option --split-pgf replaces option --mk-index. This splits the PGF into one file for the abstract and one more for each concrete syntax. This is a preparation for being able to load only specific languages from the whole grammar.

This commit is contained in:
kr.angelov
2013-12-10 10:43:13 +00:00
parent 2dda42e4d9
commit 87fffffbdf
5 changed files with 29 additions and 52 deletions

View File

@@ -1,36 +0,0 @@
{--
This module provide a function for indexing a pgf.
It reads the pgf and add a global flag, called "index", containing a string
with concrete names and size in bytes separated by a column.
ex : "DisambPhrasebookEng:18778 PhrasebookBul:49971 PhrasebookCat:32738..."
--}
module GF.Index (addIndex) where
import PGF
import PGF.Data
--import PGF.Binary
import Data.Binary
import Data.ByteString.Lazy (length) -- readFile
import qualified Data.Map as Map
import Data.Map (toAscList)
import Data.List (intercalate)
--import qualified Data.ByteString.Lazy as BS
addIndex :: PGF -> PGF
addIndex pgf = pgf {gflags = flags}
where flags = Map.insert (mkCId "index") (LStr $ showIndex index) (gflags pgf)
index = getIndex pgf
showIndex :: [(String,Int)] -> String
showIndex = intercalate " " . map f
where f (name,size) = name ++ ":" ++ show size
getsize :: Binary a => a -> Int
getsize x = let bs = encode x in fromIntegral $ Data.ByteString.Lazy.length bs
getIndex :: PGF -> [(String,Int)]
getIndex pgf = cncindex
where cncindex = map f $ Data.Map.toAscList $ concretes pgf
f (cncname,cnc) = (show cncname, getsize cnc)

View File

@@ -161,7 +161,7 @@ data Flags = Flags {
optPMCFG :: Bool,
optOptimizations :: Set Optimization,
optOptimizePGF :: Bool,
optMkIndexPGF :: Bool,
optSplitPGF :: Bool,
optCFGTransforms :: Set CFGTransform,
optLibraryPath :: [FilePath],
optStartCat :: Maybe String,
@@ -272,7 +272,7 @@ defaultFlags = Flags {
optPMCFG = True,
optOptimizations = Set.fromList [OptStem,OptCSE,OptExpand,OptParametrize],
optOptimizePGF = False,
optMkIndexPGF = False,
optSplitPGF = False,
optCFGTransforms = Set.fromList [CFGRemoveCycles, CFGBottomUpFilter,
CFGTopDownFilter, CFGMergeIdentical],
optLibraryPath = [],
@@ -367,8 +367,8 @@ optDescr =
"Select an optimization package. OPT = all | values | parametrize | none",
Option [] ["optimize-pgf"] (NoArg (optimize_pgf True))
"Enable or disable global grammar optimization. This could significantly reduce the size of the final PGF file",
Option [] ["mk-index"] (NoArg (mkIndex True))
"Add an index to the pgf file",
Option [] ["split-pgf"] (NoArg (splitPGF True))
"Split the PGF into one file per language. This allows the runtime to load only individual languages",
Option [] ["stem"] (onOff (toggleOptimize OptStem) True) "Perform stem-suffix analysis (default on).",
Option [] ["cse"] (onOff (toggleOptimize OptCSE) True) "Perform common sub-expression elimination (default on).",
Option [] ["cfg"] (ReqArg cfgTransform "TRANS") "Enable or disable specific CFG transformations. TRANS = merge, no-merge, bottomup, no-bottomup, ...",
@@ -437,7 +437,7 @@ optDescr =
Nothing -> fail $ "Unknown optimization package: " ++ x
optimize_pgf x = set $ \o -> o { optOptimizePGF = x }
mkIndex x = set $ \o -> o { optMkIndexPGF = x }
splitPGF x = set $ \o -> o { optSplitPGF = x }
toggleOptimize x b = set $ setOptimization' x b