/// <summary> /// Adds a parsing rule to the recursive descent parser. /// If the rule with the name already exists, it adds another production to said rule. /// </summary> /// <param name="name">Name of the rule</param> /// <param name="decider">Function to evaluate if we can apply the rule</param> /// <param name="evaluator">Function that generates an AST node</param> /// <returns>Self for chaining purposes</returns> public RecursiveDescentParser AddRule(string name, ProductionDecider decider, ProductionEvaluator evaluator) { var rule = _rules.FirstOrDefault(r => r.Name == name); if (rule == null) { rule = new ParsingRule(this) { Name = name }; _rules.Add(rule); } rule.AddProduction(decider, evaluator); return this; }
/// <summary> /// Adds a production to the rule /// </summary> /// <param name="decider">Function to evaluate if the rule applies</param> /// <param name="evaluator">Function to generate a node from the token list</param> public void AddProduction(ProductionDecider decider, ProductionEvaluator evaluator) { _productions.Add(decider, evaluator); }