public virtual void removeImport(JSGFRuleName importName)
 {
     if (this.__imports.contains(importName))
     {
         this.__imports.remove(importName);
     }
 }
        public virtual void resolveAllRules()
        {
            StringBuilder stringBuilder = new StringBuilder();
            Iterator      iterator      = this.__imports.iterator();

            while (iterator.hasNext())
            {
                JSGFRuleName jsgfruleName    = (JSGFRuleName)iterator.next();
                string       fullGrammarName = jsgfruleName.getFullGrammarName();
                if (this.manager.retrieveGrammar(fullGrammarName) == null)
                {
                    stringBuilder.append("Undefined grammar ").append(fullGrammarName).append(" imported in ").append(this.name).append('\n');
                }
            }
            if (stringBuilder.length() > 0)
            {
                string message = stringBuilder.toString();

                throw new JSGFGrammarException(message);
            }
            iterator = this.__rules.values().iterator();
            while (iterator.hasNext())
            {
                JSGFRuleGrammar.JSGFRuleState jsgfruleState = (JSGFRuleGrammar.JSGFRuleState)iterator.next();
                this.resolveRule(jsgfruleState.rule);
            }
        }
Exemple #3
0
        private void loadFullQualifiedRules(JSGFRuleGrammar jsgfruleGrammar)
        {
            Iterator iterator = jsgfruleGrammar.getRuleNames().iterator();

            while (iterator.hasNext())
            {
                string ruleName = (string)iterator.next();
                string text     = jsgfruleGrammar.getRule(ruleName).toString();
                int    i        = 0;
                while (i < String.instancehelper_length(text))
                {
                    i = String.instancehelper_indexOf(text, 60, i);
                    if (i < 0)
                    {
                        break;
                    }
                    JSGFRuleName jsgfruleName = new JSGFRuleName(String.instancehelper_trim(String.instancehelper_substring(text, i + 1, String.instancehelper_indexOf(text, 62, i + 1))));
                    i = String.instancehelper_indexOf(text, 62, i) + 1;
                    if (jsgfruleName.getFullGrammarName() != null)
                    {
                        string          fullGrammarName  = jsgfruleName.getFullGrammarName();
                        JSGFRuleGrammar jsgfruleGrammar2 = this.getNamedRuleGrammar(fullGrammarName);
                        if (jsgfruleGrammar2 == null)
                        {
                            jsgfruleGrammar2 = this.loadNamedGrammar(fullGrammarName);
                        }
                        if (jsgfruleGrammar2 != null)
                        {
                            this.loadImports(jsgfruleGrammar2);
                        }
                    }
                }
            }
        }
 public virtual void addImport(JSGFRuleName importName)
 {
     if (!this.__imports.contains(importName))
     {
         this.__imports.add(importName);
     }
 }
Exemple #5
0
        public JSGFRuleName ImportRef()
        {
            String s;
            bool   all = false;

            jj_consume_token(28);
            s = Name();
            switch ((_jj_ntk == -1) ? jj_ntk() : _jj_ntk)
            {
            case 29:
                jj_consume_token(29);
                jj_consume_token(30);
                all = true;
                break;

            default:
                jj_la1[25] = jj_gen;
                break;
            }
            jj_consume_token(31);
            if (all)
            {
                s = s + ".*";
            }
            JSGFRuleName rn = new JSGFRuleName(s);
            { if (true)
              {
                  return(rn);
              }
            }
        }
 /**
  * Import all rules or a specified rule from another grammar.
  *
  * @param importName
  *            the name of the rule(s) to import.
  */
 public void AddImport(JSGFRuleName importName)
 {
     if (!Imports.Contains(importName))
     {
         Imports.Add(importName);
     }
 }
 /**
  * Remove an import.
  *
  * @param importName
  *            the name of the rule(s) to remove.
  */
 public void RemoveImport(JSGFRuleName importName)
 {
     if (Imports.Contains(importName))
     {
         Imports.Remove(importName);
     }
 }
