anchor.diff:  code_value_level({_,Row,Col}) -> {code_value,Row,Col}.
   code_statement_level({_,Row,Col}) -> {code_statement,Row,Col}.
   
  -% TODO: change this implementation for calculate operations
  -add_op('end', [{op,Content}|Parsed]) ->
  -    [{op,lists:reverse(Content)}|Parsed];
  +add_op('end', [{op,Content}]) ->
  +    solve(Content);
   add_op(Add, [{op,Content}|Parsed]) ->
       [{op,[Add|Content]}|Parsed];
   add_op(Add, Parsed) ->
       [{op,[Add]}|Parsed].
  +
  +precedence0(S) -> precedence(ephp_string:to_lower(S)).
   
   %% took from http://php.net/manual/en/language.operators.precedence.php
   
  
positive.code:     comment_line(Rest, Pos, Parsed);
  code(<<"/*",Rest/binary>>, Pos, Parsed) ->
      comment_block(Rest, Pos, Parsed);
  code(<<Space:1/binary,Rest/binary>>, Pos, Parsed) when ?IS_SPACE(Space) ->
      code(Rest, add_pos(Pos,1), Parsed);
  code(<<NewLine:1/binary,Rest/binary>>, Pos, Parsed) when ?IS_NEWLINE(NewLine) ->
  
negative.code: document(<<>>, Pos, Parsed) ->
      {<<>>, Pos, Parsed};
  document(<<"<?php",Rest/binary>>, Pos, Parsed) ->
      {Rest0,Pos0,NParsed} = code(Rest, add_pos(Pos,5), Parsed),
      {Rest0,Pos0,[add_line(#eval{statements=NParsed},Pos)]};
  document(<<"<?=",Rest/binary>>, Pos, Parsed) ->
      code_value(Rest, code_value_level(add_pos(Pos,3)), Parsed);
  document(<<"<?",Rest/binary>>, Pos, Parsed) ->
      %% TODO: if short is not permitted, use as text
      {Rest0,Pos0,NParsed} = code(Rest, add_pos(Pos,2), Parsed),
      {Rest0,Pos0,[add_line(#eval{statements=NParsed},Pos)]};
  document(<<"\n",Rest/binary>>, Pos, Parsed) ->
      document(Rest, new_line(Pos), add_to_text(<<"\n">>, Pos, Parsed));
  document(<<L:1/binary,Rest/binary>>, Pos, Parsed) ->
  