1
0
forked from GitHub/gf-core

"Committed_by_peb"

This commit is contained in:
peb
2005-04-20 11:49:44 +00:00
parent 046161b732
commit fd653e18a2
18 changed files with 768 additions and 633 deletions

View File

@@ -5,9 +5,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/02/18 19:21:07 $ -- > CVS $Date: 2005/04/20 12:49:45 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.10 $ -- > CVS $Revision: 1.11 $
-- --
-- symbols (categories, functions) for context-free grammars. -- symbols (categories, functions) for context-free grammars.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -41,7 +41,7 @@ import PrGrammar
import Str import Str
import Char (toLower, toUpper) import Char (toLower, toUpper)
-- this type should be abstract -- | this type should be abstract
data CFTok = data CFTok =
TS String -- ^ normal strings TS String -- ^ normal strings
| TC String -- ^ strings that are ambiguous between upper or lower case | TC String -- ^ strings that are ambiguous between upper or lower case

View File

@@ -4,9 +4,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/18 14:55:32 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.5 $ -- > CVS $Revision: 1.6 $
-- --
-- All possible instantiations of different grammar formats used in conversion from GFC -- All possible instantiations of different grammar formats used in conversion from GFC
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -44,6 +44,7 @@ data Name = Name Fun [Profile (SyntaxForest Fun)]
name2fun :: Name -> Fun name2fun :: Name -> Fun
name2fun (Name fun _) = fun name2fun (Name fun _) = fun
----------------------------------------------------------------------
-- * profiles -- * profiles
-- | A profile is a simple representation of a function on a number of arguments. -- | A profile is a simple representation of a function on a number of arguments.
@@ -155,7 +156,10 @@ data MCat = MCat ECat [ELabel] deriving (Eq, Ord, Show)
type MLabel = ELabel type MLabel = ELabel
mcat2ecat :: MCat -> ECat mcat2ecat :: MCat -> ECat
mcat2ecat (MCat mcat _) = mcat mcat2ecat (MCat cat _) = cat
mcat2scat :: MCat -> SCat
mcat2scat = ecat2scat . mcat2ecat
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- * CFG -- * CFG
@@ -164,6 +168,12 @@ type CGrammar = CFGrammar CCat Name Token
type CRule = CFRule CCat Name Token type CRule = CFRule CCat Name Token
data CCat = CCat ECat ELabel deriving (Eq, Ord, Show) data CCat = CCat ECat ELabel deriving (Eq, Ord, Show)
ccat2ecat :: CCat -> ECat
ccat2ecat (CCat cat _) = cat
ccat2scat :: CCat -> SCat
ccat2scat = ecat2scat . ccat2ecat
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- * pretty-printing -- * pretty-printing

View File

@@ -4,9 +4,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/11 13:52:51 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.1 $ -- > CVS $Revision: 1.2 $
-- --
-- Simple implementation of deductive chart parsing -- Simple implementation of deductive chart parsing
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -21,7 +21,7 @@ module GF.NewParsing.GeneralChart
emptyChart, emptyChart,
chartMember, chartMember,
chartInsert, chartInsertM, chartInsert, chartInsertM,
chartList, chartList, chartKeys,
addToChart, addToChartM addToChart, addToChartM
) where ) where
@@ -35,6 +35,7 @@ import Monad (foldM)
chartLookup :: (Ord item, Ord key) => ParseChart item key -> key -> [item] chartLookup :: (Ord item, Ord key) => ParseChart item key -> key -> [item]
chartList :: (Ord item, Ord key) => ParseChart item key -> [item] chartList :: (Ord item, Ord key) => ParseChart item key -> [item]
chartKeys :: (Ord item, Ord key) => ParseChart item key -> [key]
buildChart :: (Ord item, Ord key) => buildChart :: (Ord item, Ord key) =>
(item -> key) -- ^ key lookup function (item -> key) -- ^ key lookup function
-> [ParseChart item key -> item -> [item]] -- ^ list of inference rules as functions -> [ParseChart item key -> item -> [item]] -- ^ list of inference rules as functions
@@ -95,6 +96,7 @@ emptyChart = KC rbmEmpty
chartMember (KC tree) item key = rbmElem key item tree chartMember (KC tree) item key = rbmElem key item tree
chartLookup (KC tree) key = rbmLookup key tree chartLookup (KC tree) key = rbmLookup key tree
chartList (KC tree) = concatMap snd (rbmList tree) chartList (KC tree) = concatMap snd (rbmList tree)
chartKeys (KC tree) = map fst (rbmList tree)
chartInsert (KC tree) item key = fmap KC (rbmInsert key item tree) chartInsert (KC tree) item key = fmap KC (rbmInsert key item tree)
chartInsertM (KC tree) item keys = fmap KC (foldM insertItem tree keys) chartInsertM (KC tree) item keys = fmap KC (foldM insertItem tree keys)

View File

@@ -4,17 +4,18 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/11 13:52:50 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.1 $ -- > CVS $Revision: 1.2 $
-- --
-- Basic GCFG formalism (derived from Pollard 1984) -- Basic GCFG formalism (derived from Pollard 1984)
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.Formalism.GCFG module GF.Formalism.GCFG where
( Grammar, Rule(..), Abstract(..), Concrete(..)
) where
import GF.Formalism.Utilities (SyntaxChart)
import GF.Data.Assoc (assocMap, accumAssoc)
import GF.Data.SortedList (nubsort, groupPairs)
import GF.Infra.Print import GF.Infra.Print
---------------------------------------------------------------------- ----------------------------------------------------------------------
@@ -28,6 +29,10 @@ data Abstract cat name = Abs cat [cat] name
data Concrete lin term = Cnc lin [lin] term data Concrete lin term = Cnc lin [lin] term
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
abstract2chart :: (Ord n, Ord e) => [Abstract e n] -> SyntaxChart n e
abstract2chart rules = accumAssoc groupPairs $
[ (e, (n, es)) | Abs e es n <- rules ]
---------------------------------------------------------------------- ----------------------------------------------------------------------
instance (Print c, Print n, Print l, Print t) => Print (Rule n c l t) where instance (Print c, Print n, Print l, Print t) => Print (Rule n c l t) where

View File

@@ -4,9 +4,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/16 05:40:49 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.3 $ -- > CVS $Revision: 1.4 $
-- --
-- Basic type declarations and functions for grammar formalisms -- Basic type declarations and functions for grammar formalisms
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -105,7 +105,9 @@ inputMany toks = MkInput inEdges inBounds inFrom inTo inToken
------------------------------------------------------------ ------------------------------------------------------------
-- * charts, forests & trees -- * representations of syntactical analyses
-- ** charts as finite maps over edges
-- | The values of the chart, a list of key-daughters pairs, -- | The values of the chart, a list of key-daughters pairs,
-- has unique keys. In essence, it is a map from 'n' to daughters. -- has unique keys. In essence, it is a map from 'n' to daughters.
@@ -118,6 +120,8 @@ type SyntaxChart n e = Assoc e [(n, [[e]])]
-- type Forest n = GeneralTrie n (SList [Forest n]) Bool -- type Forest n = GeneralTrie n (SList [Forest n]) Bool
-- (the Bool == isMeta) -- (the Bool == isMeta)
-- ** syntax forests
data SyntaxForest n = FMeta data SyntaxForest n = FMeta
| FNode n [[SyntaxForest n]] | FNode n [[SyntaxForest n]]
-- ^ The outer list should be a set (not necessarily sorted) -- ^ The outer list should be a set (not necessarily sorted)
@@ -126,24 +130,28 @@ data SyntaxForest n = FMeta
-- are (conjunctive) concatenative nodes -- are (conjunctive) concatenative nodes
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
data SyntaxTree n = TMeta | TNode n [SyntaxTree n] instance Functor SyntaxForest where
deriving (Eq, Ord, Show) fmap f (FNode n forests) = FNode (f n) $ map (map (fmap f)) forests
fmap f (FMeta) = FMeta
forestName :: SyntaxForest n -> Maybe n forestName :: SyntaxForest n -> Maybe n
forestName (FNode n _) = Just n forestName (FNode n _) = Just n
forestName (FMeta) = Nothing forestName (FMeta) = Nothing
treeName :: SyntaxTree n -> Maybe n unifyManyForests :: (Monad m, Eq n) => [SyntaxForest n] -> m (SyntaxForest n)
treeName (TNode n _) = Just n unifyManyForests = foldM unifyForests FMeta
treeName (TMeta) = Nothing
instance Functor SyntaxTree where -- | two forests can be unified, if either is 'FMeta', or both have the same parent,
fmap f (TNode n trees) = TNode (f n) $ map (fmap f) trees -- and all children can be unified
fmap f (TMeta) = TMeta unifyForests :: (Monad m, Eq n) => SyntaxForest n -> SyntaxForest n -> m (SyntaxForest n)
unifyForests FMeta forest = return forest
instance Functor SyntaxForest where unifyForests forest FMeta = return forest
fmap f (FNode n forests) = FNode (f n) $ map (map (fmap f)) forests unifyForests (FNode name1 children1) (FNode name2 children2)
fmap f (FMeta) = FMeta | name1 == name2 && not (null children) = return $ FNode name1 children
| otherwise = fail "forest unification failure"
where children = [ forests | forests1 <- children1, forests2 <- children2,
sameLength forests1 forests2,
forests <- zipWithM unifyForests forests1 forests2 ]
{- måste tänka mer på detta: {- måste tänka mer på detta:
compactForests :: Ord n => [SyntaxForest n] -> SList (SyntaxForest n) compactForests :: Ord n => [SyntaxForest n] -> SList (SyntaxForest n)
@@ -168,11 +176,33 @@ compactForests = map joinForests . groupBy eqNames . sortForests
_ -> nubsort fss _ -> nubsort fss
-} -}
-- ** conversions between representations -- ** syntax trees
forest2trees :: SyntaxForest n -> SList (SyntaxTree n) data SyntaxTree n = TMeta | TNode n [SyntaxTree n]
forest2trees (FNode n forests) = map (TNode n) $ forests >>= mapM forest2trees deriving (Eq, Ord, Show)
forest2trees (FMeta) = [TMeta]
instance Functor SyntaxTree where
fmap f (TNode n trees) = TNode (f n) $ map (fmap f) trees
fmap f (TMeta) = TMeta
treeName :: SyntaxTree n -> Maybe n
treeName (TNode n _) = Just n
treeName (TMeta) = Nothing
unifyManyTrees :: (Monad m, Eq n) => [SyntaxTree n] -> m (SyntaxTree n)
unifyManyTrees = foldM unifyTrees TMeta
-- | two trees can be unified, if either is 'TMeta',
-- or both have the same parent, and their children can be unified
unifyTrees :: (Monad m, Eq n) => SyntaxTree n -> SyntaxTree n -> m (SyntaxTree n)
unifyTrees TMeta tree = return tree
unifyTrees tree TMeta = return tree
unifyTrees (TNode name1 children1) (TNode name2 children2)
| name1 == name2 && sameLength children1 children2
= liftM (TNode name1) $ zipWithM unifyTrees children1 children2
| otherwise = fail "tree unification failure"
-- ** conversions between representations
chart2forests :: (Ord n, Ord e) => chart2forests :: (Ord n, Ord e) =>
SyntaxChart n e -- ^ The complete chart SyntaxChart n e -- ^ The complete chart
@@ -203,38 +233,9 @@ chart2forests chart isMeta = es2fs
-} -}
-- ** operations on forests forest2trees :: SyntaxForest n -> SList (SyntaxTree n)
forest2trees (FNode n forests) = map (TNode n) $ forests >>= mapM forest2trees
unifyManyForests :: (Monad m, Eq n) => [SyntaxForest n] -> m (SyntaxForest n) forest2trees (FMeta) = [TMeta]
unifyManyForests = foldM unifyForests FMeta
-- | two forests can be unified, if either is 'FMeta', or both have the same parent,
-- and all children can be unified
unifyForests :: (Monad m, Eq n) => SyntaxForest n -> SyntaxForest n -> m (SyntaxForest n)
unifyForests FMeta forest = return forest
unifyForests forest FMeta = return forest
unifyForests (FNode name1 children1) (FNode name2 children2)
| name1 == name2 && not (null children) = return $ FNode name1 children
| otherwise = fail "forest unification failure"
where children = [ forests | forests1 <- children1, forests2 <- children2,
sameLength forests1 forests2,
forests <- zipWithM unifyForests forests1 forests2 ]
-- ** operations on trees
unifyManyTrees :: (Monad m, Eq n) => [SyntaxTree n] -> m (SyntaxTree n)
unifyManyTrees = foldM unifyTrees TMeta
-- | two trees can be unified, if either is 'TMeta',
-- or both have the same parent, and their children can be unified
unifyTrees :: (Monad m, Eq n) => SyntaxTree n -> SyntaxTree n -> m (SyntaxTree n)
unifyTrees TMeta tree = return tree
unifyTrees tree TMeta = return tree
unifyTrees (TNode name1 children1) (TNode name2 children2)
| name1 == name2 && sameLength children1 children2
= liftM (TNode name1) $ zipWithM unifyTrees children1 children2
| otherwise = fail "tree unification failure"

