diff options
| author | bringert <bringert@cs.chalmers.se> | 2006-12-17 13:17:17 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2006-12-17 13:17:17 +0000 |
| commit | 44af93a9c92f1437a59db3e18d8c154fe543bc1a (patch) | |
| tree | ee48687d8b5c7bb56fac44d4a1f0756653bfcb8d /src/GF/Speech/PrJSGF.hs | |
| parent | bd4dbfb26beb06424e00227087603bfca563dda3 (diff) | |
Many fixes to JSGF format (never tested before). Implemented JSGF+SISR. Left recursion removal destroys SISR, must be fixed.
Diffstat (limited to 'src/GF/Speech/PrJSGF.hs')
| -rw-r--r-- | src/GF/Speech/PrJSGF.hs | 86 |
1 files changed, 57 insertions, 29 deletions
diff --git a/src/GF/Speech/PrJSGF.hs b/src/GF/Speech/PrJSGF.hs index f09d454d9..26421d36c 100644 --- a/src/GF/Speech/PrJSGF.hs +++ b/src/GF/Speech/PrJSGF.hs @@ -22,57 +22,85 @@ module GF.Speech.PrJSGF (jsgfPrinter) where import GF.Conversion.Types import GF.Data.Utilities import GF.Formalism.CFG -import GF.Formalism.Utilities (Symbol(..)) +import GF.Formalism.Utilities (Symbol(..), NameProfile(..), Profile(..)) import GF.Infra.Ident import GF.Infra.Print import GF.Infra.Option import GF.Probabilistic.Probabilistic (Probs) +import GF.Speech.SISR import GF.Speech.SRG import GF.Speech.RegExp +import Debug.Trace + jsgfPrinter :: Ident -- ^ Grammar name -> String -- ^ Start category - -> Options -> Maybe Probs -> CGrammar -> String -jsgfPrinter name start opts probs cfg = prJSGF srg "" + -> Options + -> Maybe SISRFormat + -> Maybe Probs -> CGrammar -> String +jsgfPrinter name start opts sisr probs cfg = trace (show srg) $ prJSGF srg sisr "" where srg = makeSimpleSRG name start opts probs cfg -prJSGF :: SRG -> ShowS -prJSGF (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs}) - = header . mainCat . unlinesS (map prRule rs) +prJSGF :: SRG -> Maybe SISRFormat -> ShowS +prJSGF (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs}) sisr + = header . nl + . mainCat . nl + . unlinesS topCatRules . nl + . unlinesS (map prRule rs) where header = showString "#JSGF V1.0 UTF-8;" . nl - . comments ["JSGF speech recognition grammar for " ++ name, - "Generated by GF"] . nl + . comment ("JSGF speech recognition grammar for " ++ name) + . comment "Generated by GF" . showString ("grammar " ++ name ++ ";") . nl - . nl - mainCat = comments ["Start category: " ++ origStart] . nl - . showString "public <MAIN> = " . prCat start . showChar ';' . nl . nl + mainCat = comment ("Start category: " ++ origStart) + . rule True "MAIN" [prCat start] prRule (SRGRule cat origCat rhs) = - comments [origCat] . nl - . prCat cat . showString " = " . joinS " | " (map prAlt (ebnfSRGAlts rhs)) . nl + comment origCat + . rule False cat (map prAlt (ebnfSRGAlts rhs)) -- FIXME: use the probability - prAlt (EBnfSRGAlt mp _ rhs) = prItem rhs + prAlt (EBnfSRGAlt mp n rhs) = tag sisr (profileInitSISR n) . showChar ' '. prItem sisr rhs + + topCatRules = [rule True (catFormId tc) (map (it tc) cs) | (tc,cs) <- topCats] + where topCats = buildMultiMap [(cfgCatToGFCat origCat, cat) | SRGRule cat origCat _ <- rs] + it i c = prCat c . tag sisr [(EThis :. catFieldId i) := (ERef c)] + +catFormId :: String -> String +catFormId = (++ "_cat") + +catFieldId :: String -> String +catFieldId = (++ "_field") prCat :: SRGCat -> ShowS prCat c = showChar '<' . showString c . showChar '>' -prItem :: EBnfSRGItem -> ShowS -prItem = f +prItem :: Maybe SISRFormat -> EBnfSRGItem -> ShowS +prItem sisr = f 1 where - f (REUnion []) = showString "<VOID>" - f (REUnion xs) = wrap "(" (joinS " | " (map f xs)) ")" - f (REConcat []) = showString "<NULL>" - f (REConcat xs) = wrap "(" (unwordsS (map f xs)) ")" - f (RERepeat x) = wrap "(" (f x) ")" . showString "*" - f (RESymbol s) = prSymbol s - -prSymbol :: Symbol SRGNT Token -> ShowS -prSymbol (Cat (c,_)) = prCat c -prSymbol (Tok t) | all isPunct (prt t) = id -- removes punctuation - | otherwise = wrap "\"" (prtS t) "\"" + f _ (REUnion []) = showString "<VOID>" + f p (REUnion xs) = (if p >= 1 then paren else id) (joinS " | " (map (f 1) xs)) + f _ (REConcat []) = showString "<NULL>" + f p (REConcat xs) = (if p >= 3 then paren else id) (unwordsS (map (f 2) xs)) + f p (RERepeat x) = f 3 x . showString "*" + f _ (RESymbol s) = prSymbol sisr s + +prSymbol :: Maybe SISRFormat -> Symbol SRGNT Token -> ShowS +prSymbol sisr (Cat n@(c,_)) = prCat c . tag sisr (catSISR n) +prSymbol _ (Tok t) | all isPunct (prt t) = id -- removes punctuation + | otherwise = prtS t -- FIXME: quote if there is whitespace or odd chars + +tag :: Maybe SISRFormat -> [SISRExpr] -> ShowS +tag Nothing _ = id +tag _ [] = id +tag (Just fmt) t = showString "{" . showString (prSISR fmt t) . showString "}" isPunct :: Char -> Bool isPunct c = c `elem` "-_.;.,?!" -comments :: [String] -> ShowS -comments = unlinesS . map (showString . ("// " ++)) +comment :: String -> ShowS +comment s = showString "// " . showString s . nl + +paren f = wrap "(" f ")" + +rule :: Bool -> SRGCat -> [ShowS] -> ShowS +rule pub c xs = p . prCat c . showString " = " . joinS " | " xs . showChar ';' . nl + where p = if pub then showString "public " else id
\ No newline at end of file |
