Class: Stupidedi::Builder::Instruction

Inherits:
Object
  • Object
show all
Includes:
Inspect
Defined in:
lib/stupidedi/builder/instruction.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Inspect

#inspect

Constructor Details

#initialize(segment_id, segment_use, pop, drop, push) ⇒ Instruction

Returns a new instance of Instruction.



51
52
53
54
# File 'lib/stupidedi/builder/instruction.rb', line 51

def initialize(segment_id, segment_use, pop, drop, push)
  @segment_id, @segment_use, @pop_count, @drop_count, @push =
    segment_id || segment_use.definition.id, segment_use, pop, drop, push
end

Instance Attribute Details

#drop_countInteger (readonly)

This controls the allowed order in which structures may occur, by indicating the number of instructions to remove from the beginning of the instruction table.

Repeatable structures have a value that ensures that their instruction remains in the successor table.

Sibling structures that have the same position (as defined by their Schema::SegmentUse) will have equal drop_count values such that all of the sibling instructions remain in the successor table when any one of them is executed.

Returns:



39
40
41
# File 'lib/stupidedi/builder/instruction.rb', line 39

def drop_count
  @drop_count
end

#pop_countInteger (readonly)

This indicates the number of levels to ascend and terminate within the tree before storing the segment.

Returns:



24
25
26
# File 'lib/stupidedi/builder/instruction.rb', line 24

def pop_count
  @pop_count
end

#pushZipper::AbstractCursor (readonly)

This indicates that a child node should be added to the tree, which will then contain the segment.

When a segment indicates the start of a child structure, the class indicated by this attribute is expected to respond to ‘push` by creating a new AbstractState.



49
50
51
# File 'lib/stupidedi/builder/instruction.rb', line 49

def push
  @push
end

#segment_idSymbol (readonly)

The segment identifier to which this Stupidedi::Builder::Instruction applies

Returns:



10
11
12
# File 'lib/stupidedi/builder/instruction.rb', line 10

def segment_id
  @segment_id
end

#segment_useSchema::SegmentUse (readonly)

The segment use contains helpful information about the context of the segment within a definition tree (eg the parent structure’s definition). It also enumerates the allowed values for segment qualifiers, which is used to minimize non-determinism.

Returns:



18
19
20
# File 'lib/stupidedi/builder/instruction.rb', line 18

def segment_use
  @segment_use
end

Instance Method Details

#copy(changes = {}) ⇒ Instruction

Returns:



57
58
59
60
61
62
63
64
# File 'lib/stupidedi/builder/instruction.rb', line 57

def copy(changes = {})
  Instruction.new \
    changes.fetch(:segment_id, @segment_id),
    changes.fetch(:segment_use, @segment_use),
    changes.fetch(:pop_count, @pop_count),
    changes.fetch(:drop_count, @drop_count),
    changes.fetch(:push, @push)
end

#pretty_print(q) ⇒ void

This method returns an undefined value.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/stupidedi/builder/instruction.rb', line 67

def pretty_print(q)
  id = '% 3s' % @segment_id.to_s

  unless @segment_use.nil?
    width = 18
    name  = @segment_use.definition.name

    # Truncate the segment name to `width` characters
    if name.length > width - 2
      id << ": #{name.slice(0, width - 2)}.."
    else
      id << ": #{name.ljust(width)}"
    end
  end

  q.text "Instruction[#{'% 3s' % id}]"

  q.group(6, "(", ")") do
    q.breakable ""

    q.text "pop: #{@pop_count},"
    q.breakable

    q.text "drop: #{@drop_count}"

    unless @push.nil?
      q.text ","
      q.breakable
      q.text "push: #{@push.try{|c| c.name.split('::').last}}"
    end
  end
end