/// <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;
        }
Exemple #2
0
 /// <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);
 }