View File

@@ -5,9 +5,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/11 13:53:38 $ -- > CVS $Date: 2005/04/20 12:49:45 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.24 $ -- > CVS $Revision: 1.25 $
-- --
-- Options and flags used in GF shell commands and files. -- Options and flags used in GF shell commands and files.
-- --
@@ -146,12 +146,25 @@ rawParse = iOpt "raw"
firstParse = iOpt "1" firstParse = iOpt "1"
dontParse = iOpt "read" dontParse = iOpt "read"
newParser, newerParser :: Option
newParser = iOpt "new"
newerParser = iOpt "newer"
{-
useParserMCFG, useParserMCFGviaCFG, useParserCFG, useParserCF :: Option
useParserMCFG = iOpt "mcfg"
useParserMCFGviaCFG = iOpt "mcfg-via-cfg"
useParserCFG = iOpt "cfg"
useParserCF = iOpt "cf"
-}
-- ** grammar formats -- ** grammar formats
showAbstr, showXML, showOld, showLatex, showFullForm, showAbstr, showXML, showOld, showLatex, showFullForm,
showEBNF, showCF, showWords, showOpts, showEBNF, showCF, showWords, showOpts,
isCompiled, isHaskell, noCompOpers, retainOpers, isCompiled, isHaskell, noCompOpers, retainOpers,
newParser, newerParser, noCF, checkCirc, noCheckCirc, lexerByNeed, useUTF8id :: Option noCF, checkCirc, noCheckCirc, lexerByNeed, useUTF8id :: Option
defaultGrOpts :: [Option] defaultGrOpts :: [Option]
showAbstr = iOpt "abs" showAbstr = iOpt "abs"
@@ -169,8 +182,6 @@ isHaskell = iOpt "gfhs"
noCompOpers = iOpt "nocomp" noCompOpers = iOpt "nocomp"
retainOpers = iOpt "retain" retainOpers = iOpt "retain"
defaultGrOpts = [] defaultGrOpts = []
newParser = iOpt "new"
newerParser = iOpt "newer"
noCF = iOpt "nocf" noCF = iOpt "nocf"
checkCirc = iOpt "nocirc" checkCirc = iOpt "nocirc"
noCheckCirc = iOpt "nocheckcirc" noCheckCirc = iOpt "nocheckcirc"
@@ -264,6 +275,7 @@ gStartCat :: String -> Option
useTokenizer = aOpt "lexer" useTokenizer = aOpt "lexer"
useUntokenizer = aOpt "unlexer" useUntokenizer = aOpt "unlexer"
useParser = aOpt "parser" useParser = aOpt "parser"
-- useStrategy = aOpt "strategy" -- parsing strategy
withFun = aOpt "fun" withFun = aOpt "fun"
firstCat = aOpt "cat" firstCat = aOpt "cat"
gStartCat = aOpt "startcat" gStartCat = aOpt "startcat"

View File

@@ -4,15 +4,17 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/18 14:55:33 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.2 $ -- > CVS $Revision: 1.3 $
-- --
-- Chart parsing of grammars in CF format -- Chart parsing of grammars in CF format
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.NewParsing.CF (parse) where module GF.NewParsing.CF (parse) where
import Operations (errVal)
import GF.System.Tracing import GF.System.Tracing
import GF.Infra.Print import GF.Infra.Print
@@ -29,7 +31,7 @@ type Name = CFI.CFFun
type Category = CFI.CFCat type Category = CFI.CFCat
parse :: String -> CF.CF -> Category -> CF.CFParser parse :: String -> CF.CF -> Category -> CF.CFParser
parse = buildParser . P.parseCF parse = buildParser . errVal (errVal undefined (P.parseCF "")) . P.parseCF
buildParser :: P.CFParser Category Name Token -> CF.CF -> Category -> CF.CFParser buildParser :: P.CFParser Category Name Token -> CF.CF -> Category -> CF.CFParser
buildParser parser cf start tokens = (parseResults, parseInformation) buildParser parser cf start tokens = (parseResults, parseInformation)
@@ -38,7 +40,7 @@ buildParser parser cf start tokens = (parseResults, parseInformation)
theInput = input tokens theInput = input tokens
edges = tracePrt "Parsing.CF - nr. edges" (prt.length) $ edges = tracePrt "Parsing.CF - nr. edges" (prt.length) $
parser pInf [start] theInput parser pInf [start] theInput
chart = tracePrt "Parsing.CF - size of chart" (prt . map (length.snd) . aAssocs) $ chart = tracePrt "Parsing.CF - sz. chart" (prt . map (length.snd) . aAssocs) $
grammar2chart $ map addCategory edges grammar2chart $ map addCategory edges
forests = tracePrt "Parsing.CF - nr. forests" (prt.length) $ forests = tracePrt "Parsing.CF - nr. forests" (prt.length) $
chart2forests chart (const False) chart2forests chart (const False)

View File

@@ -4,9 +4,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/14 18:38:36 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.2 $ -- > CVS $Revision: 1.3 $
-- --
-- CFG parsing -- CFG parsing
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -14,6 +14,8 @@
module GF.NewParsing.CFG module GF.NewParsing.CFG
(parseCF, module GF.NewParsing.CFG.PInfo) where (parseCF, module GF.NewParsing.CFG.PInfo) where
import Operations (Err(..))
import GF.Formalism.Utilities import GF.Formalism.Utilities
import GF.Formalism.CFG import GF.Formalism.CFG
import GF.NewParsing.CFG.PInfo import GF.NewParsing.CFG.PInfo
@@ -24,17 +26,19 @@ import qualified GF.NewParsing.CFG.General as Gen
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- parsing -- parsing
parseCF :: (Ord n, Ord c, Ord t) => String -> CFParser c n t parseCF :: (Ord n, Ord c, Ord t) => String -> Err (CFParser c n t)
parseCF "gb" = Gen.parse bottomup parseCF "gb" = Ok $ Gen.parse bottomup
parseCF "gt" = Gen.parse topdown parseCF "gt" = Ok $ Gen.parse topdown
parseCF "ib" = Inc.parse (bottomup, noFilter) parseCF "ib" = Ok $ Inc.parse (bottomup, noFilter)
parseCF "it" = Inc.parse (topdown, noFilter) parseCF "it" = Ok $ Inc.parse (topdown, noFilter)
parseCF "ibFT" = Inc.parse (bottomup, topdown) parseCF "ibFT" = Ok $ Inc.parse (bottomup, topdown)
parseCF "ibFB" = Inc.parse (bottomup, bottomup) parseCF "ibFB" = Ok $ Inc.parse (bottomup, bottomup)
parseCF "ibFTB" = Inc.parse (bottomup, bothFilters) parseCF "ibFTB" = Ok $ Inc.parse (bottomup, bothFilters)
parseCF "itF" = Inc.parse (topdown, bottomup) parseCF "itF" = Ok $ Inc.parse (topdown, bottomup)
-- default parser: -- default parser:
parseCF _ = parseCF "gb" parseCF "" = parseCF "gb"
-- error parser:
parseCF prs = Bad $ "Parser not defined: " ++ prs
bottomup = (True, False) bottomup = (True, False)
topdown = (False, True) topdown = (False, True)

View File

