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



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.

Returns:

  • (Integer)


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.

Returns:

  • (Integer)


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

Returns:

  • (Symbol)


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.

Returns:



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

def segment_use
  @segment_use
end

Instance Method Details

#copy(changes = {}) ⇒ Instruction

Returns:



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)

This method returns an undefined value.



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