class Haml::Parser

def parse

def parse
  @root = @parent = ParseNode.new(:root)
  @haml_comment = false
  @indentation = nil
  @line = next_line
  raise SyntaxError.new(Error.message(:indenting_at_start), @line.index) if @line.tabs != 0
  while next_line
    process_indent(@line) unless @line.text.empty?
    if flat?
      text = @line.full.dup
      text = "" unless text.gsub!(/^#{@flat_spaces}/, '')
      @filter_buffer << "#{text}\n"
      @line = @next_line
      next
    end
    @tab_up = nil
    process_line(@line.text, @line.index) unless @line.text.empty? || @haml_comment
    if @parent.type != :haml_comment && (block_opened? || @tab_up)
      @template_tabs += 1
      @parent = @parent.children.last
    end
    if !@haml_comment && !flat? && @next_line.tabs - @line.tabs > 1
      raise SyntaxError.new(Error.message(:deeper_indenting, @next_line.tabs - @line.tabs), @next_line.index)
    end
    @line = @next_line
  end
  # Close all the open tags
  close until @parent.type == :root
  @root
rescue Haml::Error => e
  e.backtrace.unshift "#{@options[:filename]}:#{(e.line ? e.line + 1 : @index) + @options[:line] - 1}"
  raise
end