anchor.diff:      tokenize_doctype(Rest, ?ADV_COL(S, 10), []);
   tokenize("<![CDATA[" ++ Rest, S) ->
       tokenize_cdata(Rest, ?ADV_COL(S, 9), []);
  +tokenize("<?" ++ Rest, S) ->
  +    {Tag, Rest1, S1} = tokenize_literal(Rest, ?ADV_COL(S, 2), []),
  +    {Attrs, Rest2, S2} = tokenize_attributes(Rest1, S1, []),
  +    {Rest3, S3} = find_qgt(Rest2, S2),
  +    {{pi, Tag, Attrs}, Rest3, S3};
   tokenize("&" ++ Rest, S) ->
       tokenize_charref(Rest, ?INC_COL(S), []);
   tokenize("</" ++ Rest, S) ->
  
positive.code:     {lists:reverse(Acc), [], S};
  tokenize_attributes(Rest=">" ++ _, S, Acc) ->
      {lists:reverse(Acc), Rest, S};
  tokenize_attributes(Rest="/" ++ _, S, Acc) ->
      {lists:reverse(Acc), Rest, S};
  tokenize_attributes([C | Rest], S, Acc) when ?IS_WHITESPACE(C) ->
  
negative.code: %% @spec parse_tokens([html_token()]) -> html_node()
  %% @doc Transform the output of tokens(Doc) into a HTML tree.
  parse_tokens(Tokens) when is_list(Tokens) ->
      %% Skip over doctype, processing instructions
      F = fun (X) ->
                  case X of
                      {start_tag, _, _, false} ->
  