/** 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");
        }