Class: Sequitur::ProductionRef

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

Overview

A production reference is a grammar symbol that may appear in the right-hand side of a production P1 and that refers to a production P2. Every time a production P2 appears in the left-hand side of production P1, this is implemented by inserting a production reference to P2 in the appropriate position in the RHS of P1. In the literature, production references are also called non terminal symbols

Examples:

# Given a production rule...
prod = Sequitur::Production.new
puts prod.refcount # outputs 0
# ... Build a reference to it
ref = Sequitur::ProductionRef.new(prod)
# ... Production reference count is updated...
puts prod.refcount # outputs 1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(target) ⇒ ProductionRef

Constructor



26
27
28
# File 'lib/sequitur/production_ref.rb', line 26

def initialize(target)
  bind_to(target)
end

Instance Attribute Details

#productionObject (readonly)

Link to the production to reference.



21
22
23
# File 'lib/sequitur/production_ref.rb', line 21

def production
  @production
end

Instance Method Details

#==(other) ⇒ true / false

Equality testing. A production ref is equal to another one when its refers to the same production or when it is compared to the production it refers to.



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/sequitur/production_ref.rb', line 57

def ==(other)
  return true if object_id == other.object_id

  result = if other.is_a?(ProductionRef)
             (production == other.production)
           else
             (production == other)
           end

  return result
end

#accept(aVisitor) ⇒ Object

Part of the 'visitee' role in the Visitor design pattern.



110
111
112
# File 'lib/sequitur/production_ref.rb', line 110

def accept(aVisitor)
  aVisitor.visit_prod_ref(self)
end

#bind_to(aProduction) ⇒ Object

Make this reference point to the given production.



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/sequitur/production_ref.rb', line 83

def bind_to(aProduction)
  return if aProduction == @production

  production&.decr_refcount
  unless aProduction.kind_of?(Production)
    raise StandardError, "Illegal production type #{aProduction.class}"
  end

  @production = aProduction
  production.incr_refcount
end

#hashFixnum

Produce a hash value. A reference has no identity on its own, the method returns the hash value of the referenced production

Raises:

  • (StandardError)


74
75
76
77
78
# File 'lib/sequitur/production_ref.rb', line 74

def hash
  raise StandardError, 'Nil production' if production.nil?

  return production.hash
end

#initialize_copy(orig) ⇒ Object

Copy constructor invoked by dup or clone methods.

Examples:

prod = Sequitur::Production.new
ref = Sequitur::ProductionRef.new(prod)
copy_ref = ref.dup
puts prod.refcount # outputs 2


37
38
39
40
# File 'lib/sequitur/production_ref.rb', line 37

def initialize_copy(orig)
  @production = nil
  bind_to(orig.production)
end

#to_sString Also known as: to_string

Emit the text representation of a production reference.



44
45
46
# File 'lib/sequitur/production_ref.rb', line 44

def to_s
  return production.object_id.to_s
end

#unbindObject

Clear the reference to the target production.



96
97
98
99
# File 'lib/sequitur/production_ref.rb', line 96

def unbind
  production.decr_refcount
  @production = nil
end

#unbound?true / false

Check that the this object doesn't refer to any production.



104
105
106
# File 'lib/sequitur/production_ref.rb', line 104

def unbound?
  return production.nil?
end