@@ -4,9 +4,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/19 10:46:07 $ -- > CVS $Date: 2005/04/20 12:49:44 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.4 $ -- > CVS $Revision: 1.5 $
-- --
-- The main parsing module, parsing GFC grammars -- The main parsing module, parsing GFC grammars
-- by translating to simpler formats, such as PMCFG and CFG -- by translating to simpler formats, such as PMCFG and CFG
@@ -19,28 +19,25 @@ import GF.System.Tracing
import GF.Infra.Print import GF.Infra.Print
import qualified PrGrammar import qualified PrGrammar
import Monad import Operations (Err(..))
import qualified Grammar import qualified Grammar
-- import Values
import qualified Macros import qualified Macros
-- import qualified Modules
import qualified AbsGFC import qualified AbsGFC
import qualified Ident import qualified Ident
import Operations import CFIdent (CFCat, cfCat2Ident, CFTok, wordsCFTok)
import CFIdent (CFCat, cfCat2Ident, CFTok, prCFTok)
import GF.Data.SortedList import GF.Data.SortedList
import GF.Data.Assoc import GF.Data.Assoc
import GF.Formalism.Utilities import GF.Formalism.Utilities
import GF.Conversion.Types import GF.Conversion.Types
import GF.Formalism.GCFG
import GF.Formalism.SimpleGFC import qualified GF.Formalism.GCFG as G
import qualified GF.Formalism.SimpleGFC as S
import qualified GF.Formalism.MCFG as M import qualified GF.Formalism.MCFG as M
import qualified GF.Formalism.CFG as C import qualified GF.Formalism.CFG as C
import qualified GF.NewParsing.MCFG as PM import qualified GF.NewParsing.MCFG as PM
import qualified GF.NewParsing.CFG as PC import qualified GF.NewParsing.CFG as PC
--import qualified GF.Conversion.FromGFC as From
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- parsing information -- parsing information
@@ -64,82 +61,60 @@ parse :: String -- ^ parsing strategy
-> Ident.Ident -- ^ abstract module name -> Ident.Ident -- ^ abstract module name
-> CFCat -- ^ starting category -> CFCat -- ^ starting category
-> [CFTok] -- ^ input tokens -> [CFTok] -- ^ input tokens
-> [Grammar.Term] -- ^ resulting GF terms -> Err [Grammar.Term] -- ^ resulting GF terms
parse (prs:strategy) pinfo abs startCat inString =
do let inTokens = tracePrt "Parsing.GFC - input tokens" prt $
inputMany (map wordsCFTok inString)
forests <- selectParser prs strategy pinfo startCat inTokens
traceM "Parsing.GFC - nr. forests" (prt (length forests))
let filteredForests = tracePrt "Parsing.GFC - nr. filtered forests" (prt . length) $
forests >>= applyProfileToForest
-- compactFs = tracePrt "#compactForests" (prt . length) $
-- tracePrt "compactForests" (prtBefore "\n") $
-- compactForests forests
trees = tracePrt "Parsing.GFC - nr. trees" (prt . length) $
nubsort $ filteredForests >>= forest2trees
-- compactFs >>= forest2trees
return $ map (tree2term abs) trees
-- default parser = CFG (for now)
parse "" pinfo abs startCat inString = parse "c" pinfo abs startCat inString
-- parsing via CFG -- parsing via CFG
parse (c:strategy) pinfo abs startCat selectParser prs strategy pinfo startCat inTokens | prs=='c'
| c=='c' || c=='C' = map (tree2term abs) . = do let startCats = tracePrt "Parsing.GFC - starting CF categories" prt $
parseCFG strategy cfpi startCats . filter isStart $ map fst $ aAssocs $ PC.topdownRules cfpi
map prCFTok isStart cat = ccat2scat cat == cfCat2Ident startCat
where startCats = tracePrt "Parsing.GFC - starting categories" prt $ cfpi = cfPInfo pinfo
filter isStartCat $ map fst $ aAssocs $ PC.topdownRules cfpi cfParser <- PC.parseCF strategy
isStartCat (CCat (ECat cat _) _) = cat == cfCat2Ident startCat let cfChart = tracePrt "Parsing.GFC - sz. CF chart" (prt . length) $
cfpi = cfPInfo pinfo cfParser cfpi startCats inTokens
chart = tracePrt "Parsing.GFC - sz. chart" (prt . map (length.snd) . aAssocs) $
C.grammar2chart cfChart
finalEdges = tracePrt "Parsing.GFC - final chart edges" prt $
map (uncurry Edge (inputBounds inTokens)) startCats
return $ chart2forests chart (const False) finalEdges
-- parsing via MCFG -- parsing via MCFG
parse (c:strategy) pinfo abs startCat selectParser prs strategy pinfo startCat inTokens | prs=='m'
| c=='m' || c=='M' = map (tree2term abs) . = do let startCats = tracePrt "Parsing.GFC - starting MCF categories" prt $
parseMCFG strategy mcfpi startCats . filter isStart $ nubsort [ c | G.Rule (G.Abs c _ _) _ <- mcfpi ]
map prCFTok isStart cat = mcat2scat cat == cfCat2Ident startCat
where startCats = tracePrt "Parsing.GFC - starting categories" prt $ mcfpi = mcfPInfo pinfo
filter isStartCat $ nubsort [ c | Rule (Abs c _ _) _ <- mcfpi ] mcfParser <- PM.parseMCF strategy
isStartCat (MCat (ECat cat _) _) = cat == cfCat2Ident startCat let mcfChart = tracePrt "Parsing.GFC - sz. MCF chart" (prt . length) $
mcfpi = mcfPInfo pinfo mcfParser mcfpi startCats inTokens
chart = tracePrt "Parsing.GFC - sz. chart" (prt . map (length.snd) . aAssocs) $
G.abstract2chart mcfChart
finalEdges = tracePrt "Parsing.GFC - final chart edges" prt $
[ PM.makeFinalEdge cat lbl (inputBounds inTokens) |
cat@(MCat _ [lbl]) <- startCats ]
return $ chart2forests chart (const False) finalEdges
-- default parser -- error parser:
parse strategy pinfo abs start = parse ('c':strategy) pinfo abs start selectParser prs strategy _ _ _ = Bad $ "Parser not defined: " ++ (prs:strategy)
----------------------------------------------------------------------
parseCFG :: String -> CFPInfo -> [CCat] -> [Token] -> [SyntaxTree Fun]
parseCFG strategy pinfo startCats inString = trace2 "Parsing.GFC - selected algorithm" "CFG" $
trees
where trees = tracePrt "Parsing.GFC - nr. trees" (prt . length) $
nubsort $ forests >>= forest2trees
-- compactFs >>= forest2trees
-- compactFs = tracePrt "#compactForests" (prt . length) $
-- tracePrt "compactForests" (prtBefore "\n") $
-- compactForests forests
forests = tracePrt "Parsing.GFC - nr. forests" (prt . length) $
cfForests >>= convertFromCFForest
cfForests= tracePrt "Parsing.GFC - nr. context-free forests" (prt . length) $
chart2forests chart (const False) finalEdges
finalEdges = tracePrt "Parsing.GFC - final chart edges" prt $
map (uncurry Edge (inputBounds inTokens)) startCats
chart = --tracePrt "finalChartEdges" (prt . (? finalEdge)) $
tracePrt "Parsing.GFC - size of chart" (prt . map (length.snd) . aAssocs) $
C.grammar2chart cfChart
cfChart = --tracePrt "finalEdges"
--(prt . filter (\(Edge i j _) -> (i,j)==inputBounds inTokens)) $
tracePrt "Parsing.GFC - size of context-free chart" (prt . length) $
PC.parseCF strategy pinfo startCats inTokens
inTokens = input inString
----------------------------------------------------------------------
parseMCFG :: String -> MCFPInfo -> [MCat] -> [Token] -> [SyntaxTree Fun]
parseMCFG strategy pinfo startCats inString = trace2 "Parsing.GFC - selected algorithm" "MCFG" $
trees
where trees = tracePrt "Parsing.GFC - nr. trees" (prt . length) $
forests >>= forest2trees
forests = tracePrt "Parsing.GFC - nr. forests" (prt . length) $
cfForests >>= convertFromCFForest
cfForests= tracePrt "Parsing.GFC - nr. context-free forests" (prt . length) $
chart2forests chart (const False) finalEdges
chart = tracePrt "Parsing.GFC - size of chart" (prt . map (length.snd) . aAssocs) $
PM.parseMCF strategy pinfo inString -- inTokens
finalEdges = tracePrt "Parsing.GFC - final chart edges" prt $
[ PM.makeFinalEdge cat lbl (inputBounds inTokens) |
cat@(MCat _ [lbl]) <- startCats ]
inTokens = input inString
---------------------------------------------------------------------- ----------------------------------------------------------------------
@@ -153,36 +128,23 @@ tree2term abs (TMeta) = Macros.mkMeta 0
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- conversion and unification of forests -- conversion and unification of forests
convertFromCFForest :: SyntaxForest Name -> [SyntaxForest Fun]
-- simplest implementation -- simplest implementation
convertFromCFForest (FNode name@(Name fun profile) children) applyProfileToForest :: SyntaxForest Name -> [SyntaxForest Fun]
applyProfileToForest (FNode name@(Name fun profile) children)
| isCoercion name = concat chForests | isCoercion name = concat chForests
| otherwise = [ FNode fun chForests | not (null chForests) ] | otherwise = [ FNode fun chForests | not (null chForests) ]
where chForests = concat [ applyProfileM unifyManyForests profile forests | where chForests = concat [ applyProfileM unifyManyForests profile forests |
forests0 <- children, forests0 <- children,
forests <- mapM convertFromCFForest forests0 ] forests <- mapM applyProfileToForest forests0 ]
{- {-
-- more intelligent(?) implementation -- more intelligent(?) implementation
convertFromCFForest (FNode (Name name profile) children) applyProfileToForest (FNode (Name name profile) children)
| isCoercion name = concat chForests | isCoercion name = concat chForests
| otherwise = [ FNode name chForests | not (null chForests) ] | otherwise = [ FNode name chForests | not (null chForests) ]
where chForests = concat [ mapM (checkProfile forests) profile | where chForests = concat [ mapM (checkProfile forests) profile |
forests0 <- children, forests0 <- children,
forests <- mapM convertFromCFForest forests0 ] forests <- mapM applyProfileToForest forests0 ]
-} -}
{-
----------------------------------------------------------------------
-- conversion and unification for parse trees instead of forests
-- OBSOLETE!
convertFromCFTree :: SyntaxTree Name -> [SyntaxTree Fun]
convertFromCFTree (TNode name@(Name fun profile) children0)
| isCoercion name = concat chTrees
| otherwise = map (TNode fun) chTrees
where chTrees = [ children |
children1 <- mapM convertFromCFTree children0,
children <- applyProfileM unifyManyTrees profile children1 ]
-}

