anchor.diff:      tree(Rest, append_stack_child(norm({Tag, Attrs}), S));
   tree([{start_tag, Tag, Attrs, false} | Rest], S) ->
       tree(Rest, stack(norm({Tag, Attrs}), S));
  +tree([T={pi, _Tag, _Attrs} | Rest], S) ->
  +    tree(Rest, append_stack_child(T, S));
   tree([T={comment, _Comment} | Rest], S) ->
       tree(Rest, append_stack_child(T, S));
   tree(L=[{data, _Data, _Whitespace} | _], S) ->
  
positive.code:     tokenize_doctype(Rest, ?ADV_COL(S, 10), []);
  tokenize("<![CDATA[" ++ Rest, S) ->
      tokenize_cdata(Rest, ?ADV_COL(S, 9), []);
  tokenize("&" ++ Rest, S) ->
      tokenize_charref(Rest, ?INC_COL(S), []);
  tokenize("</" ++ Rest, S) ->
  
negative.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(Rest="/" ++ _, S, Acc) ->
      {lists:reverse(Acc), Rest, S};
  tokenize_attributes([C | Rest], S, Acc) when ?IS_WHITESPACE(C) ->
  