Class: PEG::Language

Inherits:
Object
  • Object
show all
Defined in:
lib/peg.rb

Constant Summary collapse

@@default =
proc {|node, children| children}
@@rules =

we rely on the fact that 1.9+ Hash maintains order

{}
@@blocks =
{}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.default(&block) ⇒ Object



415
416
417
# File 'lib/peg.rb', line 415

def self.default(&block)
  @@default = block
end

.rule(rule, &block) ⇒ Object



409
410
411
412
413
# File 'lib/peg.rb', line 409

def self.rule(rule, &block)
  name = rule.split('<-')[0].strip
  @@rules[name] = rule
  @@blocks[name] = block
end

Instance Method Details

#_eval(node) ⇒ Object



433
434
435
436
437
438
439
440
441
442
443
# File 'lib/peg.rb', line 433

def _eval(node)
  block = @@blocks[node.name] || @@default
  if block.arity == 2
    children = node.children.map {|child| _eval(child)}
    instance_exec(node, children, &block)
  elsif block.arity == 1
    instance_exec(node, &block)
  else
    raise "`rule` expects a block with signature |node| or |node, children|"
  end
end

#eval(source) ⇒ Object



425
426
427
428
429
430
431
# File 'lib/peg.rb', line 425

def eval(source)
  if source.class == String
    grammar_source = @@rules.values.join("\n")
    source = Grammar.new(grammar_source).parse(source)
  end
  _eval(source)
end

#to_lambda(&block) ⇒ Object



419
420
421
422
423
# File 'lib/peg.rb', line 419

def to_lambda(&block)
  obj = Object.new
  obj.define_singleton_method(:_, &block)
  return obj.method(:_).to_proc
end