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

Parameters:



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.

Parameters:

Returns:

  • (true / false)


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.

Parameters:



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.

Parameters:



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

Returns:

  • (Fixnum)

    the hash value

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

Parameters:



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.

Returns:

  • (String)


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.

Returns:

  • (true / false)

    true when this object doesn't point to a production.



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

def unbound?
  return production.nil?
end