Exemple #8
0
        /**
         * Parses the given RuleName into a network of GrammarNodes.
         *
         * @param initialRuleName
         *            the RuleName rule to parse
         * @return a grammar graph
         */
        private GrammarGraph ProcessRuleName(JSGFRuleName initialRuleName)
        {
            this.LogInfo("parseRuleName: " + initialRuleName);
            GrammarGraph result = RuleStack.Contains(initialRuleName.GetRuleName());

            if (result != null)
            { // its a recursive call
                return(result);
            }
            else
            {
                result = new GrammarGraph(this);
                RuleStack.Push(initialRuleName.GetRuleName(), result);
            }
            JSGFRuleName ruleName = _ruleGrammar.Resolve(initialRuleName);

            if (ruleName == JSGFRuleName.Null)
            {
                result.StartNode.Add(result.EndNode, 0.0f);
            }
            else if (ruleName == JSGFRuleName.Void)
            {
                // no connection for void
            }
            else
            {
                if (ruleName == null)
                {
                    throw new JSGFGrammarException("Can't resolve "
                                                   + initialRuleName + " g "
                                                   + initialRuleName.GetFullGrammarName());
                }
                JSGFRuleGrammar rg = Manager.RetrieveGrammar(ruleName
                                                             .GetFullGrammarName());
                if (rg == null)
                {
                    throw new JSGFGrammarException("Can't resolve grammar name "
                                                   + ruleName.GetFullGrammarName());
                }

                JSGFRule rule = rg.GetRule(ruleName.GetSimpleRuleName());
                if (rule == null)
                {
                    throw new JSGFGrammarException("Can't resolve rule: "
                                                   + ruleName.GetRuleName());
                }
                GrammarGraph ruleResult = ProcessRule(rule);
                if (result != ruleResult)
                {
                    result.StartNode.Add(ruleResult.StartNode, 0.0f);
                    ruleResult.EndNode.Add(result.EndNode, 0.0f);
                }
            }
            RuleStack.Pop();
            return(result);
        }
Exemple #9
0
        public JSGFRuleName RuleRef()
        {
            String s;

            jj_consume_token(28);
            s = Name();
            jj_consume_token(31);
            JSGFRuleName rn = new JSGFRuleName(s);
            { if (true)
              {
                  return(rn);
              }
            }
        }
Exemple #10
0
        private JSGFGrammar.GrammarGraph processRuleName(JSGFRuleName jsgfruleName)
        {
            this.logger.fine(new StringBuilder().append("parseRuleName: ").append(jsgfruleName).toString());
            JSGFGrammar.GrammarGraph grammarGraph = this.__ruleStack.contains(jsgfruleName.getRuleName());
            if (grammarGraph != null)
            {
                return(grammarGraph);
            }
            grammarGraph = new JSGFGrammar.GrammarGraph(this);
            this.__ruleStack.push(jsgfruleName.getRuleName(), grammarGraph);
            JSGFRuleName jsgfruleName2 = this.ruleGrammar.resolve(jsgfruleName);

            if (jsgfruleName2 == JSGFRuleName.__NULL)
            {
                grammarGraph.getStartNode().add(grammarGraph.getEndNode(), 0f);
            }
            else if (jsgfruleName2 != JSGFRuleName.__VOID)
            {
                if (jsgfruleName2 == null)
                {
                    string message = new StringBuilder().append("Can't resolve ").append(jsgfruleName).append(" g ").append(jsgfruleName.getFullGrammarName()).toString();

                    throw new JSGFGrammarException(message);
                }
                JSGFRuleGrammar jsgfruleGrammar = this.manager.retrieveGrammar(jsgfruleName2.getFullGrammarName());
                if (jsgfruleGrammar == null)
                {
                    string message2 = new StringBuilder().append("Can't resolve grammar name ").append(jsgfruleName2.getFullGrammarName()).toString();

                    throw new JSGFGrammarException(message2);
                }
                JSGFRule rule = jsgfruleGrammar.getRule(jsgfruleName2.getSimpleRuleName());
                if (rule == null)
                {
                    string message3 = new StringBuilder().append("Can't resolve rule: ").append(jsgfruleName2.getRuleName()).toString();

                    throw new JSGFGrammarException(message3);
                }
                JSGFGrammar.GrammarGraph grammarGraph2 = this.processRule(rule);
                if (grammarGraph != grammarGraph2)
                {
                    grammarGraph.getStartNode().add(grammarGraph2.getStartNode(), 0f);
                    grammarGraph2.getEndNode().add(grammarGraph.getEndNode(), 0f);
                }
            }
            this.__ruleStack.pop();
            return(grammarGraph);
        }
