Class: 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.
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_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.
39 40 41 |
# File 'lib/stupidedi/builder/instruction.rb', line 39 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.
24 25 26 |
# File 'lib/stupidedi/builder/instruction.rb', line 24 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.
49 50 51 |
# File 'lib/stupidedi/builder/instruction.rb', line 49 def push @push end |
#segment_id ⇒ Symbol (readonly)
The segment identifier to which this Stupidedi::Builder::Instruction applies
10 11 12 |
# File 'lib/stupidedi/builder/instruction.rb', line 10 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.
18 19 20 |
# File 'lib/stupidedi/builder/instruction.rb', line 18 def segment_use @segment_use end |
Instance Method Details
#copy(changes = {}) ⇒ Instruction
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 |