summaryrefslogtreecommitdiff
path: root/src/GF/Speech/PrSRGS.hs
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2006-02-01 16:23:14 +0000
committerbringert <bringert@cs.chalmers.se>2006-02-01 16:23:14 +0000
commitfd0dfd7d4d9885b8b4cac7bd60308e2890a05caa (patch)
tree73613f4cc00fac0d683220bcc4258bdb99179914 /src/GF/Speech/PrSRGS.hs
parent992e212bccec9f30ee7b4f5e764b0bd793ccc651 (diff)
First version of SRGS with semantic tags.
Diffstat (limited to 'src/GF/Speech/PrSRGS.hs')
-rw-r--r--src/GF/Speech/PrSRGS.hs80
1 files changed, 57 insertions, 23 deletions
diff --git a/src/GF/Speech/PrSRGS.hs b/src/GF/Speech/PrSRGS.hs
index 63775c852..81d5fd236 100644
--- a/src/GF/Speech/PrSRGS.hs
+++ b/src/GF/Speech/PrSRGS.hs
@@ -22,7 +22,7 @@ import GF.Speech.SRG
import GF.Infra.Ident
import GF.Formalism.CFG
-import GF.Formalism.Utilities (Symbol(..))
+import GF.Formalism.Utilities (Symbol(..), NameProfile(..), Profile(..), forestName)
import GF.Conversion.Types
import GF.Infra.Print
import GF.Infra.Option
@@ -37,43 +37,74 @@ type Attr = (String,String)
srgsXmlPrinter :: Ident -- ^ Grammar name
-> Options
+ -> Bool -- ^ Whether to include semantic interpretation
-> Maybe Probs
-> CGrammar -> String
-srgsXmlPrinter name opts probs cfg = prSrgsXml srg ""
+srgsXmlPrinter name opts sisr probs cfg = prSrgsXml sisr srg ""
where srg = makeSRG name opts probs cfg
-prSrgsXml :: SRG -> ShowS
-prSrgsXml (SRG{grammarName=name,startCat=start,
+prSrgsXml :: Bool -> SRG -> ShowS
+prSrgsXml sisr (SRG{grammarName=name,startCat=start,
origStartCat=origStart,grammarLanguage=l,rules=rs})
= header . showsXML xmlGr
where
header = showString "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
root = prCat start
- xmlGr = grammar root l (comments
- ["SRGS XML speech recognition grammar for " ++ name,
- "Generated by GF",
- "Original start category: " ++ origStart]
+ xmlGr = grammar root l ([meta "description"
+ ("SRGS XML speech recognition grammar for " ++ name
+ ++ ". " ++ "Original start category: " ++ origStart),
+ meta "generator" "GF"]
++ map ruleToXML rs)
ruleToXML (SRGRule cat origCat alts) =
rule (prCat cat) (comments ["Category " ++ origCat] ++ [prRhs alts])
prRhs rhss = oneOf (map prAlt rhss)
- prAlt (SRGAlt p rhs) = item p (map prSymbol rhs)
- prSymbol (Cat c) = Tag "ruleref" [("uri","#" ++ prCat c)] []
- prSymbol (Tok t) = item Nothing [Data (showToken t)]
- prCat c = c -- FIXME: escape something?
- showToken t = t -- FIXME: escape something?
-
-rule :: String -- ^ id
- -> [XML] -> XML
+ prAlt (SRGAlt p n@(Name _ pr) rhs)
+ | sisr = prodItem (Just n) p (map (uncurry (symItem pr)) (numberCats 0 rhs))
+ | otherwise = prodItem Nothing p (map (\s -> symItem [] s 0) rhs)
+ numberCats _ [] = []
+ numberCats n (s@(Cat _):ss) = (s,n):numberCats (n+1) ss
+ numberCats n (s:ss) = (s,n):numberCats n ss
+
+rule :: String -> [XML] -> XML
rule i = Tag "rule" [("id",i)]
-item :: Maybe Double -> [XML] -> XML
--- FIXME: what is the weight called?
-item mp xs = Tag "item" as cs
- where as = maybe [] (\p -> [("weight", show p)]) mp
- cs = case xs of
- [Tag "item" [] xs'] -> xs'
- _ -> xs
+prodItem :: Maybe Name -> Maybe Double -> [XML] -> XML
+prodItem n mp xs = Tag "item" w (t++cs)
+ where
+ w = maybe [] (\p -> [("weight", show p)]) mp
+ t = maybe [] prodTag n
+ cs = case xs of
+ [Tag "item" [] xs'] -> xs'
+ _ -> xs
+
+prodTag :: Name -> [XML]
+prodTag (Name f prs) = [Tag "tag" [] [Data (join "; " ts)]]
+ where
+ ts = ["$.name=" ++ showFun f] ++
+ ["$.arg" ++ show n ++ "=" ++ argInit (prs!!n)
+ | n <- [0..length prs-1]]
+ argInit (Unify _) = metavar
+ argInit (Constant f) = maybe metavar showFun (forestName f)
+ showFun = show . prIdent
+ metavar = show "?"
+
+symItem :: [Profile a] -> Symbol String Token -> Int -> XML
+symItem prs (Cat c) x = Tag "item" [] ([Tag "ruleref" [("uri","#" ++ prCat c)] []]++t)
+ where
+ t = if null ts then [] else [Tag "tag" [] [Data (join "; " ts)]]
+ ts = ["$.arg" ++ show n ++ "=$$"
+ | n <- [0..length prs-1], inProfile x (prs!!n)]
+symItem _ (Tok t) _ = Tag "item" [] [Data (showToken t)]
+
+inProfile :: Int -> Profile a -> Bool
+inProfile x (Unify xs) = x `elem` xs
+inProfile _ (Constant _) = False
+
+prCat :: String -> String
+prCat c = c -- FIXME: escape something?
+
+showToken :: Token -> String
+showToken t = t -- FIXME: escape something?
oneOf :: [XML] -> XML
oneOf [x] = x
@@ -88,6 +119,9 @@ grammar root l = Tag "grammar" [("xml:lang", l),
("mode","voice"),
("root",root)]
+meta :: String -> String -> XML
+meta n c = Tag "meta" [("name",n),("content",c)] []
+
comments :: [String] -> [XML]
comments = map Comment