Exemple #1
0
        /**
         * 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);
                        }
                    }
                }
            }
        }