anchor.diff:  number(Rest, Pos, [#float{float=N}=F]) ->
       {Rest, Pos, [F#float{float=binary_to_float(N)}]}.
   
  -constant(<<A:8,Rest/binary>>, {_,Row,Col}=Pos, []) when ?IS_ALPHA(A) ->
  -    constant(Rest, add_pos(Pos,1), [#constant{name = <<A:8>>, line={Row,Col}}]);
  +constant(<<A:8,Rest/binary>>, Pos, []) when ?IS_ALPHA(A) ->
  +    constant(Rest, add_pos(Pos,1), [add_line(#constant{name = <<A:8>>},Pos)]);
   constant(<<A:8,Rest/binary>>, Pos, [#constant{name=N}=C])
           when ?IS_ALPHA(A) orelse ?IS_NUMBER(A) orelse A =:= $_ ->
       constant(Rest, add_pos(Pos,1), [C#constant{name = <<N/binary, A:8>>}]);
   constant(Rest, Pos, Parsed) ->
       {Rest, Pos, Parsed}.
   
  -string(<<"\"",Rest/binary>>, {_,Row,Col}=Pos, []) ->
  -    string_parsed(Rest, Pos, [#text_to_process{text = [], line={Row,Col}}]);
  -string(<<"'",Rest/binary>>, {_,Row,Col}=Pos, []) ->
  -    string_fixed(Rest, Pos, [#text{text = <<>>, line={Row,Col}}]).
  +string(<<"\"",Rest/binary>>, Pos, []) ->
  +    string_parsed(Rest, Pos, [add_line(#text_to_process{text=[]}, Pos)]);
  +string(<<"'",Rest/binary>>, Pos, []) ->
  +    string_fixed(Rest, Pos, [add_line(#text{text = <<>>}, Pos)]);
  +string(<<"<<<'",Rest/binary>>, {Level,Row,_}=Pos, []) ->
  +    [W,Rest0] = binary:split(Rest, <<"'">>),
  +    [Text,Rest1] = binary:split(Rest0, <<"\n", W/binary, ";">>),
  +    NPos = {Level,Row+length(binary:matches(Text,<<"\n">>)),1},
  +    {Rest1, add_pos(NPos,byte_size(W)+1), [add_line(#text{text=Text}, Pos)]};
  +string(<<"<<<",Rest/binary>>, {Level,Row,_}=Pos, []) ->
  +    [W,Rest0] = binary:split(Rest, <<"\n">>),
  +    [Text,Rest1] = binary:split(Rest0, <<"\n", W/binary, ";">>),
  +    NPos = {Level,Row+length(binary:matches(Text,<<"\n">>)),1},
  +    %% TODO parse Text for variables
  +    {Rest1, add_pos(NPos,byte_size(W)+1), [add_line(#text{text=Text}, Pos)]}.
   
   string_fixed(<<"\\\\",Rest/binary>>, Pos, [#text{text=C}=S]) ->
       string_fixed(Rest, add_pos(Pos,1), [S#text{text = <<C/binary, "\\\\">>}]);
  
positive.code: code(<<_/utf8,_>> = Text, Pos, _) ->
      throw({error, {parse, Pos, sample_text(Text)}}).
  
  code_value(Text, {_Level,Row,Col}=Pos, Parsed) ->
      {Rest, NewPos, Code} = code(Text, code_value_level(Pos), []),
      document(Rest, NewPos, [#print{expression=Code,line={Row,Col}}|Parsed]).
  
  code_block(<<"{",Rest/binary>>, Pos, Parsed) ->
      code(Rest, code_block_level(add_pos(Pos,1)), Parsed);
  
negative.code: variable(Rest, Pos, Parsed) ->
      {Rest, Pos, Parsed}.
  
  number(<<A:8,Rest/binary>>, Pos, []) when ?IS_NUMBER(A) ->
      number(Rest, add_pos(Pos,1), [add_line(#int{int = <<A:8>>}, Pos)]);
  number(<<A:8,Rest/binary>>, Pos, [#int{int=N}=I]) when ?IS_NUMBER(A) ->
      number(Rest, add_pos(Pos,1), [I#int{int = <<N/binary,A:8>>}]);
  number(<<".",Rest/binary>>, Pos, [#int{int=N,line=Line}]) ->
  