anchor.diff:  
   -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) ->
  
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: 	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).
  
  
  
  