Exemple #11
0
        public void ImportDeclaration(JSGFRuleGrammar grammar)
        {
            bool   all = false;
            String name;
            Token  t = null;

            t = jj_consume_token(Import);
            jj_consume_token(28);
            name = Name();
            switch ((_jj_ntk == -1) ? jj_ntk() : _jj_ntk)
            {
            case 29:
                jj_consume_token(29);
                jj_consume_token(30);
                all = true;
                break;

            default:
                jj_la1[5] = jj_gen;
                break;
            }
            jj_consume_token(31);
            jj_consume_token(26);
            // import all rules if .*
            if (all)
            {
                name = name + ".*";
            }
            JSGFRuleName r = new JSGFRuleName(name);

            if (grammar != null)
            {
                grammar.AddImport(r);
                if (grammar is JSGFRuleGrammar && t != null && t.SpecialToken != null)
                {
                    if (t.SpecialToken.Image != null && t.SpecialToken.Image.StartsWith("/**"))
                    {
                        JSGFRuleGrammar JG = grammar;
                        JG.AddImportDocComment(r, t.SpecialToken.Image);
                    }
                }
            }
        }
Exemple #12
0
        private void loadImports(JSGFRuleGrammar jsgfruleGrammar)
        {
            Iterator iterator = jsgfruleGrammar.__imports.iterator();

            while (iterator.hasNext())
            {
                JSGFRuleName    jsgfruleName     = (JSGFRuleName)iterator.next();
                string          fullGrammarName  = jsgfruleName.getFullGrammarName();
                JSGFRuleGrammar jsgfruleGrammar2 = this.getNamedRuleGrammar(fullGrammarName);
                if (jsgfruleGrammar2 == null)
                {
                    jsgfruleGrammar2 = this.loadNamedGrammar(jsgfruleName.getFullGrammarName());
                }
                if (jsgfruleGrammar2 != null)
                {
                    this.loadImports(jsgfruleGrammar2);
                }
            }
            this.loadFullQualifiedRules(jsgfruleGrammar);
        }
Exemple #13
0
        protected internal virtual void dumpGrammar()
        {
            [email protected]("Imported rules { ");
            Iterator iterator = this.ruleGrammar.getImports().iterator();

            while (iterator.hasNext())
            {
                JSGFRuleName jsgfruleName = (JSGFRuleName)iterator.next();
                [email protected](new StringBuilder().append("  Import ").append(jsgfruleName.getRuleName()).toString());
            }
            [email protected]("}");
            [email protected]("Rulenames { ");
            iterator = this.ruleGrammar.getRuleNames().iterator();
            while (iterator.hasNext())
            {
                string text = (string)iterator.next();
                [email protected](new StringBuilder().append("  Name ").append(text).toString());
            }
            [email protected]("}");
        }
