class MicroCisc::Compile::LabelGenerator

Public Class Methods

new() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 4
def initialize
  @labels = []
  @count = 0
end

Public Instance Methods

end_label() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 18
def end_label
  last_open.sub('{', '}')
end
last_open() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 26
def last_open
  if @labels.empty?
    raise ArgumentException, "No open label context"
  end
  # Go backwards until we find an open that we didn't see the close for first
  i = @labels.size - 1
  closed = nil
  while(i >= 0)
    if @labels[i].start_with?('}')
      closed = @labels[i]
    elsif !closed
      return @labels[i]
    elsif closed && @labels[i].end_with?(closed[1..-1])
      closed = nil
    else
      raise 'Invalid state, contexts are out of order'
    end
    i -= 1
  end
end
pop_context() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 14
def pop_context
  @labels << last_open.sub('{', '}')
end
push_context() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 9
def push_context
  @count += 1
  @labels << "{#{@count}"
end
start_label() click to toggle source
# File lib/micro_cisc/compile/label_generator.rb, line 22
def start_label
  last_open
end