/** * Commit changes to all loaded grammars and all changes of grammar since * the last commitChange * * @throws JSGFGrammarParseException * @throws JSGFGrammarException */ public virtual void CommitChanges() { try { if (LoadGrammar) { if (Manager == null) { GetGrammarManager(); } _ruleGrammar = LoadNamedGrammar(GrammarName); LoadImports(_ruleGrammar); LoadGrammar = false; } Manager.LinkGrammars(); RuleStack = new RuleStack(); NewGrammar(); FirstNode = CreateGrammarNode("<sil>"); GrammarNode finalNode = CreateGrammarNode("<sil>"); finalNode.SetFinalNode(true); // go through each rule and create a network of GrammarNodes // for each of them foreach (String ruleName in _ruleGrammar.GetRuleNames()) { if (_ruleGrammar.IsRulePublic(ruleName)) { String fullName = GetFullRuleName(ruleName); GrammarGraph publicRuleGraph = new GrammarGraph(this); RuleStack.Push(fullName, publicRuleGraph); JSGFRule rule = _ruleGrammar.GetRule(ruleName); GrammarGraph graph = ProcessRule(rule); RuleStack.Pop(); FirstNode.Add(publicRuleGraph.StartNode, 0.0f); publicRuleGraph.EndNode.Add(finalNode, 0.0f); publicRuleGraph.StartNode.Add(graph.StartNode, 0.0f); graph.EndNode.Add(publicRuleGraph.EndNode, 0.0f); } } PostProcessGrammar(); if (Logger.Level == LogLevel.All) { DumpGrammar(); } } catch (UriFormatException mue) { throw new IOException("bad base grammar URL " + BaseUrl + ' ' + mue); } }
/** * Load grammars imported by a fully qualified Rule Token if they are not * already loaded. * * @param grammar * @throws IOException * @throws GrammarException * @throws JSGFGrammarParseException */ private void LoadFullQualifiedRules(JSGFRuleGrammar grammar) { // Go through every rule foreach (String ruleName in grammar.GetRuleNames()) { String rule = grammar.GetRule(ruleName).ToString(); // check for rule-Tokens int index = 0; while (index < rule.Length) { index = rule.IndexOf('<', index); if (index < 0) { break; } // Extract rule name var endIndex = rule.IndexOf('>', index + 1); JSGFRuleName extractedRuleName = new JSGFRuleName(rule .Substring(index + 1, endIndex - (index + 1)) .Trim()); index = endIndex + 1; // Check for full qualified rule name if (extractedRuleName.GetFullGrammarName() != null) { String grammarName = extractedRuleName.GetFullGrammarName(); JSGFRuleGrammar importedGrammar = GetNamedRuleGrammar(grammarName); if (importedGrammar == null) { importedGrammar = LoadNamedGrammar(grammarName); } if (importedGrammar != null) { LoadImports(importedGrammar); } } } } }