diff options
| author | krasimir <krasimir@chalmers.se> | 2010-01-27 09:39:14 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2010-01-27 09:39:14 +0000 |
| commit | 890d45579300f39d50a5a18a9f6feed8634ae8ba (patch) | |
| tree | 056af80026eea5d67b68ef74f50ee5931566c822 /src/compiler/GF/Speech | |
| parent | b206aa3464bf8b766b61a31efb72d03c7dd3c1a9 (diff) | |
cleanup the code of the PGF interpreter and polish the binary serialization to match the preliminary specification
Diffstat (limited to 'src/compiler/GF/Speech')
| -rw-r--r-- | src/compiler/GF/Speech/GSL.hs | 3 | ||||
| -rw-r--r-- | src/compiler/GF/Speech/PGFToCFG.hs | 60 | ||||
| -rw-r--r-- | src/compiler/GF/Speech/SRG.hs | 10 | ||||
| -rw-r--r-- | src/compiler/GF/Speech/VoiceXML.hs | 5 |
4 files changed, 35 insertions, 43 deletions
diff --git a/src/compiler/GF/Speech/GSL.hs b/src/compiler/GF/Speech/GSL.hs index 8f26ea64c..f1cf02ab3 100644 --- a/src/compiler/GF/Speech/GSL.hs +++ b/src/compiler/GF/Speech/GSL.hs @@ -14,8 +14,7 @@ import GF.Speech.SRG import GF.Speech.RegExp import GF.Infra.Option import GF.Infra.Ident -import PGF.CId -import PGF.Data +import PGF import Data.Char (toUpper,toLower) import Data.List (partition) diff --git a/src/compiler/GF/Speech/PGFToCFG.hs b/src/compiler/GF/Speech/PGFToCFG.hs index 4332e21b8..6d6026284 100644 --- a/src/compiler/GF/Speech/PGFToCFG.hs +++ b/src/compiler/GF/Speech/PGFToCFG.hs @@ -10,7 +10,7 @@ import PGF.CId import PGF.Data as PGF import PGF.Macros import GF.Infra.Ident -import GF.Speech.CFG +import GF.Speech.CFG hiding (Symbol) import Data.Array.IArray as Array import Data.List @@ -32,36 +32,36 @@ type Profile = [Int] pgfToCFG :: PGF -> CId -- ^ Concrete syntax name -> CFG -pgfToCFG pgf lang = mkCFG (showCId (lookStartCat pgf)) extCats (startRules ++ concatMap fruleToCFRule rules) +pgfToCFG pgf lang = mkCFG (showCId (lookStartCat pgf)) extCats (startRules ++ concatMap ruleToCFRule rules) where cnc = lookConcr pgf lang - rules :: [(FCat,Production)] + rules :: [(FId,Production)] rules = [(fcat,prod) | (fcat,set) <- IntMap.toList (PGF.pproductions cnc) , prod <- Set.toList set] - fcatCats :: Map FCat Cat + fcatCats :: Map FId Cat fcatCats = Map.fromList [(fc, showCId c ++ "_" ++ show i) - | (c,(s,e,lbls)) <- Map.toList (startCats cnc), + | (c,CncCat s e lbls) <- Map.toList (cnccats cnc), (fc,i) <- zip (range (s,e)) [1..]] - fcatCat :: FCat -> Cat + fcatCat :: FId -> Cat fcatCat c = Map.findWithDefault ("Unknown_" ++ show c) c fcatCats - fcatToCat :: FCat -> FIndex -> Cat + fcatToCat :: FId -> LIndex -> Cat fcatToCat c l = fcatCat c ++ row where row = if catLinArity c == 1 then "" else "_" ++ show l -- gets the number of fields in the lincat for the given category - catLinArity :: FCat -> Int - catLinArity c = maximum (1:[rangeSize (bounds rhs) | (FFun _ rhs, _) <- topdownRules c]) + catLinArity :: FId -> Int + catLinArity c = maximum (1:[rangeSize (bounds rhs) | (CncFun _ rhs, _) <- topdownRules c]) topdownRules cat = f cat [] where f cat rules = maybe rules (Set.fold g rules) (IntMap.lookup cat (pproductions cnc)) - g (FApply funid args) rules = (functions cnc ! funid,args) : rules - g (FCoerce cat) rules = f cat rules + g (PApply funid args) rules = (cncfuns cnc ! funid,args) : rules + g (PCoerce cat) rules = f cat rules extCats :: Set Cat @@ -69,40 +69,40 @@ pgfToCFG pgf lang = mkCFG (showCId (lookStartCat pgf)) extCats (startRules ++ co startRules :: [CFRule] startRules = [CFRule (showCId c) [NonTerminal (fcatToCat fc r)] (CFRes 0) - | (c,(s,e,lbls)) <- Map.toList (startCats cnc), + | (c,CncCat s e lbls) <- Map.toList (cnccats cnc), fc <- range (s,e), not (isLiteralFCat fc), r <- [0..catLinArity fc-1]] - fruleToCFRule :: (FCat,Production) -> [CFRule] - fruleToCFRule (c,FApply funid args) = + ruleToCFRule :: (FId,Production) -> [CFRule] + ruleToCFRule (c,PApply funid args) = [CFRule (fcatToCat c l) (mkRhs row) (profilesToTerm [fixProfile row n | n <- [0..length args-1]]) | (l,seqid) <- Array.assocs rhs , let row = sequences cnc ! seqid , not (containsLiterals row)] where - FFun f rhs = functions cnc ! funid + CncFun f rhs = cncfuns cnc ! funid - mkRhs :: Array FPointPos FSymbol -> [CFSymbol] - mkRhs = concatMap fsymbolToSymbol . Array.elems + mkRhs :: Array DotPos Symbol -> [CFSymbol] + mkRhs = concatMap symbolToCFSymbol . Array.elems - containsLiterals :: Array FPointPos FSymbol -> Bool - containsLiterals row = any isLiteralFCat [args!!n | FSymCat n _ <- Array.elems row] || - not (null [n | FSymLit n _ <- Array.elems row]) -- only this is needed for PMCFG. - -- The first line is for backward compat. + containsLiterals :: Array DotPos Symbol -> Bool + containsLiterals row = any isLiteralFCat [args!!n | SymCat n _ <- Array.elems row] || + not (null [n | SymLit n _ <- Array.elems row]) -- only this is needed for PMCFG. + -- The first line is for backward compat. - fsymbolToSymbol :: FSymbol -> [CFSymbol] - fsymbolToSymbol (FSymCat n l) = [NonTerminal (fcatToCat (args!!n) l)] - fsymbolToSymbol (FSymLit n l) = [NonTerminal (fcatToCat (args!!n) l)] - fsymbolToSymbol (FSymKS ts) = map Terminal ts + symbolToCFSymbol :: Symbol -> [CFSymbol] + symbolToCFSymbol (SymCat n l) = [NonTerminal (fcatToCat (args!!n) l)] + symbolToCFSymbol (SymLit n l) = [NonTerminal (fcatToCat (args!!n) l)] + symbolToCFSymbol (SymKS ts) = map Terminal ts - fixProfile :: Array FPointPos FSymbol -> Int -> Profile + fixProfile :: Array DotPos Symbol -> Int -> Profile fixProfile row i = [k | (k,j) <- nts, j == i] where nts = zip [0..] [j | nt <- Array.elems row, j <- getPos nt] - getPos (FSymCat j _) = [j] - getPos (FSymLit j _) = [j] - getPos _ = [] + getPos (SymCat j _) = [j] + getPos (SymLit j _) = [j] + getPos _ = [] profilesToTerm :: [Profile] -> CFTerm profilesToTerm ps = CFObj f (zipWith profileToTerm argTypes ps) @@ -111,6 +111,6 @@ pgfToCFG pgf lang = mkCFG (showCId (lookStartCat pgf)) extCats (startRules ++ co profileToTerm :: CId -> Profile -> CFTerm profileToTerm t [] = CFMeta t profileToTerm _ xs = CFRes (last xs) -- FIXME: unify - fruleToCFRule (c,FCoerce c') = + ruleToCFRule (c,PCoerce c') = [CFRule (fcatToCat c l) [NonTerminal (fcatToCat c' l)] (CFRes 0) | l <- [0..catLinArity c-1]] diff --git a/src/compiler/GF/Speech/SRG.hs b/src/compiler/GF/Speech/SRG.hs index 2270ec7a1..8acd31aa9 100644 --- a/src/compiler/GF/Speech/SRG.hs +++ b/src/compiler/GF/Speech/SRG.hs @@ -13,7 +13,6 @@ module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol , ebnfPrinter , makeNonLeftRecursiveSRG , makeNonRecursiveSRG - , getSpeechLanguage , isExternalCat , lookupFM_ ) where @@ -29,9 +28,7 @@ import GF.Speech.FiniteState import GF.Speech.RegExp import GF.Speech.CFGToFA import GF.Infra.Option -import PGF.CId -import PGF.Data -import PGF.Macros +import PGF import Data.List import Data.Maybe (fromMaybe, maybeToList) @@ -116,7 +113,7 @@ mkSRG mkRules preprocess pgf cnc = SRG { srgName = showCId cnc, srgStartCat = cfgStartCat cfg, srgExternalCats = cfgExternalCats cfg, - srgLanguage = getSpeechLanguage pgf cnc, + srgLanguage = languageCode pgf cnc, srgRules = mkRules cfg } where cfg = renameCats (showCId cnc) $ preprocess $ pgfToCFG pgf cnc @@ -131,9 +128,6 @@ renameCats prefix cfg = mapCFGCats renameCat cfg names = Map.fromList [(c,pref++"_"++show i) | (pref,cs) <- catsByPrefix, (c,i) <- zip cs [1..]] badCat c = error ("GF.Speech.SRG.renameCats: " ++ c ++ "\n" ++ prCFG cfg) -getSpeechLanguage :: PGF -> CId -> Maybe String -getSpeechLanguage pgf cnc = fmap (replace '_' '-') $ lookConcrFlag pgf cnc (mkCId "language") - cfRulesToSRGRule :: [CFRule] -> SRGRule cfRulesToSRGRule rs@(r:_) = SRGRule (lhsCat r) rhs where diff --git a/src/compiler/GF/Speech/VoiceXML.hs b/src/compiler/GF/Speech/VoiceXML.hs index d3939931e..d638e30a8 100644 --- a/src/compiler/GF/Speech/VoiceXML.hs +++ b/src/compiler/GF/Speech/VoiceXML.hs @@ -12,8 +12,7 @@ import GF.Data.Utilities import GF.Data.XML import GF.Infra.Ident import GF.Infra.Modules -import GF.Speech.SRG (getSpeechLanguage) -import PGF.CId +import PGF import PGF.Data import PGF.Macros @@ -30,7 +29,7 @@ grammar2vxml pgf cnc = showsXMLDoc (skel2vxml name language start skel qs) "" where skel = pgfSkeleton pgf name = showCId cnc qs = catQuestions pgf cnc (map fst skel) - language = getSpeechLanguage pgf cnc + language = languageCode pgf cnc start = lookStartCat pgf -- |
