summaryrefslogtreecommitdiff
path: root/src/GF/Parsing/MCFG.hs
blob: 6aec811de19ed1e8d97b8e0bcfdd22d635796a57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
----------------------------------------------------------------------
-- |
-- Maintainer  : PL
-- Stability   : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/05/11 10:28:16 $ 
-- > CVS $Author: peb $
-- > CVS $Revision: 1.5 $
--
-- MCFG parsing
-----------------------------------------------------------------------------

module GF.Parsing.MCFG
    (parseMCF, module GF.Parsing.MCFG.PInfo) where

import GF.Data.Operations (Err(..))

import GF.Formalism.Utilities
import GF.Formalism.GCFG
import GF.Formalism.MCFG
import GF.Parsing.MCFG.PInfo

import qualified GF.Parsing.MCFG.Naive as Naive
import qualified GF.Parsing.MCFG.Active as Active
import qualified GF.Parsing.MCFG.Active2 as Active2
import qualified GF.Parsing.MCFG.Incremental as Incremental
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 prs | prs `elem` strategies = Ok $ parseMCF' prs
	     | otherwise = Bad $ "MCFG parsing strategy not defined: " ++ prs 


strategies = words "bottomup topdown n an ab at i an2 ab2 at2 i2 rn ran rab rat ri"


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