Class: Sequitur::ProductionRef
- Inherits:
-
Object
- Object
- Sequitur::ProductionRef
- 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
Instance Attribute Summary collapse
-
#production ⇒ Object
readonly
Link to the production to reference.
Instance Method Summary collapse
-
#==(other) ⇒ true / false
Equality testing.
-
#accept(aVisitor) ⇒ Object
Part of the 'visitee' role in the Visitor design pattern.
-
#bind_to(aProduction) ⇒ Object
Make this reference point to the given production.
-
#hash ⇒ Fixnum
Produce a hash value.
-
#initialize(target) ⇒ ProductionRef
constructor
Constructor.
-
#initialize_copy(orig) ⇒ Object
Copy constructor invoked by dup or clone methods.
-
#to_s ⇒ String
(also: #to_string)
Emit the text representation of a production reference.
-
#unbind ⇒ Object
Clear the reference to the target production.
-
#unbound? ⇒ true / false
Check that the this object doesn't refer to any production.
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
#production ⇒ Object (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 |
#hash ⇒ Fixnum
Produce a hash value. A reference has no identity on its own, the method returns the hash value of the referenced production
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.
37 38 39 40 |
# File 'lib/sequitur/production_ref.rb', line 37 def initialize_copy(orig) @production = nil bind_to(orig.production) end |
#to_s ⇒ String 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 |
#unbind ⇒ Object
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 |