anchor.diff:  	end;
   
   % Begin escaping a character
  -parse_inner([$\\ | T], false, CurrTAcc, AllTAcc) ->
  -	parse_inner(T, true, CurrTAcc, AllTAcc);
  +parse_inner([?T_ESC | T], _, CurrTAcc, AllTAcc) ->
  +	parse_inner(T, ?T_ESC, CurrTAcc, AllTAcc);
   
   % Escaped characters always get added to current token
  -parse_inner([Any | T], true, CurrTAcc, AllTAcc) ->
  -	parse_inner(T, false, [Any | CurrTAcc], AllTAcc);
  +% 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], false, CurrTAcc, AllTAcc) ->
  +parse_inner([?T_ATTR_ST | T], _Last, CurrTAcc, AllTAcc) ->
   	put(in_attributes, true),
   	case CurrTAcc of
   		[] ->
  -			parse_inner(T, false, [],
  +			parse_inner(T, ?T_ATTR_ST, [],
   				[{start_attrs, get(line_num)} | AllTAcc]);
   		_ ->
  -			parse_inner(T, false, [],
  +			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], false, CurrTAcc, AllTAcc) ->
  +parse_inner([?T_ATTR_EN | T], _Last, CurrTAcc, AllTAcc) ->
   	put(in_attributes, false),
   	case CurrTAcc of
   		[] ->
  -			parse_inner(T, false, [],
  +			parse_inner(T, ?T_ATTR_EN, [],
   				[{finish_attrs, get(line_num)} | AllTAcc]);
   		_ ->
  -			parse_inner(T, false, [],
  +			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], false, CurrTAcc, AllTAcc) when
  +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, false, [], AllTAcc);
  -		_ ->
  -			parse_inner(T, false, [],
  +			parse_inner(T, H, [], AllTAcc);
  +		_ ->
  +			parse_inner(T, H, [],
   				[{{word, lists:reverse(CurrTAcc)}, get(line_num)} | AllTAcc])
   	end;
   
  -parse_inner([H | T], false, CurrTAcc, AllTAcc) ->
  -	parse_inner(T, false, [H | CurrTAcc], AllTAcc).
  +parse_inner([H | T], _Last, CurrTAcc, AllTAcc) ->
  +	parse_inner(T, H, [H | CurrTAcc], AllTAcc).
   
   
   
  
positive.code: 
  
  parse_inner(Line) ->
  	parse_inner(Line, false, [], []).
  
  %%
  %% parse_inner(CurrString, IsEscaped, CurrentTokenAcc, AllTokenAcc)
  %%
  
  % String is finished.  Flush token and return results.
  parse_inner([], _, CurrTAcc, AllTAcc) ->
  	case CurrTAcc of
  		[] ->
  
negative.code: 
  -module(zml_tokenizer).
  
  -compile(export_all).
  
  
  -define(T_ATTR_ST, $().
  -define(T_ATTR_EN, $)).
  -define(T_ESC, $\\).
  
  -define(T_IGN_INL_1, $|).
  -define(T_IGN_INL_2, $|).
  
  -define(T_COMMENT_MULTI_ST_1, $|).
  -define(T_COMMENT_MULTI_ST_2, $#).
  -define(T_COMMENT_MULTI_EN_1, $#).
  -define(T_COMMENT_MULTI_EN_2, $|).
  
  -define(T_STRING_TYPE1, 34). % dbl-quote
  -define(T_STRING_TYPE2, 39). % single-quote
  
  -define(T_STRING_MULTI_ST_1, $|).
  -define(T_STRING_MULTI_ST_2, 34).
  -define(T_STRING_MULTI_EN_1, 34).
  -define(T_STRING_MULTI_EN_2, $|).
  
  
  parse_file(Filename) when is_list(Filename) ->
  