class RDoc::Markup::Parser

def parse(parent, indent = 0)

def parse(parent, indent = 0)
  p :parse_start => indent if @debug
  until @tokens.empty? do
    type, data, column, = get
    case type
    when :BREAK then
      parent << RDoc::Markup::BlankLine.new
      skip :NEWLINE, false
      next
    when :NEWLINE then
      # trailing newlines are skipped below, so this is a blank line
      parent << RDoc::Markup::BlankLine.new
      skip :NEWLINE, false
      next
    end
    # indentation change: break or verbatim
    if column < indent then
      unget
      break
    elsif column > indent then
      unget
      parent << build_verbatim(indent)
      next
    end
    # indentation is the same
    case type
    when :HEADER then
      parent << build_heading(data)
    when :RULE then
      parent << RDoc::Markup::Rule.new(data)
      skip :NEWLINE
    when :TEXT then
      unget
      parse_text parent, indent
    when :BLOCKQUOTE then
      nil while (type, = get; type) and type != :NEWLINE
      _, _, column, = peek_token
      bq = RDoc::Markup::BlockQuote.new
      p :blockquote_start => [data, column] if @debug
      parse bq, column
      p :blockquote_end => indent if @debug
      parent << bq
    when *LIST_TOKENS then
      unget
      parent << build_list(indent)
    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
  parent
end