bool IsAlternativeNeeded(ExplicitRule curr, ExtensibleRule parent) { if (curr == null) { return(false); } var seq = curr.Expression as RuleExpression.Sequence; if (seq == null) { return(false); } if (seq.Childs.Count != 3) { return(false); } var arg1 = seq.Childs[0] as RuleExpression.RuleUsage; var arg2 = seq.Childs[2] as RuleExpression.RuleUsage; if (arg1 == null || arg2 == null || arg1.RuleName != parent.Name || arg2.RuleName != parent.Name) { return(false); } return(true); }
public void AddInfo(ExtensibleRule rule) { foreach (var item in rule.GetAlternatives()) { if (IsAlternativeNeeded(item.Rule as ExplicitRule, rule)) { _alternatives.Add(new RuleAlternativeInfo(item, rule, this)); } } _alternatives.Sort((a, b) => a.AlternativeInfo.Priority.CompareTo(b.AlternativeInfo.Priority)); }
public void VisitExtensibleRule(ExtensibleRule extensibleRule) { var rewrite = extensibleRule.GetAttributes().Any(a => a.Name == "RewriteRecursion"); if (rewrite) { RuleAlternativesInfo info; if (!_info.TryGetValue(extensibleRule.Name, out info)) { _info.Add(extensibleRule.Name, info = new RuleAlternativesInfo()); } info.AddInfo(extensibleRule); } }