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); }
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)); }
public void Resolve(RuleRef <TNode> parent) { Rule = parent.Rule; Reducer = Reducer ?? parent.Reducer; }