View File

@@ -4,32 +4,39 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/19 10:46:07 $ -- > CVS $Date: 2005/04/20 12:49:45 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.1 $ -- > CVS $Revision: 1.2 $
-- --
-- MCFG parsing -- MCFG parsing
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.NewParsing.MCFG where module GF.NewParsing.MCFG
(parseMCF, module GF.NewParsing.MCFG.PInfo) where
import Operations (Err(..))
import GF.Formalism.Utilities import GF.Formalism.Utilities
import GF.Formalism.GCFG import GF.Formalism.GCFG
import GF.Formalism.MCFG import GF.Formalism.MCFG
import GF.NewParsing.MCFG.PInfo
import qualified GF.NewParsing.MCFG.Naive as Naive import qualified GF.NewParsing.MCFG.Naive as Naive
import qualified GF.NewParsing.MCFG.Active as Active
import qualified GF.NewParsing.MCFG.Range as Range (makeRange) import qualified GF.NewParsing.MCFG.Range as Range (makeRange)
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- parsing -- parsing
--parseMCF :: (Ord n, Ord c, Ord t) => String -> CFParser c n t parseMCF :: (Ord c, Ord n, Ord l, Ord t) => String -> Err (MCFParser c n l t)
parseMCF "n" = Naive.parse parseMCF "n" = Ok $ Naive.parse
-- default parser: parseMCF "an" = Ok $ Active.parse "n"
parseMCF _ = parseMCF "n" parseMCF "ab" = Ok $ Active.parse "b"
parseMCF "at" = Ok $ Active.parse "t"
-- default parsers:
makeFinalEdge cat lbl bnds = (cat, [(lbl, Range.makeRange bnds)]) parseMCF "a" = parseMCF "an"
-- error parser:
parseMCF prs = Bad $ "Parser not defined: " ++ prs

View File

