Exemple #1
0
        public IRuleRef <TNode> DefineRule(string?name, IRule rule)
        {
            var ruleRef = new RuleRef <TNode>(rule);

            if (!string.IsNullOrEmpty(name))
            {
                if (_definedRules.ContainsKey(name))
                {
                    throw new InvalidOperationException($"Cannot define a rule with the same name twice: {name}");
                }
                _definedRules[name] = ruleRef;
            }

            return(ruleRef);
        }
Exemple #2
0
        public IRuleRef <TNode> Ref(string name)
        {
            if (_definedRules.ContainsKey(name))
            {
                return(_definedRules[name].CloneRule().As(name));
            }

            if (!_unresolvedRules.ContainsKey(name))
            {
                _unresolvedRules[name] = new List <RuleRef <TNode> >();
            }

            var ruleRef = new RuleRef <TNode>();

            _unresolvedRules[name].Add(ruleRef);
            return(ruleRef.As(name));
        }
Exemple #3
0
 public void Resolve(RuleRef <TNode> parent)
 {
     Rule    = parent.Rule;
     Reducer = Reducer ?? parent.Reducer;
 }