def srules
      @srules ||= begin
        closure.each_with_object(Hash.new { |h,k| h[k] = [] }) do |ptr, table|
          next if ptr.reduce? || ptr.symbol.nonterminal?
          table[ptr.symbol] << ptr
        end
      end
    end
def srules
      @srules ||= begin
        closure.each_with_object(Hash.new { |h,k| h[k] = [] }) do |ptr, table|
          next if ptr.reduce? || ptr.symbol.nonterminal?
          table[ptr.symbol] << ptr
        end
      end
    end
{Sym -> LocationPointers within rules which direct us to shift that Sym}