anchor.diff:              args(Rest0, Pos0, Args ++ [Arg])
       end.
   
  +st_foreach(<<SP:8,Rest/binary>>, Pos, Parsed) when ?IS_SPACE(SP) ->
  +    st_foreach(Rest, add_pos(Pos,1), Parsed);
  +st_foreach(<<SP:8,Rest/binary>>, Pos, Parsed) when ?IS_NEWLINE(SP) ->
  +    st_foreach(Rest, new_line(Pos), Parsed);
  +st_foreach(<<"(",Rest/binary>>, Pos, Parsed) ->
  +    {Rest0, Pos0, Var} = variable(Rest, Pos, []),
  +    {<<AS:2/binary,Rest1/binary>>, Pos1} = remove_spaces(Rest0, Pos0),
  +    <<"as">> = ephp_string:to_lower(AS),
  +    NewPos = array_def_level(add_pos(Pos1,2)),
  +    {<<")",Rest2/binary>>, Pos2, Exp} = expression(Rest1, NewPos, []),
  +    {Rest3, Pos3, CodeBlock} = code_block(Rest2, add_pos(Pos2,1), []),
  +    RawFor = add_line(#foreach{
  +        iter=Exp,
  +        elements=Var,
  +        loop_block=CodeBlock
  +    }, Pos),
  +    For = case Exp of
  +        #variable{} ->
  +            RawFor;
  +        [KIter,Iter] ->
  +            RawFor#foreach{kiter=KIter, iter=Iter}
  +    end,
  +    {Rest3, copy_level(Pos, Pos3), [For|Parsed]}.
  +
  +
   st_for(<<SP:8,Rest/binary>>, Pos, Parsed) when ?IS_SPACE(SP) ->
       st_for(Rest, add_pos(Pos,1), Parsed);
   st_for(<<SP:8,Rest/binary>>, Pos, Parsed) when ?IS_NEWLINE(SP) ->
  
positive.code: add_line(#array_element{}=A, {_,R,C}) ->
      A#array_element{line={{line,R},{column,C}}};
  add_line(#for{}=F, {_,R,C}) -> F#for{line={{line,R},{column,C}}};
  add_line(#operation{}=O, {_,R,C}) -> O#operation{line={{line,R},{column,C}}};
  add_line(#concat{}=O, {_,R,C}) -> O#concat{line={{line,R},{column,C}}};
  add_line(#while{}=W, {_,R,C}) -> W#while{line={{line,R},{column,C}}}.
  
negative.code: expression(<<>>, Pos, _Parsed) ->
      throw_error(eparse, Pos, <<>>).
  
  variable(<<SP:8,Rest/binary>>, Pos, []) when ?IS_SPACE(SP) ->
      variable(Rest, add_pos(Pos,1), []);
  variable(<<SP:8,Rest/binary>>, Pos, []) when ?IS_NEWLINE(SP) ->
      variable(Rest, new_line(Pos), []);
  variable(<<"$",Rest/binary>>, Pos, []) ->
      variable(Rest, add_pos(Pos,1), []);
  variable(<<A:8,Rest/binary>>, Pos, [])
          when ?IS_ALPHA(A) orelse A =:= $_ orelse A >= 16#7f ->
      Var = add_line(#variable{name = <<A:8>>}, Pos),
  