class Grammoire::Grammar

Public Class Methods

new(random_generator = RandomGenerator.new) click to toggle source
# File lib/grammoire/grammar.rb, line 4
def initialize(random_generator = RandomGenerator.new)
  @rules = []
  @chooser = RuleChooser.new(random_generator)
  context(EvaluationContext)
end

Public Instance Methods

context(context_class) click to toggle source
# File lib/grammoire/grammar.rb, line 10
def context(context_class)
  @context = context_class.new(self)
end
evaluate(rule_name, data = {}) click to toggle source
# File lib/grammoire/grammar.rb, line 18
def evaluate(rule_name, data = {})
  @context.with_data_points(data)

  return @chooser.select_from(rules_for(rule_name)).evaluate(@context)
end
rule(name, &action) click to toggle source
# File lib/grammoire/grammar.rb, line 14
def rule(name, &action)
  @rules << Rule.new(name, &action)
end

Private Instance Methods

rules_for(name) click to toggle source
# File lib/grammoire/grammar.rb, line 26
def rules_for(name)
  rules = @rules.select { |rule| rule.name == name && rule.applies?(@context) }
  raise GrammarError.new("Rule '#{name}' doesn't exist in the grammar or don't have valid pre-conditions.") if rules.empty?

  return rules
end