Class: Stupidedi::Builder::Instruction
- Inherits:
-
Object
- Object
- Stupidedi::Builder::Instruction
- Includes:
- Inspect
- Defined in:
- lib/stupidedi/builder/instruction.rb
Instance Attribute Summary collapse
-
#drop_count ⇒ Integer
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.
-
#pop_count ⇒ Integer
readonly
This indicates the number of levels to ascend and terminate within the tree before storing the segment.
-
#push ⇒ Zipper::AbstractCursor
readonly
This indicates that a child node should be added to the tree, which will then contain the segment.
-
#segment_id ⇒ Symbol
readonly
The segment identifier to which this Instruction applies.
-
#segment_use ⇒ Schema::SegmentUse
readonly
The segment use contains helpful information about the context of the segment within a definition tree (eg the parent structure’s definition).
Instance Method Summary collapse
- #copy(changes = {}) ⇒ Instruction
-
#initialize(segment_id, segment_use, pop, drop, push) ⇒ Instruction
constructor
A new instance of Instruction.
- #pretty_print(q) ⇒ void
Methods included from 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_count ⇒ Integer (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_count ⇒ Integer (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 |
#push ⇒ Zipper::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_id ⇒ Symbol (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_use ⇒ Schema::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
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 << ": #{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 |