diff options
| author | peb <unknown> | 2005-05-11 09:28:16 +0000 |
|---|---|---|
| committer | peb <unknown> | 2005-05-11 09:28:16 +0000 |
| commit | 54a1e0f879be657863cdcaed37fa609241369e8f (patch) | |
| tree | f3d8e85111f792011393d83fa7c4bc5bc12f8852 /src/GF/Parsing | |
| parent | faa3144390363256e30df634b91b86d9f7522e1a (diff) | |
"Committed_by_peb"
Diffstat (limited to 'src/GF/Parsing')
| -rw-r--r-- | src/GF/Parsing/CFG.hs | 15 | ||||
| -rw-r--r-- | src/GF/Parsing/GFC.hs | 29 | ||||
| -rw-r--r-- | src/GF/Parsing/MCFG.hs | 49 |
3 files changed, 50 insertions, 43 deletions
diff --git a/src/GF/Parsing/CFG.hs b/src/GF/Parsing/CFG.hs index 34b1619a4..f64ce55f1 100644 --- a/src/GF/Parsing/CFG.hs +++ b/src/GF/Parsing/CFG.hs @@ -4,9 +4,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/04/21 16:23:05 $ --- > CVS $Author: bringert $ --- > CVS $Revision: 1.4 $ +-- > CVS $Date: 2005/05/11 10:28:16 $ +-- > CVS $Author: peb $ +-- > CVS $Revision: 1.5 $ -- -- CFG parsing ----------------------------------------------------------------------------- @@ -27,6 +27,10 @@ import qualified GF.Parsing.CFG.General as Gen -- parsing parseCF :: (Ord n, Ord c, Ord t) => String -> Err (CFParser c n t) + +parseCF "bottomup" = Ok $ Gen.parse bottomup +parseCF "topdown" = Ok $ Gen.parse topdown + parseCF "gb" = Ok $ Gen.parse bottomup parseCF "gt" = Ok $ Gen.parse topdown parseCF "ib" = Ok $ Inc.parse (bottomup, noFilter) @@ -35,10 +39,9 @@ parseCF "ibFT" = Ok $ Inc.parse (bottomup, topdown) parseCF "ibFB" = Ok $ Inc.parse (bottomup, bottomup) parseCF "ibFTB" = Ok $ Inc.parse (bottomup, bothFilters) parseCF "itF" = Ok $ Inc.parse (topdown, bottomup) --- default parser: -parseCF "" = parseCF "gb" + -- error parser: -parseCF prs = Bad $ "Parser not defined: " ++ prs +parseCF prs = Bad $ "CFG parsing strategy not defined: " ++ prs bottomup = (True, False) topdown = (False, True) diff --git a/src/GF/Parsing/GFC.hs b/src/GF/Parsing/GFC.hs index 5476b8e8b..ec2409515 100644 --- a/src/GF/Parsing/GFC.hs +++ b/src/GF/Parsing/GFC.hs @@ -4,9 +4,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/09 09:28:45 $ +-- > CVS $Date: 2005/05/11 10:28:16 $ -- > CVS $Author: peb $ --- > CVS $Revision: 1.7 $ +-- > CVS $Revision: 1.8 $ -- -- The main parsing module, parsing GFC grammars -- by translating to simpler formats, such as PMCFG and CFG @@ -58,14 +58,15 @@ instance Print PInfo where ---------------------------------------------------------------------- -- main parsing function -parse :: String -- ^ parsing strategy +parse :: String -- ^ parsing algorithm (mcfg/cfg) + -> String -- ^ parsing strategy -> PInfo -- ^ compiled grammars (mcfg and cfg) -> Ident.Ident -- ^ abstract module name -> CFCat -- ^ starting category -> [CFTok] -- ^ input tokens -> Err [Grammar.Term] -- ^ resulting GF terms -parse (prs:strategy) pinfo abs startCat inString = +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 @@ -81,34 +82,32 @@ parse (prs:strategy) pinfo abs startCat inString = -- 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 -selectParser prs strategy pinfo startCat inTokens | prs=='c' +selectParser "c" strategy pinfo startCat inTokens = do let startCats = tracePrt "Parsing.GFC - starting CF categories" prt $ filter isStart $ map fst $ aAssocs $ PC.topdownRules cfpi isStart cat = ccat2scat cat == cfCat2Ident startCat cfpi = cfPInfo pinfo cfParser <- PC.parseCF strategy - let cfChart = tracePrt "Parsing.GFC - sz. CF chart" (prt . length) $ + let cfChart = tracePrt "Parsing.GFC - CF chart" (prt . length) $ cfParser cfpi startCats inTokens - chart = tracePrt "Parsing.GFC - sz. chart" (prt . map (length.snd) . aAssocs) $ + chart = tracePrt "Parsing.GFC - 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 -selectParser prs strategy pinfo startCat inTokens | prs=='m' +selectParser "m" strategy pinfo startCat inTokens = do let startCats = tracePrt "Parsing.GFC - starting MCF categories" prt $ filter isStart $ PM.grammarCats mcfpi isStart cat = mcat2scat cat == cfCat2Ident startCat mcfpi = mcfPInfo pinfo - mcfChart <- PM.parseMCF strategy mcfpi startCats inTokens - traceM "Parsing.GFC - sz. MCF chart" (prt (length mcfChart)) - let chart = tracePrt "Parsing.GFC - sz. chart" (prt . length . concat . map snd . aAssocs) $ + mcfParser <- PM.parseMCF strategy + let mcfChart = tracePrt "Parsing.GFC - MCF chart" (prt . length) $ + mcfParser mcfpi startCats inTokens + chart = tracePrt "Parsing.GFC - chart" (prt . length . concat . map snd . aAssocs) $ G.abstract2chart mcfChart finalEdges = tracePrt "Parsing.GFC - final chart edges" prt $ [ PM.makeFinalEdge cat lbl (inputBounds inTokens) | @@ -116,7 +115,7 @@ selectParser prs strategy pinfo startCat inTokens | prs=='m' return $ chart2forests chart (const False) finalEdges -- error parser: -selectParser prs strategy _ _ _ = Bad $ "Parser not defined: " ++ (prs:strategy) +selectParser prs strategy _ _ _ = Bad $ "Parser '" ++ prs ++ "' not defined with strategy: " ++ strategy ---------------------------------------------------------------------- diff --git a/src/GF/Parsing/MCFG.hs b/src/GF/Parsing/MCFG.hs index 4cfc6e2ec..6aec811de 100644 --- a/src/GF/Parsing/MCFG.hs +++ b/src/GF/Parsing/MCFG.hs @@ -4,9 +4,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/09 09:28:45 $ +-- > CVS $Date: 2005/05/11 10:28:16 $ -- > CVS $Author: peb $ --- > CVS $Revision: 1.4 $ +-- > CVS $Revision: 1.5 $ -- -- MCFG parsing ----------------------------------------------------------------------------- @@ -30,30 +30,35 @@ import qualified GF.Parsing.MCFG.Incremental2 as Incremental2 ---------------------------------------------------------------------- -- parsing --- parseMCF :: (Ord c, Ord n, Ord l, Ord t) => String -> Err (MCFParser c n l t) +parseMCF :: (Ord c, Ord n, Ord l, Ord t) => String -> Err (MCFParser c n l t) +parseMCF prs | prs `elem` strategies = Ok $ parseMCF' prs + | otherwise = Bad $ "MCFG parsing strategy not defined: " ++ prs -parseMCF "n" pinfo starts toks = Ok $ Naive.parse pinfo starts toks -parseMCF "an" pinfo starts toks = Ok $ Active.parse "n" pinfo starts toks -parseMCF "ab" pinfo starts toks = Ok $ Active.parse "b" pinfo starts toks -parseMCF "at" pinfo starts toks = Ok $ Active.parse "t" pinfo starts toks -parseMCF "i" pinfo starts toks = Ok $ Incremental.parse pinfo starts toks -parseMCF "an2" pinfo starts toks = Ok $ Active2.parse "n" pinfo starts toks -parseMCF "ab2" pinfo starts toks = Ok $ Active2.parse "b" pinfo starts toks -parseMCF "at2" pinfo starts toks = Ok $ Active2.parse "t" pinfo starts toks -parseMCF "i2" pinfo starts toks = Ok $ Incremental2.parse pinfo starts toks +strategies = words "bottomup topdown n an ab at i an2 ab2 at2 i2 rn ran rab rat ri" -parseMCF "rn" pinfo starts toks = Ok $ Naive.parseR (rrP pinfo toks) starts -parseMCF "ran" pinfo starts toks = Ok $ Active.parseR "n" (rrP pinfo toks) starts -parseMCF "rab" pinfo starts toks = Ok $ Active.parseR "b" (rrP pinfo toks) starts -parseMCF "rat" pinfo starts toks = Ok $ Active.parseR "t" (rrP pinfo toks) starts -parseMCF "ri" pinfo starts toks = Ok $ Incremental.parseR (rrP pinfo toks) starts ntoks - where ntoks = snd (inputBounds toks) --- default parsers: -parseMCF "" pinfo starts toks = parseMCF "n" pinfo starts toks --- error parser: -parseMCF prs pinfo starts toks = Bad $ "Parser not defined: " ++ prs +parseMCF' :: (Ord c, Ord n, Ord l, Ord t) => String -> MCFParser c n l t + +parseMCF' "bottomup" pinfo starts toks = Active.parse "b" pinfo starts toks +parseMCF' "topdown" pinfo starts toks = Active.parse "t" pinfo starts toks + +parseMCF' "n" pinfo starts toks = Naive.parse pinfo starts toks +parseMCF' "an" pinfo starts toks = Active.parse "n" pinfo starts toks +parseMCF' "ab" pinfo starts toks = Active.parse "b" pinfo starts toks +parseMCF' "at" pinfo starts toks = Active.parse "t" pinfo starts toks +parseMCF' "i" pinfo starts toks = Incremental.parse pinfo starts toks +parseMCF' "an2" pinfo starts toks = Active2.parse "n" pinfo starts toks +parseMCF' "ab2" pinfo starts toks = Active2.parse "b" pinfo starts toks +parseMCF' "at2" pinfo starts toks = Active2.parse "t" pinfo starts toks +parseMCF' "i2" pinfo starts toks = Incremental2.parse pinfo starts toks + +parseMCF' "rn" pinfo starts toks = Naive.parseR (rrP pinfo toks) starts +parseMCF' "ran" pinfo starts toks = Active.parseR "n" (rrP pinfo toks) starts +parseMCF' "rab" pinfo starts toks = Active.parseR "b" (rrP pinfo toks) starts +parseMCF' "rat" pinfo starts toks = Active.parseR "t" (rrP pinfo toks) starts +parseMCF' "ri" pinfo starts toks = Incremental.parseR (rrP pinfo toks) starts ntoks + where ntoks = snd (inputBounds toks) rrP pi = rangeRestrictPInfo pi |
