class ADSL::Parser::ASTNode

Public Class Methods

is_formula?() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 28
def self.is_formula?
  @is_formula
end
is_objset?() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 24
def self.is_objset?
  @is_objset
end
is_statement?() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 20
def self.is_statement?
  @is_statement
end
node_type(*fields) click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 36
def self.node_type(*fields)
  options = {}
  if fields.last.is_a? Hash
    options.merge! fields.pop
  end

  if options.include?(:type) and !options.include?(:types)
    options[:types] = [options[:type]]
  end
  if options.include?(:types)
    @is_statement = options[:types].include? :statement
    @is_objset = options[:types].include? :objset
    @is_formula = options[:types].include? :formula
  end

  container_for *fields
  container_for :lineno
end

Public Instance Methods

==(other) click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 105
def ==(other)
  return false unless self.class == other.class
  self.class.container_for_fields.each do |field_name|
    child1 = self.send field_name
    child2 = other.send field_name
    return false unless child1 == child2
  end
  true
end
Also aliased as: eql?
adsl_ast() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 55
def adsl_ast
  self
end
adsl_ast_size() click to toggle source

used for statistics

# File lib/adsl/parser/ast_nodes.rb, line 135
def adsl_ast_size
  sum = 1
  self.class.container_for_fields.each do |field_name|
    field = send field_name
    if field.is_a? Array
      field.flatten.each do |subfield|
        sum += subfield.adsl_ast_size if subfield.respond_to? :adsl_ast_size
      end
    else
      sum += field.adsl_ast_size if field.respond_to? :adsl_ast_size
    end
  end
  sum
end
block_replace(&block) click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 83
def block_replace(&block)
  children = self.class.container_for_fields.map{ |field_name| [field_name, send(field_name)] }
  children.each do |name, value|
    new_value = if value.is_a? Array
      value.map do |e|
        new_e = e.block_replace(&block)
        new_e.nil? ? e.dup : new_e
      end
    elsif value.is_a? ASTNode
      new_value = value.block_replace(&block)
      new_value.nil? ? value.dup : new_value
    elsif value.is_a?(Symbol) || value.nil?
      value
    else
      value.dup
    end
    send("#{name}=", new_value) if new_value != value
  end
  new_value = block[self]
  new_value.nil? ? self.dup : new_value
end
dup() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 70
def dup
  new_values = {}
  self.class.container_for_fields.each do |field_name|
    value = send field_name
    new_values[field_name] = if value.is_a?(Symbol) || value.nil?
      value
    else
      value.dup
    end
  end
  self.class.new new_values
end
eql?(other)
Alias for: ==
hash() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 116
def hash
  [self.class, *self.class.container_for_fields.map{ |field_name| send field_name }].hash
end
objset_has_side_effects?() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 32
def objset_has_side_effects?
  false
end
optimize() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 59
def optimize
  copy = self.dup
  children = self.class.container_for_fields.map{ |field_name| [field_name, copy.send(field_name)] }
  until children.empty?
    child_name, child = children.pop
    new_value = child.respond_to?(:optimize) ? child.optimize : child.dup
    copy.send "#{child_name}=", new_value unless new_value.equal? child
  end
  copy
end
preorder_traverse(&block) click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 120
def preorder_traverse(&block)
  self.class.container_for_fields.each do |field_name|
    field = send field_name
    if field.is_a? Array
      field.flatten.each do |subfield|
        subfield.preorder_traverse &block if subfield.respond_to? :preorder_traverse
      end
    else
      field.preorder_traverse &block if field.respond_to? :preorder_traverse
    end
  end
  block[self]
end