@@ -1,174 +1,186 @@
{-- Module --------------------------------------------------------------------
Filename: ActiveParse.hs
Author: Håkan Burden
Time-stamp: <2005-04-18, 14:25>
Description: An agenda-driven implementation of algorithm 4.6, Active parsing module GF.NewParsing.MCFG.Active (parse) where
of PMCFG, as described in Ljunglöf (2004)
------------------------------------------------------------------------------}
module ActiveParse where import GF.NewParsing.GeneralChart
import GF.Formalism.GCFG
import GF.Formalism.MCFG
import GF.Formalism.Utilities
import GF.NewParsing.MCFG.Range
import GF.NewParsing.MCFG.PInfo
import GF.System.Tracing
import Monad (guard)
----------------------------------------------------------------------
-- * parsing
-- GF modules parse :: (Ord n, Ord c, Ord l, Ord t) => String -> MCFParser c n l t
import Examples parse strategy mcfg starts toks
import GeneralChart = [ Abs (cat, found) (zip rhs rrecs) fun |
import MCFGrammar Final (Abs cat rhs fun) found rrecs <- chartLookup chart Fin ]
import MCFParser where chart = process strategy mcfg starts toks
import Nondet
import Parser
import Range
process :: (Ord n, Ord c, Ord l, Ord t) =>
String -> MCFGrammar c n l t -> [c] -> Input t -> AChart c n l
process strategy mcfg starts toks
= trace2 "MCFG.Active - strategy" (if isBU strategy then "BU"
else if isTD strategy then "TD" else "None") $
tracePrt "MCFG.Active - chart size" prtSizes $
buildChart keyof (complete : combine : convert : rules) axioms
where rules | isNil strategy = [scan]
| isBU strategy = [predictKilbury mcfg toks]
| isTD strategy = [predictEarley mcfg toks]
axioms | isNil strategy = predict mcfg toks
| isBU strategy = terminal mcfg toks
| isTD strategy = initial mcfg starts toks
{-- Datatypes ----------------------------------------------------------------- isNil s = s=="n"
AChart: A RedBlackMap with Items and Keys isBU s = s=="b"
Item : isTD s = s=="t"
AKey :
------------------------------------------------------------------------------} ----------------------------------------------------------------------
data Item n c l = Active (AbstractRule n c) -- * type definitions
(RangeRec l)
Range type AChart c n l = ParseChart (Item c n l) (AKey c)
(Lin c l Range)
(LinRec c l Range) data Item c n l = Active (Abstract c n)
[RangeRec l] (RangeRec l)
| Passive (AbstractRule n c) (RangeRec l) [RangeRec l] Range
(Lin c l Range)
(LinRec c l Range)
[RangeRec l]
| Final (Abstract c n) (RangeRec l) [RangeRec l]
| Passive c (RangeRec l)
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
type AChart n c l = ParseChart (Item n c l) (AKey c)
data AKey c = Act c data AKey c = Act c
| Pass c | Pass c
| Useless | Useless
| Fin
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
keyof :: Item n c l -> AKey c keyof :: Item c n l -> AKey c
keyof (Active _ _ _ (Lin _ (Cat (next, _, _):_)) _ _) = Act next keyof (Active _ _ _ (Lin _ (Cat (next, _, _):_)) _ _) = Act next
keyof (Passive (_, cat, _) _ _) = Pass cat keyof (Final _ _ _) = Fin
keyof _ = Useless keyof (Passive cat _) = Pass cat
keyof _ = Useless
-- to be used in prediction
emptyChildren :: Abstract c n -> [RangeRec l]
emptyChildren (Abs _ rhs _) = replicate (length rhs) []
-- for tracing purposes
prtSizes chart = "final=" ++ show (length (chartLookup chart Fin)) ++
", passive=" ++ show (sum [length (chartLookup chart k) |
k@(Pass _) <- chartKeys chart ]) ++
", active=" ++ show (sum [length (chartLookup chart k) |
k@(Act _) <- chartKeys chart ]) ++
", useless=" ++ show (length (chartLookup chart Useless))
{-- Parsing ------------------------------------------------------------------- ----------------------------------------------------------------------
recognize: -- * inference rules
parse : Builds a chart from the initial agenda, given by prediction, and
the inference rules
keyof : Given an Item returns an appropriate Key for the Chart
------------------------------------------------------------------------------}
recognize strategy mcfg toks = chartMember -- completion
(parse strategy mcfg toks) item (keyof item) complete :: (Ord c, Ord n, Ord l) => AChart c n l -> Item c n l -> [Item c n l]
where n = length toks complete _ (Active rule found rng (Lin l []) (lin:lins) recs) =
n2 = n `div` 2 return $ Active rule (found ++ [(l, rng)]) EmptyRange lin lins recs
item = (Passive ("f", S, [A])
[("s",Range (0,n))]
[[("p",Range (0,n2)),("q",Range (n2,n))]])
parse :: (Ord n, Ord c, Ord l, Eq t) => Strategy -> Grammar n c l t -> [t]
-> ParseChart (Item n c l) (AKey c)
parse (False,False) mcfg toks = buildChart keyof
[complete, scan, combine, convert]
(predict mcfg toks)
parse (True, False) mcfg toks = buildChart keyof
[predictKilbury mcfg toks, complete, combine, convert]
(terminal mcfg toks)
parse (False, True) mcfg toks = buildChart keyof
[predictEarley mcfg toks, complete, scan, combine, convert]
(initial (take 1 mcfg) toks)
predictKilbury mcfg toks _ (Passive (_, cat, _) found _) =
[ Active (f, a, rhs) [] rng lin' lins' daughters |
Rule a rhs ((Lin l ((Cat (cat', r, i)):syms)):lins) f <- mcfg,
cat == cat',
lin' : lins' <- solutions $ rangeRestRec toks (Lin l syms : lins),
-- lins' <- solutions $ rangeRestRec toks lins,
rng <- solutions $ projection r found,
let daughters = (replaceRec (replicate (length rhs) []) i found) ]
predictKilbury _ _ _ _ = []
predictEarley mcfg toks _ item@(Active _ _ _ (Lin _ ((Cat (cat, _, _)):_)) _ _) =
concat [ predEar toks item rule |
rule@(Rule cat' _ _ _) <- mcfg, cat == cat' ]
predictEarley _ _ _ _ = []
predEar toks _ (Rule cat [] lins f) =
[ Passive (f, cat, []) (makeRangeRec lins') [] |
lins' <- solutions $ rangeRestRec toks lins ]
predEar toks (Active _ _ (Range (_,j)) _ _ _) (Rule cat rhs lins f) =
[ Active (f, cat, rhs) [] (Range (j, j)) lin' lins' (replicate (length rhs) []) |
(lin':lins') <- solutions $ rangeRestRec toks lins ]
predEar toks (Active _ _ EmptyRange _ _ _) (Rule cat rhs lins f) =
[ Active (f, cat, rhs) [] EmptyRange lin' lins' (replicate (length rhs) []) |
(lin':lins') <- solutions $ rangeRestRec toks lins ]
{--Inference rules ------------------------------------------------------------
predict : Creates an Active Item of every Rule in the Grammar to give the
initial Agenda
complete:
scan :
combine : Creates an Active Item every time it is possible to combine
an Active Item from the agenda with a Passive Item from the Chart
convert : Active Items with nothing to find are converted to Passive Items
------------------------------------------------------------------------------}
predict :: Eq t => Grammar n c l t -> [t] -> [Item n c l]
predict grammar toks = [ Active (f, cat, rhs) [] EmptyRange lin' lins'
(replicate (length rhs) []) |
Rule cat rhs lins f <- grammar,
(lin':lins') <- solutions $ rangeRestRec toks lins ]
complete :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey c) -> Item n c l
-> [Item n c l]
complete _ (Active rule found (Range (i, j)) (Lin l []) (lin:lins) recs) =
[ Active rule (found ++ [(l, Range (i,j))]) EmptyRange lin lins recs ]
complete _ _ = [] complete _ _ = []
-- scanning
scan :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey c) -> Item n c l scan :: (Ord c, Ord n, Ord l) => AChart c n l -> Item c n l -> [Item c n l]
-> [Item n c l] scan _ (Active rule found rng (Lin l (Tok rng':syms)) lins recs) =
scan _ (Active rule found rng (Lin l ((Tok rng'):syms)) lins recs) = do rng'' <- concatRange rng rng'
[ Active rule found rng'' (Lin l syms) lins recs | return $ Active rule found rng'' (Lin l syms) lins recs
rng'' <- solutions $ concRanges rng rng' ]
scan _ _ = [] scan _ _ = []
-- | Creates an Active Item every time it is possible to combine
combine :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey c) -> Item n c l -- an Active Item from the agenda with a Passive Item from the Chart
-> [Item n c l] combine :: (Ord c, Ord n, Ord l) => AChart c n l -> Item c n l -> [Item c n l]
combine chart (Active rule found rng (Lin l ((Cat (c, r, d)):syms)) lins recs) = combine chart (Active rule found rng (Lin l (Cat (c, r, d):syms)) lins recs) =
[ Active rule found rng'' (Lin l syms) lins (replaceRec recs d found') | do Passive _c found' <- chartLookup chart (Pass c)
Passive _ found' _ <- chartLookup chart (Pass c), rng' <- projection r found'
rng' <- solutions $ projection r found', rng'' <- concatRange rng rng'
rng'' <- solutions $ concRanges rng rng', guard $ subsumes (recs !! d) found'
subsumes (recs !! d) found' ] return $ Active rule found rng'' (Lin l syms) lins (replaceRec recs d found')
combine chart (Passive (_, c, _) found _) = combine chart (Passive c found) =
[ Active rule found' rng (Lin l syms) lins (replaceRec recs' d found) | do Active rule found' rng' (Lin l ((Cat (_c, r, d)):syms)) lins recs'
Active rule found' rng' (Lin l ((Cat (c, r, d)):syms)) lins recs' <- chartLookup chart (Act c)
<- chartLookup chart (Act c), rng'' <- projection r found
rng'' <- solutions $ projection r found, rng <- concatRange rng' rng''
rng <- solutions $ concRanges rng' rng'', guard $ subsumes (recs' !! d) found
subsumes (recs' !! d) found ] return $ Active rule found' rng (Lin l syms) lins (replaceRec recs' d found)
combine _ _ = [] combine _ _ = []
convert :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey c) -> Item n c l -- | Active Items with nothing to find are converted to Final items,
-> [Item n c l] -- which in turn are converted to Passive Items
convert _ (Active rule found rng (Lin l []) [] recs) = convert :: (Ord c, Ord n, Ord l) => AChart c n l -> Item c n l -> [Item c n l]
[ Passive rule (found ++ [(l, rng)]) recs ] convert _ (Active rule found rng (Lin lbl []) [] recs) =
return $ Final rule (found ++ [(lbl,rng)]) recs
convert _ (Final (Abs cat _ _) found _) =
return $ Passive cat found
convert _ _ = [] convert _ _ = []
----------------------------------------------------------------------
-- Naive --
-- | Creates an Active Item of every Rule in the Grammar to give the initial Agenda
predict :: (Ord c, Ord n, Ord l, Ord t) => MCFGrammar c n l t -> Input t -> [Item c n l]
predict grammar toks =
do Rule abs (Cnc _ _ lins) <- grammar
(lin':lins') <- rangeRestRec toks lins
return $ Active abs [] EmptyRange lin' lins' (emptyChildren abs)
----------------------------------------------------------------------
-- Earley -- -- Earley --
-- anropas med alla startregler
initial :: Eq t => [Rule n c l t] -> [t] -> [Item n c l]
initial starts toks =
[ Active (f, s, rhs) [] (Range (0, 0)) lin' lins' (replicate (length rhs) []) |
Rule s rhs lins f <- starts,
(lin':lins') <- solutions $ rangeRestRec toks lins ]
-- anropas med alla startkategorier
initial :: (Ord c, Ord n, Ord l, Ord t) => MCFGrammar c n l t -> [c] -> Input t -> [Item c n l]
initial mcfg starts toks =
do Rule abs@(Abs cat _ _) (Cnc _ _ lins) <- mcfg
guard $ cat `elem` starts
lin' : lins' <- rangeRestRec toks lins
return $ Active abs [] (Range (0, 0)) lin' lins' (emptyChildren abs)
-- earley prediction
predictEarley :: (Ord c, Ord n, Ord l, Ord t) => MCFGrammar c n l t -> Input t
-> AChart c n l -> Item c n l -> [Item c n l]
predictEarley mcfg toks _ (Active _ _ rng (Lin _ (Cat (cat,_,_):_)) _ _) =
do rule@(Rule (Abs cat' _ _) _) <- mcfg
guard $ cat == cat'
predEar toks rng rule
predictEarley _ _ _ _ = []
predEar :: (Ord c, Ord n, Ord l, Ord t) =>
Input t -> Range -> MCFRule c n l t -> [Item c n l]
predEar toks _ (Rule abs@(Abs _ [] _) (Cnc _ _ lins)) =
do lins' <- rangeRestRec toks lins
return $ Final abs (makeRangeRec lins') []
predEar toks rng (Rule abs (Cnc _ _ lins)) =
do lin' : lins' <- rangeRestRec toks lins
return $ Active abs [] (makeMaxRange rng) lin' lins' (emptyChildren abs)
makeMaxRange (Range (_, j)) = Range (j, j)
makeMaxRange EmptyRange = EmptyRange
----------------------------------------------------------------------
-- Kilbury -- -- Kilbury --
terminal :: (Ord c, Ord n, Ord l, Ord t) => MCFGrammar c n l t -> Input t -> [Item c n l]
terminal mcfg toks = terminal mcfg toks =
[ Passive (f, cat, []) (makeRangeRec lins') [] | do Rule abs@(Abs _ [] _) (Cnc _ _ lins) <- mcfg
Rule cat [] lins f <- mcfg, lins' <- rangeRestRec toks lins
lins' <- solutions $ rangeRestRec toks lins ] return $ Final abs (makeRangeRec lins') []
-- kilbury prediction
predictKilbury :: (Ord c, Ord n, Ord l, Ord t) =>
MCFGrammar c n l t -> Input t
-> AChart c n l -> Item c n l -> [Item c n l]
predictKilbury mcfg toks _ (Passive cat found) =
do Rule abs@(Abs _ rhs _) (Cnc _ _ (Lin l (Cat (cat', r, i):syms) : lins)) <- mcfg
guard $ cat == cat'
lin' : lins' <- rangeRestRec toks (Lin l syms : lins)
rng <- projection r found
let children = replaceRec (emptyChildren abs) i found
return $ Active abs [] rng lin' lins' children
predictKilbury _ _ _ _ = []

View File

@@ -0,0 +1,123 @@
{-- Module --------------------------------------------------------------------
Filename: IncrementalParse.hs
Author: Håkan Burden
Time-stamp: <2005-04-18, 15:07>
Description: An agenda-driven implementation of the incremental algorithm 4.6
that handles erasing and suppressing MCFG.
As described in Ljunglöf (2004)
------------------------------------------------------------------------------}
module IncrementalParse where
-- Haskell
import List
-- GF modules
import Examples
import GeneralChart
import MCFGrammar
import MCFParser
import Parser
import Range
import Nondet
{-- Datatypes -----------------------------------------------------------------
IChart: A RedBlackMap with Items and Keys
Item : One kind of Item since the Passive Items not necessarily need to be
saturated iow, they can still have rows to recognize.
IKey :
------------------------------------------------------------------------------}
type IChart n c l = ParseChart (Item n c l) (IKey c l)
data Item n c l = Active (AbstractRule n c)
(RangeRec l)
Range
(Lin c l Range)
(LinRec c l Range)
[RangeRec l]
-- | Passive (AbstractRule n c)
-- (RangeRec l)
-- [RangeRec l]
deriving (Eq, Ord, Show)
data IKey c l = Act c l Int
-- | ActE l
| Pass c l Int
-- | Pred l
| Useless
deriving (Eq, Ord, Show)
keyof :: Item n c l -> IKey c l
keyof (Active _ _ (Range (_,j)) (Lin _ ((Cat (next,lbl,_)):_)) _ _)
= Act next lbl j
keyof (Active (_, cat, _) found (Range (i,_)) (Lin lbl []) _ _)
= Pass cat lbl i
keyof _
= Useless
{-- Parsing -------------------------------------------------------------------
recognize:
parse : Builds a chart from the initial agenda, given by prediction, and
the inference rules
keyof : Given an Item returns an appropriate Key for the Chart
------------------------------------------------------------------------------}
recognize mcfg toks = chartMember (parse mcfg toks) item (keyof item)
where n = length toks
n2 = n `div` 2
item = Active ("f",S,[A])
[] (Range (0, n)) (Lin "s" []) []
[[("p", Range (0, n2)), ("q", Range (n2, n))]]
parse :: (Ord n, Ord c, Ord l, Eq t) => Grammar n c l t -> [t] -> IChart n c l
parse mcfg toks = buildChart keyof [complete ntoks, scan, combine] (predict mcfg toks ntoks)
where ntoks = length toks
complete :: (Ord n, Ord c, Ord l) => Int -> IChart n c l
-> Item n c l -> [Item n c l]
complete ntoks _ (Active rule found rng@(Range (_,j)) (Lin l []) lins recs) =
[ Active rule (found ++ [(l, rng)]) (Range (k,k)) lin lins' recs |
(lin, lins') <- select lins,
k <- [j .. ntoks] ]
complete _ _ _ = []
predict :: (Eq n, Eq c, Eq l, Eq t) => Grammar n c l t -> [t] -> Int -> [Item n c l]
predict mcfg toks n = [ Active (f, c, rhs) [] (Range (k,k)) lin' lins'' daughters |
Rule c rhs lins f <- mcfg,
let daughters = replicate (length rhs) [],
lins' <- solutions $ rangeRestRec toks lins,
(lin', lins'') <- select lins',
k <- [0..n] ]
scan :: (Ord n, Ord c, Ord l) => IChart n c l -> Item n c l -> [Item n c l]
scan _ (Active rule found rng (Lin l (Tok rng':syms)) lins recs) =
[ Active rule found rng'' (Lin l syms) lins recs |
rng'' <- solutions $ concRanges rng rng' ]
scan _ _ = []
combine :: (Ord n, Ord c, Ord l) => IChart n c l -> Item n c l -> [Item n c l]
combine chart (Active rule found rng@(Range (_,j)) (Lin l ((Cat (c,r,d)):syms)) lins recs) =
[ Active rule found rng'' (Lin l syms) lins (replaceRec recs d (found' ++ [(l',rng')])) |
Active _ found' rng' (Lin l' []) _ _ <- chartLookup chart (Pass c r j),
subsumes (recs !! d) (found' ++ [(l',rng')]),
rng'' <- solutions $ concRanges rng rng' ]
combine chart (Active (_,c,_) found rng'@(Range (i,_)) (Lin l []) _ _) =
[ Active rule found' rng'' (Lin l' syms) lins (replaceRec recs d (found ++ [(l,rng')])) |
Active rule found' rng (Lin l' ((Cat (c,r,d)):syms)) lins recs
<- chartLookup chart (Act c l i),
subsumes (recs !! d) (found ++ [(l,rng')]),
rng'' <- solutions $ concRanges rng rng' ]
combine _ _ = []

View File

@@ -1,5 +1,5 @@
module GF.NewParsing.MCFG.Naive where module GF.NewParsing.MCFG.Naive (parse) where
-- GF modules -- GF modules
@@ -8,21 +8,34 @@ import GF.Formalism.GCFG
import GF.Formalism.MCFG import GF.Formalism.MCFG
import GF.Formalism.Utilities import GF.Formalism.Utilities
import GF.NewParsing.MCFG.Range import GF.NewParsing.MCFG.Range
import GF.NewParsing.MCFG.PInfo
import GF.Data.SortedList import GF.Data.SortedList
import GF.Data.Assoc import GF.Data.Assoc
import GF.System.Tracing
{-- Datatypes and types ------------------------------------------------------- ----------------------------------------------------------------------
NChart : A RedBlackMap with Items and Keys -- * parsing
Item : The parse Items are either Active or Passive
NKey : One for Active Items, one for Passive and one for Active Items -- | Builds a chart from the initial agenda, given by prediction, and
to convert to Passive -- the inference rules
DottedRule: (function-name, LHS, [Found in RHS], [To find in RHS]) parse :: (Ord t, Ord n, Ord c, Ord l) => MCFParser c n l t
------------------------------------------------------------------------------} parse mcfg starts toks
= [ Abs (cat, makeRangeRec lins) (zip rhs rrecs) fun |
Active (Abs cat _Nil fun, rhs) lins rrecs <- chartLookup chart Final ]
where chart = process mcfg toks
process :: (Ord t, Ord n, Ord c, Ord l) => MCFGrammar c n l t -> Input t -> NChart c n l
process mcfg toks
= tracePrt "MCFG.Naive - chart size" prtSizes $
buildChart keyof [convert, combine] (predict toks mcfg)
----------------------------------------------------------------------
-- * type definitions
type NChart c n l = ParseChart (Item c n l) (NKey c) type NChart c n l = ParseChart (Item c n l) (NKey c)
data Item c n l = Active (DottedRule c n) (LinRec c l Range) [RangeRec l] data Item c n l = Active (DottedRule c n) (LinRec c l Range) [RangeRec l]
| Passive (Abstract c n) (RangeRec l) | Passive c (RangeRec l)
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
type DottedRule c n = (Abstract c n, [c]) type DottedRule c n = (Abstract c n, [c])
@@ -32,63 +45,43 @@ data NKey c = Act c
| Final | Final
deriving (Eq, Ord, Show) deriving (Eq, Ord, Show)
{-- Parsing -------------------------------------------------------------------
recognize:
parse : Builds a chart from the initial agenda, given by prediction, and
the inference rules
keyof : Given an Item returns an appropriate Key for the Chart
------------------------------------------------------------------------------}
parse :: (Ord t, Ord n, Ord c, Ord l) => MCFGrammar c n l t -> [t]
-> SyntaxChart n (c, RangeRec l)
parse mcfg toks = chart3
where chart3 = assocMap (const groupPairs) chart2
chart2 = accumAssoc id $ nubsort chart1
chart1 = [ ((cat, rrec), (fun, zip rhs rrecs)) |
Active (Abs cat _Nil fun, rhs) lins rrecs <- chartLookup chart0 Final,
let rrec = makeRangeRec lins ]
chart0 = process mcfg toks
process :: (Ord t, Ord n, Ord c, Ord l) => MCFGrammar c n l t -> [t] -> NChart c n l
process mcfg toks = buildChart keyof [convert, combine] (predict toks mcfg)
keyof :: Item c n l -> NKey c keyof :: Item c n l -> NKey c
keyof (Active (Abs _ (next:_) _, _) _ _) = Act next keyof (Active (Abs _ (next:_) _, _) _ _) = Act next
keyof (Passive (Abs cat _ _) _) = Pass cat keyof (Passive cat _) = Pass cat
keyof _ = Final keyof _ = Final
-- for tracing purposes
prtSizes chart = "final=" ++ show (length (chartLookup chart Final)) ++
", passive=" ++ show (sum [length (chartLookup chart k) |
k@(Pass _) <- chartKeys chart ]) ++
", active=" ++ show (sum [length (chartLookup chart k) |
k@(Act _) <- chartKeys chart ])
{--Inference rules ------------------------------------------------------------ ----------------------------------------------------------------------
predict: Creates an Active Item of every Rule in the Grammar to give the -- * inference rules
initial Agenda
combine: Creates an Active Item every time it is possible to combine
an Active Item from the agenda with a Passive Item from the Chart
convert: Active Items with nothing to find are converted to Passive Items
------------------------------------------------------------------------------}
predict :: (Eq t, Eq c) => [t] -> MCFGrammar c n l t -> [Item c n l] -- Creates an Active Item of every Rule in the Grammar to give the initial Agenda
predict :: Ord t => Input t -> MCFGrammar c n l t -> [Item c n l]
predict toks mcfg = [ Active (abs, []) lins' [] | predict toks mcfg = [ Active (abs, []) lins' [] |
Rule abs (Cnc _ _ lins) <- mcfg, Rule abs (Cnc _ _ lins) <- mcfg,
lins' <- rangeRestRec toks lins ] lins' <- rangeRestRec toks lins ]
-- | Creates an Active Item every time it is possible to combine
-- an Active Item from the agenda with a Passive Item from the Chart
combine :: (Ord n, Ord c, Ord l) => NChart c n l -> Item c n l -> [Item c n l] combine :: (Ord n, Ord c, Ord l) => NChart c n l -> Item c n l -> [Item c n l]
combine chart (Active (Abs nt (c:find) f, found) lins rrecs) = combine chart (Active (Abs nt (c:find) f, found) lins rrecs) =
do Passive _ rrec <- chartLookup chart (Pass c) do Passive _ rrec <- chartLookup chart (Pass c)
lins' <- concLinRec $ substArgRec (length found) rrec lins lins' <- concLinRec $ substArgRec (length found) rrec lins
return $ Active (Abs nt find f, found ++ [c]) lins' (rrecs ++ [rrec]) return $ Active (Abs nt find f, found ++ [c]) lins' (rrecs ++ [rrec])
combine chart (Passive (Abs c _ _) rrec) = combine chart (Passive c rrec) =
do Active (Abs nt (c:find) f, found) lins rrecs <- chartLookup chart (Act c) do Active (Abs nt (c:find) f, found) lins rrecs <- chartLookup chart (Act c)
lins' <- concLinRec $ substArgRec (length found) rrec lins lins' <- concLinRec $ substArgRec (length found) rrec lins
return $ Active (Abs nt find f, found ++ [c]) lins' (rrecs ++ [rrec]) return $ Active (Abs nt find f, found ++ [c]) lins' (rrecs ++ [rrec])
combine _ _ = [] combine _ _ = []
-- | Active Items with nothing to find are converted to Passive Items
convert :: (Ord n, Ord c, Ord l) => NChart c n l -> Item c n l -> [Item c n l] convert :: (Ord n, Ord c, Ord l) => NChart c n l -> Item c n l -> [Item c n l]
convert _ (Active (Abs nt [] f, rhs) lins _) = [Passive (Abs nt rhs f) rrec] convert _ (Active (Abs cat [] _, _) lins _) = [Passive cat rrec]
where rrec = makeRangeRec lins where rrec = makeRangeRec lins
convert _ _ = [] convert _ _ = []

View File

@@ -4,15 +4,14 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/19 10:46:08 $ -- > CVS $Date: 2005/04/20 12:49:45 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.1 $ -- > CVS $Revision: 1.2 $
-- --
-- MCFG parsing, parser information -- MCFG parsing, parser information
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.NewParsing.MCFG.PInfo module GF.NewParsing.MCFG.PInfo where
(MCFParser, MCFPInfo(..), buildMCFPInfo) where
import GF.System.Tracing import GF.System.Tracing
import GF.Infra.Print import GF.Infra.Print
@@ -22,6 +21,7 @@ import GF.Formalism.GCFG
import GF.Formalism.MCFG import GF.Formalism.MCFG
import GF.Data.SortedList import GF.Data.SortedList
import GF.Data.Assoc import GF.Data.Assoc
import GF.NewParsing.MCFG.Range
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- type declarations -- type declarations
@@ -32,10 +32,13 @@ type MCFParser c n l t = MCFPInfo c n l t
-> Input t -> Input t
-> MCFChart c n l -> MCFChart c n l
type MCFChart c n l = [(n, (c, RangeRec l), [(c, RangeRec l)])] type MCFChart c n l = [Abstract (c, RangeRec l) n]
type MCFPInfo c n l t = MCFGrammar c n l t type MCFPInfo c n l t = MCFGrammar c n l t
buildCFPInfo :: (Ord n, Ord c, Ord l, Ord t) => MCFGrammar c n l t -> MCFPInfo c n l t buildMCFPInfo :: (Ord n, Ord c, Ord l, Ord t) => MCFGrammar c n l t -> MCFPInfo c n l t
buildCFPInfo = id buildMCFPInfo = id
makeFinalEdge :: c -> l -> (Int, Int) -> (c, RangeRec l)
makeFinalEdge cat lbl bnds = (cat, [(lbl, makeRange bnds)])

View File

@@ -11,7 +11,7 @@ import GF.Formalism.GCFG
import GF.Formalism.MCFG import GF.Formalism.MCFG
import GF.Formalism.Utilities import GF.Formalism.Utilities
import GF.Infra.Print import GF.Infra.Print
import GF.Data.Assoc ((?))
------------------------------------------------------------ ------------------------------------------------------------
-- ranges as single pairs -- ranges as single pairs
@@ -95,29 +95,29 @@ makeRangeRec lins = map convLin lins
--- Record projection -------------------------------------------------------- --- Record projection --------------------------------------------------------
projection :: Eq l => l -> RangeRec l -> [Range] projection :: Ord l => l -> RangeRec l -> [Range]
projection l rec = maybe (fail "projection") return $ lookup l rec projection l rec = maybe (fail "projection") return $ lookup l rec
--- Range restriction -------------------------------------------------------- --- Range restriction --------------------------------------------------------
rangeRestTok :: Eq t => [t] -> t -> [Range] rangeRestTok :: Ord t => Input t -> t -> [Range]
rangeRestTok toks tok = do i <- elemIndices tok toks rangeRestTok toks tok = do rng <- inputToken toks ? tok
return (makeRange (i, i+1)) return (makeRange rng)
rangeRestSym :: Eq t => [t] -> Symbol a t -> [Symbol a Range] rangeRestSym :: Ord t => Input t -> Symbol a t -> [Symbol a Range]
rangeRestSym toks (Tok tok) = do rng <- rangeRestTok toks tok rangeRestSym toks (Tok tok) = do rng <- rangeRestTok toks tok
return (Tok rng) return (Tok rng)
rangeRestSym _ (Cat c) = return (Cat c) rangeRestSym _ (Cat c) = return (Cat c)
rangeRestLin :: Eq t => [t] -> Lin c l t -> [Lin c l Range] rangeRestLin :: Ord t => Input t -> Lin c l t -> [Lin c l Range]
rangeRestLin toks (Lin lbl syms) = do syms' <- mapM (rangeRestSym toks) syms rangeRestLin toks (Lin lbl syms) = do syms' <- mapM (rangeRestSym toks) syms
return (Lin lbl syms') return (Lin lbl syms')
rangeRestRec :: Eq t => [t] -> LinRec c l t -> [LinRec c l Range] rangeRestRec :: Ord t => Input t -> LinRec c l t -> [LinRec c l Range]
rangeRestRec toks = mapM (rangeRestLin toks) rangeRestRec toks = mapM (rangeRestLin toks)
@@ -131,7 +131,7 @@ replaceRec recs i rec = (fst tup) ++ [rec] ++ (tail $ snd tup)
--- Argument substitution ---------------------------------------------------- --- Argument substitution ----------------------------------------------------
substArgSymbol :: Eq l => Int -> RangeRec l -> Symbol (c, l, Int) Range substArgSymbol :: Ord l => Int -> RangeRec l -> Symbol (c, l, Int) Range
-> Symbol (c, l, Int) Range -> Symbol (c, l, Int) Range
substArgSymbol i rec (Tok rng) = (Tok rng) substArgSymbol i rec (Tok rng) = (Tok rng)
substArgSymbol i rec (Cat (c, l, j)) substArgSymbol i rec (Cat (c, l, j))
@@ -139,13 +139,13 @@ substArgSymbol i rec (Cat (c, l, j))
| otherwise = (Cat (c, l, j)) | otherwise = (Cat (c, l, j))
substArgLin :: Eq l => Int -> RangeRec l -> Lin c l Range substArgLin :: Ord l => Int -> RangeRec l -> Lin c l Range
-> Lin c l Range -> Lin c l Range
substArgLin i rec (Lin lbl syms) = substArgLin i rec (Lin lbl syms) =
(Lin lbl (map (substArgSymbol i rec) syms)) (Lin lbl (map (substArgSymbol i rec) syms))
substArgRec :: Eq l => Int -> RangeRec l -> LinRec c l Range substArgRec :: Ord l => Int -> RangeRec l -> LinRec c l Range
-> LinRec c l Range -> LinRec c l Range
substArgRec i rec lins = map (substArgLin i rec) lins substArgRec i rec lins = map (substArgLin i rec) lins
@@ -153,7 +153,7 @@ substArgRec i rec lins = map (substArgLin i rec) lins
--- Subsumation ------------------------------------------------------------- --- Subsumation -------------------------------------------------------------
-- "rec' subsumes rec?" -- "rec' subsumes rec?"
subsumes :: Eq l => RangeRec l -> RangeRec l -> Bool subsumes :: Ord l => RangeRec l -> RangeRec l -> Bool
subsumes rec rec' = and [elem r rec' | r <- rec] subsumes rec rec' = and [elem r rec' | r <- rec]

View File

@@ -0,0 +1,183 @@
{-- Module --------------------------------------------------------------------
Filename: ApproxParse.hs
Author: Håkan Burden
Time-stamp: <2005-04-18, 14:56>
Description: An agenda-driven implementation of the active algorithm 4.3.4,
parsing through context-free approximation as described in
Ljunglöf (2004)
------------------------------------------------------------------------------}
module ApproxParse where
-- Haskell modules
import List
import Monad
-- GF modules
import ConvertMCFGtoDecoratedCFG
import qualified DecoratedCFParser as CFP
import qualified DecoratedGrammar as CFG
import Examples
import GeneralChart
import qualified MCFGrammar as MCFG
import MCFParser
import Nondet
import Parser
import Range
{-- Datatypes -----------------------------------------------------------------
Chart
Item
Key
Item : Four different Items are used. PreMCFG for MCFG Pre Items, Pre are
the Items returned by the pre-Functions and Mark are the
corresponding Items for the mark-Functions. For convenience correctly
marked Mark Items are converted to Passive Items.
I use dottedrule for convenience to keep track of wich daughter's RangeRec to look for.
AChart: A RedBlackMap with Items and Keys
AKey :
------------------------------------------------------------------------------}
--Ev ta bort några typer av Item och bara nyckla på det som är unikt för den typen...
data Item n c l = PreMCFG (n, c) (RangeRec l) [RangeRec l]
| Pre (n, c) (RangeRec l) [l] [RangeRec l]
| Mark (n, c) (RangeRec l) (RangeRec l) [RangeRec l]
| Passive (n, c) (RangeRec l) (RangeRec l)
deriving (Eq, Ord, Show)
type AChart n c l = ParseChart (Item n c l) (AKey n c l)
data AKey n c l = Pr (n, c) l
| Pm (n, c) l
| Mk (RangeRec l)
| Ps (RangeRec l)
| Useless
deriving (Eq, Ord, Show)
{-- Parsing -------------------------------------------------------------------
recognize:
parse : The Agenda consists of the Passive Items from context-free
approximation (as PreMCFG Items) and the Pre Items inferred by
pre-prediction.
keyof : Given an Item returns an appropriate Key for the Chart
------------------------------------------------------------------------------}
recognize strategy mcfg toks = chartMember (parse strategy mcfg toks)
(Passive ("f", S)
[("s" , MCFG.Range (0, n))]
[("p" , MCFG.Range (0, n2)), ("q", MCFG.Range (n2, n))])
(Ps [("s" , MCFG.Range (0, n))])
where n = length toks
n2 = n `div` 2
--parse :: (Ord n, Ord NT, Ord String, Eq t) => CFP.Strategy -> MCFG.Grammar n NT String t -> [t]
-- -> AChart n NT String
parse strategy mcfg toks
= buildChart keyof
[preCombine, markPredict, markCombine, convert]
(makePreItems (CFP.parse strategy (CFG.pInfo (convertGrammar mcfg)) [(S, "s")] toks) ++
(prePredict mcfg))
keyof :: Item n c l -> AKey n c l
keyof (PreMCFG head [(lbl, rng)] _) = Pm head lbl
keyof (Pre head _ (lbl:lbls) _) = Pr head lbl
keyof (Mark _ _ _ (rec:recs)) = Mk rec
keyof (Passive _ rec _) = Ps rec
keyof _ = Useless
{-- Initializing agenda -------------------------------------------------------
makePreItems:
------------------------------------------------------------------------------}
makePreItems :: (Eq c, Ord i) => CFG.Grammar n (Edge (c, l)) i t -> [Item n c l]
makePreItems cfchart
= [ PreMCFG (fun, cat) [(lbl, MCFG.makeRange (i, j))] (symToRec beta) |
CFG.Rule (Edge i j (cat,lbl)) beta fun <- cfchart ]
prePredict :: (Ord n, Ord c, Ord l) => MCFG.Grammar n c l t -> [Item n c l]
prePredict mcfg =
[ Pre (f, nt) [] (getLables lins) (replicate (nrOfCats (head lins)) []) |
MCFG.Rule nt nts lins f <- mcfg ]
{-- Inference rules ---------------------------------------------------------
prePredict :
preCombine :
markPredict:
markCombine:
convert :
----------------------------------------------------------------------------}
preCombine :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey n c l)
-> Item n c l -> [Item n c l]
preCombine chart (Pre head rec (l:ls) recs) =
[ Pre head (rec ++ [(l, r)]) ls recs'' |
PreMCFG head [(l, r)] recs' <- chartLookup chart (Pm head l),
recs'' <- solutions (unifyRangeRecs recs recs') ]
preCombine chart (PreMCFG head [(l, r)] recs) =
[ Pre head (rec ++ [(l, r)]) ls recs'' |
Pre head rec (l:ls) recs' <- chartLookup chart (Pr head l),
recs'' <- solutions (unifyRangeRecs recs recs') ]
preCombine _ _ = []
markPredict :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey n c l)
-> Item n c l -> [Item n c l]
markPredict _ (Pre (n, c) rec [] recs) = [Mark (n, c) rec [] recs]
markPredict _ _ = []
markCombine :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey n c l)
-> Item n c l -> [Item n c l]
markCombine chart (Mark (f, c) rec mRec (r:recs)) =
[ Mark (f, c) rec (mRec ++ r) recs |
Passive _ r _ <- chartLookup chart (Ps r)]
markCombine chart (Passive _ r _) =
[ Mark (f, c) rec (mRec++r) recs |
Mark (f, c) rec mRec (r:recs) <- chartLookup chart (Mk r) ]
markCombine _ _ = []
convert :: (Ord n, Ord c, Ord l) => ParseChart (Item n c l) (AKey n c l)
-> Item n c l -> [Item n c l]
convert _ (Mark (f, c) r rec []) = [Passive (f, c) r rec]
convert _ _ = []
{-- Help functions ----------------------------------------------------------------
getRHS :
getLables:
symToRec :
----------------------------------------------------------------------------------}
-- FULKOD !
nrOfCats :: Eq c => MCFG.Lin c l t  -> Int
nrOfCats (MCFG.Lin l syms) = length $ nub [(c, i) | Cat (c, l, i) <- syms]
--
getLables :: LinRec c l t -> [l]
getLables lins = [l | MCFG.Lin l syms <- lins]
--
symToRec :: Ord i => [Symbol (Edge (c, l), i) d] -> [[(l, MCFG.Range)]]
symToRec beta = map makeLblRng $ groupBy (\(_, d) (_, d') -> (d == d'))
$ sortBy sBd [(Edge i j (c, l) , d) | Cat (Edge i j (c, l), d)
<- beta]
where makeLblRng edges = [(l, (MCFG.makeRange (i, j))) | (Edge i j (_, l), _)
<- edges]
sBd (_, d) (_, d')
| d < d' = LT
| d > d' = GT
| otherwise = EQ

View File

@@ -5,9 +5,9 @@
-- Stability : (stable) -- Stability : (stable)
-- Portability : (portable) -- Portability : (portable)
-- --
-- > CVS $Date: 2005/04/14 18:38:36 $ -- > CVS $Date: 2005/04/20 12:49:45 $
-- > CVS $Author: peb $ -- > CVS $Author: peb $
-- > CVS $Revision: 1.18 $ -- > CVS $Revision: 1.19 $
-- --
-- (Description of the module) -- (Description of the module)
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@@ -69,7 +69,7 @@ parseStringC opts0 sg cat s
let opts = unionOptions opts0 $ stateOptions sg let opts = unionOptions opts0 $ stateOptions sg
pm = maybe "" id $ getOptVal opts0 useParser -- -parser=pm pm = maybe "" id $ getOptVal opts0 useParser -- -parser=pm
tok = customOrDefault opts useTokenizer customTokenizer sg tok = customOrDefault opts useTokenizer customTokenizer sg
ts <- return $ New.parse pm (pInfo sg) (absId sg) cat (tok s) ts <- checkErr $ New.parse pm (pInfo sg) (absId sg) cat (tok s)
ts' <- mapM (checkErr . annotate (stateGrammarST sg) . refreshMetas []) ts ts' <- mapM (checkErr . annotate (stateGrammarST sg) . refreshMetas []) ts
return $ optIntOrAll opts flagNumber ts' return $ optIntOrAll opts flagNumber ts'

View File

@@ -2,7 +2,7 @@
följande är en föreslagen hierarkisk modulstruktur för GF 2.2 följande är en föreslagen hierarkisk modulstruktur för GF 2.2
katalogen src kommer att innehålla (åtminstone) följande: * katalogen src kommer att innehålla (åtminstone) följande:
- GF.hs modulen Main - GF.hs modulen Main
- GF/ resten av Haskell-filerna - GF/ resten av Haskell-filerna
- JavaGUI/ java-filer - JavaGUI/ java-filer
@@ -12,249 +12,65 @@ katalogen src kommer att inneh
- run-haddock.csh - run-haddock.csh
- check-haddock.perl - check-haddock.perl
modifiera gärna strukturen och kommentarerna nedan
----------------------------------------------------------------------
GF * struktur för haskell-filer:
GF/ GF.Formalism (finns redan)
GFModes - flyttas till Shell?? GF.Conversion (...)
GF.Parsing (heter nu GF.NewParsing, bör byta namn)
GF.System (finns redan, för filer som har med
operativsystemet att göra, t.ex. Tracing och Arch)
API/ filerna GF.NewParsing.GeneralChart och GF.NewParsing.IncrementalChart
API flyttas och byter namn till GF.Data.GeneralDeduction och GF.Data.IncrementalDeduction
BatchTranslate
GrammarToHaskell
IOGrammar
MyParser - obsolet?
CF/ - bör så småningom försvinna vart ska filerna GFModes, Help, HelpFile, Today flyttas?
(ersättas med mer generell CFG-datatyp) förslag: Help, HelpFile, Today -> GF.System
CF
CFIdent
CFtoGrammar
CFtoSRG
CanonToCF
ChartParser - obsolet.
EBNF - ta bort parserkombinatorerna -- skapa en bnfc-fil
PPrCF
PrLBNF
Profile
Canon/ api -> GF.API
AbsGFC [1/2 - AUTO] cf -> GF.CF
CMacros canonical -> GF.Canon
CanonToGrammar compile -> GF.Compile
GFC
GetGFC
Look
MkGFC
PrExp
Share
Unlex
LexGFC [AUTO]
ParGFC [AUTO]
PrintGFC [1/2 - AUTO]
SkelGFC [AUTO]
TestGFC [AUTO]
[GFC.cf] bnfc-fil infra -> GF.Data (datatyper, algoritmer - helst ej direkt beroende av GF)
[ParGFC.y] [AUTO] happy-fil GF.Infra (GF-infrastruktur)
[LexGFC.x] [AUTO] alex-fil GF.Text (t.ex. olika språk, teckenkodningar)
Compile/ (...) -> GF.Fudgets (alla filer som har med fudgets att göra)
CheckGrammar grammar -> GF.Grammar
Compile cfgm -> GF.CFGM
Extend source -> GF.Source
GetGrammar shell -> GF.Shell
GrammarToCanon speech -> GF.Speech
MkResource translate -> GF.Translate
MkUnion useGrammar -> GF.UseGrammar
ModDeps visuali... -> GF.Visualization
NewRename
Optimize
PGrammar
PrOld
Rebuild
RemoveLiT
Rename
ShellState
Update
Data/ parsers -> filerna (ParGF och ParGFC) flyttas till där GF.cf och GFC.cf finns
Assoc
Glue
Map - slås ihop med RedBlackSet
OrdMap2 - obsolet - använd Assoc istället
OrdSet - obsolet - använd SortedList istället
RedBlack \ slås samman
RedBlackSet /
SharedString [AUTO?]
SortedList
Trie \ slås samman
Trie2 /
Zipper
CheckM
ErrM
GenneralInduction
IncrementalInduction
Fudgets/ util -> Extras (kanske på toppnivå - inte GF.Extras)
EventF
FudgetOps
UnicodeF
WriteF
CommandF
Grammar/
AbsCompute
Abstract
AppPredefined
Compute
Grammar
Lockfield
LookAbs
Lookup
MMacros
Macros
PatternMatch
PrGrammar
Refresh
ReservedWords
TC
TypeCheck
Unify
Values
CFGM/ * java-katalogen byter namn:
AbsCFG [AUTO]
LexCFG [AUTO]
ParCFG [AUTO]
PrintCFG [AUTO]
PrintCFGrammar
[CFG.cf] bnfc-fil java -> JavaGUI
[ParCFG.y] [AUTO] happy-fil
[LexCFG.x] [AUTO] alex-fil
Source/
AbsGF [AUTO]
LexGF [AUTO]
ParGF [AUTO]
PrintGF [AUTO]
SkelGF [AUTO]
TestGF [AUTO]
SourceToGrammar
GrammarToSource
[GF.cf] bnfc-fil * haddock samlas på ett ställe:
[ParGF.y] [AUTO] happy-fil
[LexGF.x] [AUTO] alex-fil
Infra/ haddock-check.perl -> haddock/check-haddock.perl
Comments haddock-script.csh -> haddock/run-haddock.csh
Ident haddock-resources/ -> haddock/resources/
Modules haddock/ -> haddock/html
Operations
Option
Parsers - nästan obsolet (används bara i EBNF)
ReadFiles
Str
UseIO
Formalism/
Conversion/
Parsing/ dela upp i Grammar och Parsing?
(då måste nuvarande Grammar byta namn)
CFGrammar -> Grammar
CFParserGeneral
CFParserIncremental
ConvertGFCtoMCFG -> Grammar
ConvertGrammar -> Grammar
ConvertMCFGtoCFG -> Grammar
GeneralChart
GrammarTypes -> Grammar
IncrementalChart
MCFGrammar -> Grammar
MCFParserBasic
MCFRange - obsolet
ParseCF
ParseCFG
ParseGFC
ParseMCFG
Parser
PrintParser
PrintSimplifiedTerm
Shell/ * kataloger som kan tas bort?
CommandL
Commands
JGF
PShell
Shell
ShellCommands
SubShell
TeachYourself
Speech/ for-xxx (obsoleta)
PrGSL haddock
PrJSGF newparsing (tom)
SRG notrace (tom)
TransformCFG trace (tom)
parsers (tom efter flytt av filer)
System/ old-stuff (obsolet)
Arch GF.OldParsing (obsolet)
ArchEdit
Tracing
Text/
Arabic
Devanagari
Ethiopic
ExtendedArabic
ExtraDiacritics
Greek
Hebrew
Hiragana
LatinASupplement
OCSCyrillic
Russian
Tamil
Text
UTF8
Unicode
Translate/
GFT
UseGrammar/
Custom
Editing
Generate
GetTree
Information
Linear
MoreCustom - obsolet?
Morphology
Paraphrases
Parsing
Randomized
RealMoreCustom - obsolet?
Session
TeachYourself
Tokenize
Transfer
Util/ byta namn till Extra?
Today [AUTO]
HelpFile [AUTO]
AlphaConvGF
GFDoc
Htmls
MkHelpFile
HelpFile byta namn till HelpFile.txt?
[mkHelpFile.perl] ersättning för MkHelpFile?
[mktoday.sh]
Visualization/
VisualizeGrammar