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
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