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

#productionSequitur::Production (readonly)

Returns Link to the production to reference.

Returns:



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

def production
  @production
end

Instance Method Details

#==(other) ⇒ TrueClass, FalseClass

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:

  • (TrueClass, FalseClass)


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

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

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

#accept(aVisitor) ⇒ Object

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

Parameters:



108
109
110
# File 'lib/sequitur/production_ref.rb', line 108

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

#bind_to(aProduction) ⇒ Object

Make this reference point to the given production.

Parameters:



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/sequitur/production_ref.rb', line 80

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

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

  @production = aProduction
  production.incr_refcount
end

#hashInteger

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

Returns:

  • (Integer)

    the hash value

Raises:

  • (StandardError)


71
72
73
74
75
# File 'lib/sequitur/production_ref.rb', line 71

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

  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
  production.object_id.to_s
end

#unbindObject

Clear the reference to the target production. return [NilClass]



94
95
96
97
# File 'lib/sequitur/production_ref.rb', line 94

def unbind
  production.decr_refcount
  @production = nil
end

#unbound?TrueClass, FalseClass

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

Returns:

  • (TrueClass, FalseClass)

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



102
103
104
# File 'lib/sequitur/production_ref.rb', line 102

def unbound?
  production.nil?
end