class Haml::AttributeParser

def each_attr(tokens)

def each_attr(tokens)
  attr_tokens = []
  open_tokens = Hash.new { |h, k| h[k] = 0 }
  tokens.each do |token|
    _, type, _ = token
    case type
    when :on_comma
      if open_tokens.values.all?(&:zero?)
        yield(attr_tokens)
        attr_tokens = []
        next
      end
    when :on_lbracket
      open_tokens[:array] += 1
    when :on_rbracket
      open_tokens[:array] -= 1
    when :on_lbrace
      open_tokens[:block] += 1
    when :on_rbrace
      open_tokens[:block] -= 1
    when :on_lparen
      open_tokens[:paren] += 1
    when :on_rparen
      open_tokens[:paren] -= 1
    when :on_embexpr_beg
      open_tokens[:embexpr] += 1
    when :on_embexpr_end
      open_tokens[:embexpr] -= 1
    when :on_sp
      next if attr_tokens.empty?
    end
    attr_tokens << token
  end
  yield(attr_tokens) unless attr_tokens.empty?
end