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



55
56
57
58
# File 'lib/stupidedi/builder/instruction.rb', line 55

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.



43
44
45
# File 'lib/stupidedi/builder/instruction.rb', line 43

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.



28
29
30
# File 'lib/stupidedi/builder/instruction.rb', line 28

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.



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

def push
  @push
end

#segment_idSymbol (readonly)

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



14
15
16
# File 'lib/stupidedi/builder/instruction.rb', line 14

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.



22
23
24
# File 'lib/stupidedi/builder/instruction.rb', line 22

def segment_use
  @segment_use
end

Instance Method Details

#copy(changes = {}) ⇒ Instruction



61
62
63
64
65
66
67
68
# File 'lib/stupidedi/builder/instruction.rb', line 61

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



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
99
100
101
102
# File 'lib/stupidedi/builder/instruction.rb', line 71

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 = id + ": #{name.slice(0, width - 2)}.."
    else
      id = 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