Exemple #14
0
        /**
         * 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);
                        }
                    }
                }
            }
        }
Exemple #15
0
        /**
         * Gets the fully resolved rule name
         *
         * @param ruleName
         *            the partial name
         * @return the fully resolved name
         * @throws JSGFGrammarException
         */
        private String GetFullRuleName(String ruleName)
        {
            JSGFRuleName rname = _ruleGrammar.Resolve(new JSGFRuleName(ruleName));

            return(rname.GetRuleName());
        }
        protected internal virtual void resolveRule(JSGFRule r)
        {
            if (r is JSGFRuleToken)
            {
                return;
            }
            if (r is JSGFRuleAlternatives)
            {
                Iterator iterator = ((JSGFRuleAlternatives)r).getRules().iterator();
                while (iterator.hasNext())
                {
                    JSGFRule jsgfrule = (JSGFRule)iterator.next();
                    this.resolveRule(jsgfrule);
                }
                return;
            }
            if (r is JSGFRuleSequence)
            {
                Iterator iterator = ((JSGFRuleSequence)r).getRules().iterator();
                while (iterator.hasNext())
                {
                    JSGFRule jsgfrule = (JSGFRule)iterator.next();
                    this.resolveRule(jsgfrule);
                }
                return;
            }
            if (r is JSGFRuleCount)
            {
                this.resolveRule(((JSGFRuleCount)r).getRule());
                return;
            }
            if (r is JSGFRuleTag)
            {
                JSGFRuleTag jsgfruleTag = (JSGFRuleTag)r;
                JSGFRule    jsgfrule    = jsgfruleTag.getRule();
                string      text        = jsgfrule.toString();
                object      obj         = (Collection)this.__ruleTags.get(text);
                if ((Collection)obj == null)
                {
                    obj = new HashSet();
                    this.__ruleTags.put(text, (HashSet)obj);
                }
                object     obj2 = obj;
                object     tag  = jsgfruleTag.getTag();
                Collection collection;
                if (obj2 != null)
                {
                    if ((collection = (obj2 as Collection)) == null)
                    {
                        throw new IncompatibleClassChangeError();
                    }
                }
                else
                {
                    collection = null;
                }
                collection.add(tag);
                this.resolveRule(jsgfrule);
                return;
            }
            if (!(r is JSGFRuleName))
            {
                string message = "Unknown rule type";

                throw new JSGFGrammarException(message);
            }
            JSGFRuleName jsgfruleName  = (JSGFRuleName)r;
            JSGFRuleName jsgfruleName2 = this.resolve(jsgfruleName);

            if (jsgfruleName2 == null)
            {
                string message2 = new StringBuilder().append("Unresolvable rulename in grammar ").append(this.name).append(": ").append(jsgfruleName).toString();

                throw new JSGFGrammarException(message2);
            }
            jsgfruleName.resolvedRuleName = jsgfruleName2.getRuleName();
            jsgfruleName.setRuleName(jsgfruleName2.getRuleName());
        }
        public virtual JSGFRuleName resolve(JSGFRuleName ruleName)
        {
            JSGFRuleName jsgfruleName      = new JSGFRuleName(ruleName.getRuleName());
            string       simpleRuleName    = jsgfruleName.getSimpleRuleName();
            string       simpleGrammarName = jsgfruleName.getSimpleGrammarName();
            string       packageName       = jsgfruleName.getPackageName();
            string       fullGrammarName   = jsgfruleName.getFullGrammarName();

            if (packageName != null && simpleGrammarName == null)
            {
                string message = new StringBuilder().append("Error: badly formed rulename ").append(jsgfruleName).toString();

                throw new JSGFGrammarException(message);
            }
            if (String.instancehelper_equals(ruleName.getSimpleRuleName(), "NULL"))
            {
                return(JSGFRuleName.__NULL);
            }
            if (String.instancehelper_equals(ruleName.getSimpleRuleName(), "VOID"))
            {
                return(JSGFRuleName.__VOID);
            }
            if (fullGrammarName == null && this.getRule(simpleRuleName) != null)
            {
                return(new JSGFRuleName(new StringBuilder().append(this.name).append('.').append(simpleRuleName).toString()));
            }
            if (fullGrammarName != null)
            {
                JSGFRuleGrammar jsgfruleGrammar = this.manager.retrieveGrammar(fullGrammarName);
                if (jsgfruleGrammar != null && jsgfruleGrammar.getRule(simpleRuleName) != null)
                {
                    return(new JSGFRuleName(new StringBuilder().append(fullGrammarName).append('.').append(simpleRuleName).toString()));
                }
            }
            ArrayList arrayList  = new ArrayList();
            ArrayList arrayList2 = new ArrayList(this.__imports);
            List      list       = arrayList2;

            list.add(new JSGFRuleName(new StringBuilder().append(this.name).append(".*").toString()));
            Iterator iterator = arrayList2.iterator();

            while (iterator.hasNext())
            {
                JSGFRuleName jsgfruleName2      = (JSGFRuleName)iterator.next();
                string       simpleRuleName2    = jsgfruleName2.getSimpleRuleName();
                string       simpleGrammarName2 = jsgfruleName2.getSimpleGrammarName();
                string       fullGrammarName2   = jsgfruleName2.getFullGrammarName();
                if (fullGrammarName2 == null)
                {
                    string message2 = new StringBuilder().append("Error: badly formed import ").append(ruleName).toString();

                    throw new JSGFGrammarException(message2);
                }
                JSGFRuleGrammar jsgfruleGrammar2 = this.manager.retrieveGrammar(fullGrammarName2);
                if (jsgfruleGrammar2 == null)
                {
                    [email protected](new StringBuilder().append("Warning: import of unknown grammar ").append(ruleName).append(" in ").append(this.name).toString());
                }
                else if (!String.instancehelper_equals(simpleRuleName2, "*") && jsgfruleGrammar2.getRule(simpleRuleName2) == null)
                {
                    [email protected](new StringBuilder().append("Warning: import of undefined rule ").append(ruleName).append(" in ").append(this.name).toString());
                }
                else if (String.instancehelper_equals(fullGrammarName2, fullGrammarName) || String.instancehelper_equals(simpleGrammarName2, fullGrammarName))
                {
                    if (String.instancehelper_equals(simpleRuleName2, "*"))
                    {
                        if (jsgfruleGrammar2.getRule(simpleRuleName) != null)
                        {
                            List list2 = arrayList;
                            list2.add(new JSGFRuleName(new StringBuilder().append(fullGrammarName2).append('.').append(simpleRuleName).toString()));
                        }
                    }
                    else if (String.instancehelper_equals(simpleRuleName2, simpleRuleName))
                    {
                        List list3 = arrayList;
                        list3.add(new JSGFRuleName(new StringBuilder().append(fullGrammarName2).append('.').append(simpleRuleName).toString()));
                    }
                }
                else if (fullGrammarName == null)
                {
                    if (String.instancehelper_equals(simpleRuleName2, "*"))
                    {
                        if (jsgfruleGrammar2.getRule(simpleRuleName) != null)
                        {
                            List list4 = arrayList;
                            list4.add(new JSGFRuleName(new StringBuilder().append(fullGrammarName2).append('.').append(simpleRuleName).toString()));
                        }
                    }
                    else if (String.instancehelper_equals(simpleRuleName2, simpleRuleName))
                    {
                        List list5 = arrayList;
                        list5.add(new JSGFRuleName(new StringBuilder().append(fullGrammarName2).append('.').append(simpleRuleName).toString()));
                    }
                }
            }
            int num = arrayList.size();

            if (num == 0)
            {
                return(null);
            }
            if (num == 1)
            {
                return((JSGFRuleName)arrayList.get(0));
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.append("Warning: ambiguous reference ").append(jsgfruleName).append(" in ").append(this.name).append(" to ");
            Iterator iterator2 = arrayList.iterator();

            while (iterator2.hasNext())
            {
                JSGFRuleName jsgfruleName3 = (JSGFRuleName)iterator2.next();
                stringBuilder.append(jsgfruleName3).append(" and ");
            }
            stringBuilder.setLength(stringBuilder.length() - 5);
            string message3 = stringBuilder.toString();

            throw new JSGFGrammarException(message3);
        }
Exemple #18
0
        private string getFullRuleName(string name)
        {
            JSGFRuleName jsgfruleName = this.ruleGrammar.resolve(new JSGFRuleName(name));

            return(jsgfruleName.getRuleName());
        }
 public virtual void addImportDocComment(JSGFRuleName imp, string comment)
 {
     this.importDocComments.put(imp.toString(), comment);
 }
 public virtual string getImportDocComment(JSGFRuleName imp)
 {
     return(this.importDocComments.getProperty(imp.toString(), null));
 }
 /** Retrieve an import comment. */
 public String GetImportDocComment(JSGFRuleName imp)
 {
     return(_importDocComments.getProperty(imp.ToString(), null));
 }
 /** Add a new import comment. */
 public void AddImportDocComment(JSGFRuleName imp, String comment)
 {
     Java.Put(_importDocComments, imp.ToString(), comment);
 }
        /**
         * Resolve a simple or qualified rule name as a full rule name.
         *
         * @param ruleName
         *            the name of the rule.
         */
        public JSGFRuleName Resolve(JSGFRuleName ruleName)
        {
            // System.out.println ("Resolving " + ruleName);
            JSGFRuleName rn = new JSGFRuleName(ruleName.GetRuleName());

            String simpleName      = rn.GetSimpleRuleName();
            String grammarName     = rn.GetSimpleGrammarName();
            String packageName     = rn.GetPackageName();
            String fullGrammarName = rn.GetFullGrammarName();

            // Check for badly formed RuleName
            if (packageName != null && grammarName == null)
            {
                throw new JSGFGrammarException("Error: badly formed rulename " + rn);
            }

            if (ruleName.GetSimpleRuleName().Equals("NULL"))
            {
                return(JSGFRuleName.Null);
            }

            if (ruleName.GetSimpleRuleName().Equals("VOID"))
            {
                return(JSGFRuleName.Void);
            }

            // Check simple case: a local rule reference
            if (fullGrammarName == null && GetRule(simpleName) != null)
            {
                return(new JSGFRuleName(_name + '.' + simpleName));
            }

            // Check for fully-qualified reference
            if (fullGrammarName != null)
            {
                JSGFRuleGrammar g = _manager.RetrieveGrammar(fullGrammarName);
                if (g != null)
                {
                    if (g.GetRule(simpleName) != null)
                    {
                        // we have a successful resolution
                        return(new JSGFRuleName(fullGrammarName + '.' + simpleName));
                    }
                }
            }

            // Collect all matching imports into a list. After trying to
            // match rn to each import statement the vec will have
            // size()=0 if rn is unresolvable
            // size()=1 if rn is properly resolvable
            // size()>1 if rn is an ambiguous reference
            List <JSGFRuleName> matches = new List <JSGFRuleName>();

            // Get list of imports
            // Add local grammar to simply the case of checking for
            // a qualified or fully-qualified local reference.
            List <JSGFRuleName> imports = new List <JSGFRuleName>(this.Imports);

            imports.Add(new JSGFRuleName(_name + ".*"));

            // Check each import statement for a possible match
            foreach (JSGFRuleName importName in imports)
            {
                // TO-DO: update for JSAPI 1.0
                String importSimpleName      = importName.GetSimpleRuleName();
                String importGrammarName     = importName.GetSimpleGrammarName();
                String importFullGrammarName = importName.GetFullGrammarName();

                // Check for badly formed import name
                if (importFullGrammarName == null)
                {
                    throw new JSGFGrammarException("Error: badly formed import " + ruleName);
                }

                // Get the imported grammar
                JSGFRuleGrammar gref = _manager.RetrieveGrammar(importFullGrammarName);
                if (gref == null)
                {
                    Console.WriteLine("Warning: import of unknown grammar " + ruleName + " in " + _name);
                    continue;
                }

                // If import includes simpleName, test that it really exists
                if (!importSimpleName.Equals("*") && gref.GetRule(importSimpleName) == null)
                {
                    Console.WriteLine("Warning: import of undefined rule " + ruleName + " in " + _name);
                    continue;
                }

                // Check for fully-qualified or qualified reference
                if (importFullGrammarName.Equals(fullGrammarName) || importGrammarName.Equals(fullGrammarName))
                {
                    // Know that either
                    // import <ipkg.igram.???> matches <pkg.gram.???>
                    // OR
                    // import <ipkg.igram.???> matches <gram.???>
                    // (ipkg may be null)

                    if (importSimpleName.Equals("*"))
                    {
                        if (gref.GetRule(simpleName) != null)
                        {
                            // import <pkg.gram.*> matches <pkg.gram.rulename>
                            matches.Add(new JSGFRuleName(importFullGrammarName + '.' + simpleName));
                        }
                        continue;
                    }
                    else
                    {
                        // Now testing
                        // import <ipkg.igram.iRuleName> against <??.gram.ruleName>
                        //
                        if (importSimpleName.Equals(simpleName))
                        {
                            // import <pkg.gram.rulename> exact match for
                            // <???.gram.rulename>
                            matches.Add(new JSGFRuleName(importFullGrammarName + '.' + simpleName));
                        }
                        continue;
                    }
                }

                // If we get here and rulename is qualified or fully-qualified
                // then the match failed - try the next import statement
                if (fullGrammarName != null)
                {
                    continue;
                }

                // Now test
                // import <ipkg.igram.*> against <simpleName>

                if (importSimpleName.Equals("*"))
                {
                    if (gref.GetRule(simpleName) != null)
                    {
                        // import <pkg.gram.*> matches <simpleName>
                        matches.Add(new JSGFRuleName(importFullGrammarName + '.' + simpleName));
                    }
                    continue;
                }

                // Finally test
                // import <ipkg.igram.iSimpleName> against <simpleName>

                if (importSimpleName.Equals(simpleName))
                {
                    matches.Add(new JSGFRuleName(importFullGrammarName + '.' + simpleName));
                    continue;
                }
            }

            // The return behavior depends upon number of matches
            switch (matches.Count)
            {
            case 0:     // Return null if rulename is unresolvable
                return(null);

            case 1:     // Return successfully
                return(matches[0]);

            default:     // Throw exception if ambiguous reference
                StringBuilder b = new StringBuilder();
                b.Append("Warning: ambiguous reference ").Append(rn).Append(" in ").Append(_name).Append(" to ");
                foreach (JSGFRuleName tmp in matches)
                {
                    b.Append(tmp).Append(" and ");
                }
                b.Length = (b.Length - 5);
                throw new JSGFGrammarException(b.ToString());
            }
        }
        /** Resolve the given rule. */
        protected void ResolveRule(JSGFRule r)
        {
            if (r is JSGFRuleToken)
            {
                return;
            }

            if (r is JSGFRuleAlternatives)
            {
                foreach (JSGFRule rule in ((JSGFRuleAlternatives)r).GetRules())
                {
                    ResolveRule(rule);
                }
                return;
            }

            if (r is JSGFRuleSequence)
            {
                foreach (JSGFRule rule in ((JSGFRuleSequence)r).Rules)
                {
                    ResolveRule(rule);
                }
                return;
            }

            if (r is JSGFRuleCount)
            {
                ResolveRule(((JSGFRuleCount)r).Rule);
                return;
            }

            if (r is JSGFRuleTag)
            {
                JSGFRuleTag rt = (JSGFRuleTag)r;

                JSGFRule rule    = rt.Rule;
                String   ruleStr = rule.ToString();

                // add the tag the tag-table
                var tags = RuleTags.Get(ruleStr);
                if (tags == null)
                {
                    tags = new HashSet <String>();
                    RuleTags.Put(ruleStr, tags);
                }
                tags.Add(rt.Tag);

                ResolveRule(rule);
                return;
            }

            if (r is JSGFRuleName)
            {
                JSGFRuleName rn       = (JSGFRuleName)r;
                JSGFRuleName resolved = Resolve(rn);

                if (resolved == null)
                {
                    throw new JSGFGrammarException("Unresolvable rulename in grammar " + _name + ": " + rn);
                }
                else
                {
                    // TODO: This forces all rule names to be fully resolved.
                    // This should be changed.
                    rn.ResolvedRuleName = resolved.GetRuleName();
                    rn.SetRuleName(resolved.GetRuleName());
                    return;
                }
            }

            throw new JSGFGrammarException("Unknown rule type");
        }