anchor.diff:  %% the rest of whatever is there.  Skips indent/outdent if currently processing
   %% attributes.
   parse_line(Dents, CStack, Line) ->
  -	case get(in_attributes) of
  -		true ->
  -			{CStack, parse_inner(Line)};
  -		false ->
  -			do_parse_line(Dents, CStack, Line)
  +	StartingInAttributes = get(in_attributes),
  +	ParsedLine = parse_inner(Line),
  +	case ParsedLine of
  +		[] ->
  +			{CStack, []};
  +		_ ->
  +			case StartingInAttributes of
  +				true ->
  +					{CStack, ParsedLine};
  +				false ->
  +					do_parse_line(Dents, CStack, ParsedLine)
  +			end
   	end.
  -do_parse_line(Dents, [NLast | _] = CStack, Line) when Dents == NLast ->
  -	{CStack, parse_inner(Line)};
  -do_parse_line(Dents, [NLast | _] = CStack, Line) when Dents > NLast ->
  -	{[Dents | CStack], [parse_inner(Line), {indent, get(line_num)}]};
  -do_parse_line(Dents, CStack, Line) ->
  +do_parse_line(Dents, [NLast | _] = CStack, PLine) when Dents == NLast ->
  +	{CStack, PLine};
  +do_parse_line(Dents, [NLast | _] = CStack, PLine) when Dents > NLast ->
  +	{[Dents | CStack], [PLine, {indent, get(line_num)}]};
  +do_parse_line(Dents, CStack, PLine) ->
   	{NewStack, DentTokens} = do_dedent(Dents, CStack, []),
  -	{NewStack, [parse_inner(Line), DentTokens]}.
  +	{NewStack, [PLine, DentTokens]}.
   
   %% Pops indents off the stack until it matches the current indent- issuing a
   %% "dedent" for each one.
  
positive.code: 
  -module(zml_tokenizer).
  
  
  -compile(export_all).
  
  
  parse_file(Filename) when is_list(Filename) ->
  
negative.code: 	end;
  
  % Begin escaping a character
  parse_inner([?T_ESC | T], _, CurrTAcc, AllTAcc) ->
  	parse_inner(T, ?T_ESC, CurrTAcc, AllTAcc);
  
  % Escaped characters always get added to current token
  % Adding "nothing" as last character ensures you can do
  % "\|# this is not a comment #|" etc.
  parse_inner([Any | T], ?T_ESC, CurrTAcc, AllTAcc) ->
  	parse_inner(T, nothing, [Any | CurrTAcc], AllTAcc);
  
  % String started
  
  % Multi-line comment started
  
  % Inline comment started
  parse_inner([?T_IGN_INL_2 | _T], ?T_IGN_INL_1, CurrTAcc, AllTAcc) ->
  	case CurrTAcc of
  		[?T_IGN_INL_1] ->
  			AllTAcc;
  		[?T_IGN_INL_1 | Earlier]  ->
  			[{{word, lists:reverse(Earlier)}, get(line_num)} | AllTAcc]
  	end;
  
  % Flush current token and start w/ attributes
  parse_inner([?T_ATTR_ST | T], _Last, CurrTAcc, AllTAcc) ->
  	put(in_attributes, true),
  	case CurrTAcc of
  		[] ->
  			parse_inner(T, ?T_ATTR_ST, [],
  				[{start_attrs, get(line_num)} | AllTAcc]);
  		_ ->
  			parse_inner(T, ?T_ATTR_ST, [],
  				[[{start_attrs, get(line_num)},
  				  {{word, lists:reverse(CurrTAcc)}, get(line_num)}] | AllTAcc])
  	end;
  % Flush current token and finish attributes
  parse_inner([?T_ATTR_EN | T], _Last, CurrTAcc, AllTAcc) ->
  	put(in_attributes, false),
  	case CurrTAcc of
  		[] ->
  			parse_inner(T, ?T_ATTR_EN, [],
  				[{finish_attrs, get(line_num)} | AllTAcc]);
  		_ ->
  			parse_inner(T, ?T_ATTR_EN, [],
  				[[{finish_attrs, get(line_num)},
  				  {{word, lists:reverse(CurrTAcc)}, get(line_num)}] | AllTAcc])
  	end;
  
  % Whitespace.  Flush token.
  parse_inner([H | T], _Last, CurrTAcc, AllTAcc) when
  		((H >= $\x{0009}) and (H =< $\x{000D}))
  		or (H == $\x{0020}) or (H == $\x{00A0}) ->
  	case CurrTAcc of
  		[] ->
  			parse_inner(T, H, [], AllTAcc);
  		_ ->
  			parse_inner(T, H, [],
  				[{{word, lists:reverse(CurrTAcc)}, get(line_num)} | AllTAcc])
  	end;
  
  parse_inner([H | T], _Last, CurrTAcc, AllTAcc) ->
  	parse_inner(T, H, [H | CurrTAcc], AllTAcc).
  
  
  
  