class RDoc::Markup::Parser

def parse indent = 0

def parse indent = 0
  p :parse_start => indent if @debug
  document = []
  until @tokens.empty? do
    type, data, column, = get
    if type != :INDENT and column < indent then
      unget
      break
    end
    case type
    when :HEADER then
      document << build_heading(data)
    when :INDENT then
      if indent > data then
        unget
        break
      elsif indent == data then
        next
      end
      unget
      document << build_verbatim(indent)
    when :NEWLINE then
      document << RDoc::Markup::BlankLine.new
      skip :NEWLINE, false
    when :RULE then
      document << RDoc::Markup::Rule.new(data)
      skip :NEWLINE
    when :TEXT then
      unget
      document << build_paragraph(indent)
      # we're done with this paragraph (indent mismatch)
      break if peek_token[0] == :TEXT
    when *LIST_TOKENS then
      unget
      list = build_list(indent)
      document << list if list
      # we're done with this list (indent mismatch)
      break if LIST_TOKENS.include? peek_token.first and indent > 0
    else
      type, data, column, line = @current_token
      raise ParseError,
            "Unhandled token #{type} (#{data.inspect}) at #{line}:#{column}"
    end
  end
  p :parse_end => indent if @debug
  document
end