forked from GitHub/gf-core
52 lines
1.8 KiB
Haskell
52 lines
1.8 KiB
Haskell
----------------------------------------------------------------------
|
|
-- |
|
|
-- Maintainer : PL
|
|
-- Stability : (stable)
|
|
-- Portability : (portable)
|
|
--
|
|
-- > CVS $Date: 2005/05/09 09:28:43 $
|
|
-- > CVS $Author: peb $
|
|
-- > CVS $Revision: 1.6 $
|
|
--
|
|
-- Converting MCFG grammars to equivalent optimized FCFG
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
module GF.Conversion.MCFGtoFCFG
|
|
(convertGrammar) where
|
|
|
|
import Control.Monad
|
|
import List (elemIndex)
|
|
import Array
|
|
|
|
import GF.Formalism.Utilities
|
|
import GF.Formalism.GCFG
|
|
import GF.Formalism.MCFG
|
|
import GF.Formalism.FCFG
|
|
import GF.Conversion.Types
|
|
import GF.Data.SortedList (nubsort)
|
|
|
|
import GF.Infra.Print
|
|
|
|
----------------------------------------------------------------------
|
|
-- * converting MCFG to optimized FCFG
|
|
|
|
convertGrammar :: MGrammar -> FGrammar
|
|
convertGrammar gram = [ FRule (Abs (fcat cat) (map fcat cats) name) (fcnc cnc) |
|
|
Rule (Abs cat cats name) cnc <- gram ]
|
|
where mcats = nubsort [ mc | Rule (Abs mcat mcats _) _ <- gram, mc <- mcat:mcats ]
|
|
|
|
fcat mcat@(MCat (ECat scat ecns) mlbls)
|
|
= case elemIndex mcat mcats of
|
|
Just catid -> FCat catid scat mlbls ecns
|
|
Nothing -> error ("MCFGtoFCFG.fcat " ++ prt mcat)
|
|
|
|
fcnc (Cnc _ arglbls lins) = listArray (0, length lins-1) (map flin lins)
|
|
where flin (Lin _ syms) = listArray (0, length syms-1) (map fsym syms)
|
|
fsym (Tok tok) = FSymTok tok
|
|
fsym (Cat (cat,lbl,arg)) = FSymCat (fcat cat) (flbl arg lbl) arg
|
|
flbl arg lbl = case elemIndex lbl (arglbls !! arg) of
|
|
Just lblid -> lblid
|
|
Nothing -> error ("MCFGtoFCFG.flbl " ++ prt arg ++ " " ++ prt lbl)
|
|
|