Look at both command-line and grammar startcat falgs in pg commands.

This commit is contained in:
bringert
2006-04-18 12:42:20 +00:00
parent 3e805a3531
commit 4d3dc4ac54
8 changed files with 58 additions and 36 deletions

View File

@@ -43,8 +43,11 @@ import qualified GF.OldParsing.ConvertGrammar as CnvOld -- OBSOLETE
import qualified GF.Conversion.GFC as Cnv import qualified GF.Conversion.GFC as Cnv
import qualified GF.Parsing.GFC as Prs import qualified GF.Parsing.GFC as Prs
import Control.Monad (mplus)
import Data.List (nub,nubBy) import Data.List (nub,nubBy)
import qualified Data.Map as Map import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
-- AR 11/11/2001 -- 17/6/2003 (for modules) ---- unfinished -- AR 11/11/2001 -- 17/6/2003 (for modules) ---- unfinished
@@ -458,13 +461,20 @@ firstCatOpts opts sgr =
firstAbsCat :: Options -> StateGrammar -> G.QIdent firstAbsCat :: Options -> StateGrammar -> G.QIdent
firstAbsCat opts = cfCat2Cat . firstCatOpts opts firstAbsCat opts = cfCat2Cat . firstCatOpts opts
-- | Gets the start category for the grammar from the options.
-- If the startcat is not set in the options, we look
-- for a flag in the grammar. If there is no flag in the
-- grammar, S is returned.
startCatStateOpts :: Options -> StateGrammar -> CFCat
startCatStateOpts opts sgr =
string2CFCat a (fromMaybe "S" (optsStartCat `mplus` grStartCat))
where optsStartCat = getOptVal opts gStartCat
grStartCat = getOptVal (stateOptions sgr) gStartCat
a = P.prt (absId sgr)
-- | a grammar can have start category as option startcat=foo ; default is S -- | a grammar can have start category as option startcat=foo ; default is S
stateFirstCat :: StateGrammar -> CFCat stateFirstCat :: StateGrammar -> CFCat
stateFirstCat sgr = stateFirstCat = startCatStateOpts noOptions
maybe (string2CFCat a "S") (string2CFCat a) $
getOptVal (stateOptions sgr) gStartCat
where
a = P.prt (absId sgr)
stateIsWord :: StateGrammar -> String -> Bool stateIsWord :: StateGrammar -> String -> Bool
stateIsWord sg = isKnownWord (stateMorpho sg) stateIsWord sg = isKnownWord (stateMorpho sg)

View File

