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