def evaluate(start_symbol=:start, rules_map={})
      reset_evaluation_context

      rules_map.each do |key, value|
        if rules.key?(key.to_sym)
          raise Errors::DuplicateRule.new(key)
        end

        define_context_rule(key, caller_locations.last, value)
      end

      [start_symbol, expand(start_symbol).evaluate(@options)]
    end
def evaluate(start_symbol=:start, rules_map={})
      reset_evaluation_context

      rules_map.each do |key, value|
        if rules.key?(key.to_sym)
          raise Errors::DuplicateRule.new(key)
        end

        define_context_rule(key, caller_locations.last, value)
      end

      [start_symbol, expand(start_symbol).evaluate(@options)]
    end
Evaluates the grammar defined in this registry, combining it with rules
 from the passed in context.

 Produces a syntax tree of nested list nodes.

 @param [Symbol] start_symbol
 @param [Hash] rules_map
 @return [Array]