@@ -21,10 +21,9 @@ import GF.Data.XML
import Data.List (isPrefixOf, find, intersperse) import Data.List (isPrefixOf, find, intersperse)
-- | the main function -- | the main function
grammar2vxml :: GFC.CanonGrammar -> String grammar2vxml :: String -> GFC.CanonGrammar -> String
grammar2vxml gr = showsXMLDoc (skel2vxml name startcat gr') "" grammar2vxml startcat gr = showsXMLDoc (skel2vxml name startcat gr') ""
where (name, gr') = vSkeleton gr where (name, gr') = vSkeleton gr
startcat = "Order" -- FIXME
type VIdent = String type VIdent = String
@@ -109,7 +108,7 @@ cat2form :: String -> VIdent -> [(VIdent, [VIdent])] -> XML
cat2form gr cat fs = cat2form gr cat fs =
form cat [var "value" (Just "'?'"), formDebug cat, form cat [var "value" (Just "'?'"), formDebug cat,
block [if_ "value != '?'" [assign cat "value"]], block [if_ "value != '?'" [assign cat "value"]],
field cat [] [promptString ("quest_"++cat), field cat [] [promptString (catQuestion cat),
grammar (gr++"#"++cat), grammar (gr++"#"++cat),
nomatch [Data "I didn't understand you.", reprompt], nomatch [Data "I didn't understand you.", reprompt],
help [Data ("help_"++cat)], help [Data ("help_"++cat)],
@@ -120,6 +119,10 @@ cat2form gr cat fs =
where subDone = [assign cat "sub.value", return_ [cat]] where subDone = [assign cat "sub.value", return_ [cat]]
feedback = [] feedback = []
catQuestion :: VIdent -> String
catQuestion cat = questFun
where questFun = "quest_"++cat
fun2form :: String -> VIdent -> [VIdent] -> XML fun2form :: String -> VIdent -> [VIdent] -> XML
fun2form gr fun args = fun2form gr fun args =
form fun ([var "value" Nothing] ++ [formDebug fun] form fun ([var "value" Nothing] ++ [formDebug fun]

View File

@@ -31,9 +31,10 @@ import GF.Probabilistic.Probabilistic (Probs)
import Data.Char (toUpper,toLower) import Data.Char (toUpper,toLower)
gslPrinter :: Ident -- ^ Grammar name gslPrinter :: Ident -- ^ Grammar name
-> String -- ^ Start category
-> Options -> Maybe Probs -> CGrammar -> String -> Options -> Maybe Probs -> CGrammar -> String
gslPrinter name opts probs cfg = prGSL srg "" gslPrinter name start opts probs cfg = prGSL srg ""
where srg = topDownFilter $ makeSimpleSRG name opts probs $ rmPunctCFG cfg where srg = topDownFilter $ makeSimpleSRG name start opts probs $ rmPunctCFG cfg
prGSL :: SRG -> ShowS prGSL :: SRG -> ShowS
prGSL (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs}) prGSL (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs})

View File

@@ -30,9 +30,10 @@ import GF.Probabilistic.Probabilistic (Probs)
import GF.Speech.SRG import GF.Speech.SRG
jsgfPrinter :: Ident -- ^ Grammar name jsgfPrinter :: Ident -- ^ Grammar name
-> Options -> Maybe Probs -> CGrammar -> String -> String -- ^ Start category
jsgfPrinter name opts probs cfg = prJSGF srg "" -> Options -> Maybe Probs -> CGrammar -> String
where srg = makeSimpleSRG name opts probs cfg jsgfPrinter name start opts probs cfg = prJSGF srg ""
where srg = makeSimpleSRG name start opts probs cfg
prJSGF :: SRG -> ShowS prJSGF :: SRG -> ShowS
prJSGF (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs}) prJSGF (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs})

View File

@@ -36,12 +36,13 @@ import qualified Data.Map as Map
import qualified Data.Set as Set import qualified Data.Set as Set
srgsXmlPrinter :: Ident -- ^ Grammar name srgsXmlPrinter :: Ident -- ^ Grammar name
-> String -- ^ Start category
-> Options -> Options
-> Bool -- ^ Whether to include semantic interpretation -> Bool -- ^ Whether to include semantic interpretation
-> Maybe Probs -> Maybe Probs
-> CGrammar -> String -> CGrammar -> String
srgsXmlPrinter name opts sisr probs cfg = prSrgsXml sisr srg "" srgsXmlPrinter name start opts sisr probs cfg = prSrgsXml sisr srg ""
where srg = makeSRG name opts probs cfg where srg = makeSRG name start opts probs cfg
prSrgsXml :: Bool -> SRG -> ShowS prSrgsXml :: Bool -> SRG -> ShowS
prSrgsXml sisr (SRG{grammarName=name,startCat=start, prSrgsXml sisr (SRG{grammarName=name,startCat=start,

View File

@@ -69,6 +69,7 @@ type CatNames = Map String String
-- FIXME: the probabilities, names and profiles in the returned -- FIXME: the probabilities, names and profiles in the returned
-- grammar may be meaningless. -- grammar may be meaningless.
makeSimpleSRG :: Ident -- ^ Grammar name makeSimpleSRG :: Ident -- ^ Grammar name
-> String -- ^ Start category
-> Options -- ^ Grammar options -> Options -- ^ Grammar options
-> Maybe Probs -- ^ Probabilities -> Maybe Probs -- ^ Probabilities
-> CGrammar -- ^ A context-free grammar -> CGrammar -- ^ A context-free grammar
@@ -79,6 +80,7 @@ makeSimpleSRG
-- | Create a SRG preserving the names, profiles and probabilities of the -- | Create a SRG preserving the names, profiles and probabilities of the
-- input grammar. The returned grammar may be left-recursive. -- input grammar. The returned grammar may be left-recursive.
makeSRG :: Ident -- ^ Grammar name makeSRG :: Ident -- ^ Grammar name
-> String -- ^ Start category
-> Options -- ^ Grammar options -> Options -- ^ Grammar options
-> Maybe Probs -- ^ Probabilities -> Maybe Probs -- ^ Probabilities
-> CGrammar -- ^ A context-free grammar -> CGrammar -- ^ A context-free grammar
@@ -88,11 +90,12 @@ makeSRG = makeSRG_ removeEmptyCats
makeSRG_ :: (CFRules -> CFRules) -- ^ Transformations to apply to the makeSRG_ :: (CFRules -> CFRules) -- ^ Transformations to apply to the
-- CFG before converting to SRG -- CFG before converting to SRG
-> Ident -- ^ Grammar name -> Ident -- ^ Grammar name
-> String -- ^ Start category
-> Options -- ^ Grammar options -> Options -- ^ Grammar options
-> Maybe Probs -- ^ Probabilities -> Maybe Probs -- ^ Probabilities
-> CGrammar -- ^ A context-free grammar -> CGrammar -- ^ A context-free grammar
-> SRG -> SRG
makeSRG_ f i opts probs gr makeSRG_ f i origStart opts probs gr
= SRG { grammarName = name, = SRG { grammarName = name,
startCat = lookupFM_ names origStart, startCat = lookupFM_ names origStart,
origStartCat = origStart, origStartCat = origStart,
@@ -100,7 +103,6 @@ makeSRG_ f i opts probs gr
rules = rs } rules = rs }
where where
name = prIdent i name = prIdent i
origStart = getStartCat opts
l = fromMaybe "en_UK" (getOptVal opts speechLanguage) l = fromMaybe "en_UK" (getOptVal opts speechLanguage)
gr' = f (cfgToCFRules gr) gr' = f (cfgToCFRules gr)
(cats,cfgRules) = unzip gr' (cats,cfgRules) = unzip gr'

View File

@@ -19,7 +19,7 @@
-- FIXME: lots of this stuff is used by CFGToFiniteState, thus -- FIXME: lots of this stuff is used by CFGToFiniteState, thus
-- the missing explicit expot list. -- the missing explicit expot list.
module GF.Speech.TransformCFG {- (CFRule_, CFRules, module GF.Speech.TransformCFG {- (CFRule_, CFRules,
cfgToCFRules, getStartCat, cfgToCFRules,
removeLeftRecursion, removeLeftRecursion,
removeEmptyCats, removeIdenticalRules) -} where removeEmptyCats, removeIdenticalRules) -} where
@@ -56,9 +56,6 @@ cfgToCFRules cfg = groupProds [CFRule (catToString c) (map symb r) n | CFRule c
-- symb (Tok t) = Tok t -- symb (Tok t) = Tok t
catToString = prt catToString = prt
getStartCat :: Options -> String
getStartCat opts = fromMaybe "S" (getOptVal opts gStartCat) ++ "{}.s"
-- | Group productions by their lhs categories -- | Group productions by their lhs categories
groupProds :: [CFRule_] -> CFRules groupProds :: [CFRule_] -> CFRules
groupProds = Map.toList . Map.fromListWith (++) . map (\r -> (lhsCat r,[r])) groupProds = Map.toList . Map.fromListWith (++) . map (\r -> (lhsCat r,[r]))

View File

@@ -244,35 +244,41 @@ customGrammarPrinter =
,(strCI "old", \_ -> printGrammarOld . stateGrammarST) ,(strCI "old", \_ -> printGrammarOld . stateGrammarST)
,(strCI "srg", \_ -> prSRG . stateCF) ,(strCI "srg", \_ -> prSRG . stateCF)
,(strCI "gsl", \opts s -> let name = cncId s ,(strCI "gsl", \opts s -> let name = cncId s
in gslPrinter name opts Nothing $ stateCFG s) start = getStartCatCF opts s
in gslPrinter name start opts Nothing $ stateCFG s)
,(strCI "jsgf", \opts s -> let name = cncId s ,(strCI "jsgf", \opts s -> let name = cncId s
in jsgfPrinter name opts Nothing $ stateCFG s) start = getStartCatCF opts s
in jsgfPrinter name start opts Nothing $ stateCFG s)
,(strCI "srgs_xml", \opts s -> let name = cncId s ,(strCI "srgs_xml", \opts s -> let name = cncId s
in srgsXmlPrinter name opts False Nothing $ stateCFG s) start = getStartCatCF opts s
in srgsXmlPrinter name start opts False Nothing $ stateCFG s)
,(strCI "srgs_xml_prob", ,(strCI "srgs_xml_prob",
\opts s -> let name = cncId s \opts s -> let name = cncId s
probs = stateProbs s probs = stateProbs s
in srgsXmlPrinter name opts False (Just probs) $ stateCFG s) start = getStartCatCF opts s
in srgsXmlPrinter name start opts False (Just probs) $ stateCFG s)
,(strCI "srgs_xml_ms_sem", ,(strCI "srgs_xml_ms_sem",
\opts s -> let name = cncId s \opts s -> let name = cncId s
in srgsXmlPrinter name opts True Nothing $ stateCFG s) start = getStartCatCF opts s
,(strCI "vxml", \_ -> grammar2vxml . stateGrammarST) in srgsXmlPrinter name start opts True Nothing $ stateCFG s)
,(strCI "slf", \opts s -> let start = getStartCat opts ,(strCI "vxml", \opts s -> let start = getStartCat opts s
in grammar2vxml start (stateGrammarST s))
,(strCI "slf", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in slfPrinter name start $ stateCFG s) in slfPrinter name start $ stateCFG s)
,(strCI "slf_graphviz", \opts s -> let start = getStartCat opts ,(strCI "slf_graphviz", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in slfGraphvizPrinter name start $ stateCFG s) in slfGraphvizPrinter name start $ stateCFG s)
,(strCI "slf_sub", \opts s -> let start = getStartCat opts ,(strCI "slf_sub", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in slfSubPrinter name start $ stateCFG s) in slfSubPrinter name start $ stateCFG s)
,(strCI "slf_sub_graphviz", \opts s -> let start = getStartCat opts ,(strCI "slf_sub_graphviz", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in slfSubGraphvizPrinter name start $ stateCFG s) in slfSubGraphvizPrinter name start $ stateCFG s)
,(strCI "fa_graphviz", \opts s -> let start = getStartCat opts ,(strCI "fa_graphviz", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in faGraphvizPrinter name start $ stateCFG s) in faGraphvizPrinter name start $ stateCFG s)
,(strCI "fa_c", \opts s -> let start = getStartCat opts ,(strCI "fa_c", \opts s -> let start = getStartCatCF opts s
name = cncId s name = cncId s
in faCPrinter name start $ stateCFG s) in faCPrinter name start $ stateCFG s)
,(strCI "regular", \_ -> regularPrinter . stateCFG) ,(strCI "regular", \_ -> regularPrinter . stateCFG)
@@ -325,8 +331,9 @@ customGrammarPrinter =
-- ,(strCI "cfg-old", PrtOld.prt . CnvOld.cfg . statePInfoOld) -- ,(strCI "cfg-old", PrtOld.prt . CnvOld.cfg . statePInfoOld)
] ]
where stateGrammarLangOpts s = (stateOptions s, stateGrammarLang s) where stateGrammarLangOpts s = (stateOptions s, stateGrammarLang s)
getStartCat :: Options -> String getStartCat,getStartCatCF :: Options -> StateGrammar -> String
getStartCat opts = fromMaybe "S" (getOptVal opts gStartCat) ++ "{}.s" getStartCat opts sgr = prCFCat (startCatStateOpts opts sgr)
getStartCatCF opts sgr = getStartCat opts sgr ++ "{}.s"
customMultiGrammarPrinter = customMultiGrammarPrinter =
customData "Printers for multiple grammars, selected by option -printer=x" $ customData "Printers for multiple grammars, selected by option -printer=x" $