class IDL::Engine::ProductionStack
def [](id)
def [](id) @stack[@index[id.to_sym]].last end
def empty?
def empty? @stack.empty? end
def has?(id)
def has?(id) @index.has_key?(id.to_sym) end
def initialize
def initialize @stack = [] @index = {} end
def peek
def peek return nil if empty? id, _ = @stack.first id end
def pop
def pop return nil if empty? id, prod = @stack.shift @index.delete(id) prod end
def push(id, prod)
def push(id, prod) @index[id.to_sym] = @stack.size @stack << [id.to_sym, prod] end
def remove(id)
def remove(id) return nil unless has?(id) i = @index.delete(id.to_sym) _, producer = @productionstack.delete(i) producer end
def size
def size @stack.size end