Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
            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));
            }
Ejemplo n.º 3
0
            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);
                }
            }