anchor.diff:      st_else(Rest, add_pos(Pos,1), Parsed);
   st_else(<<SP:1/binary,Rest/binary>>, Pos, Parsed) when ?IS_NEWLINE(SP) ->
       st_else(Rest, new_line(Pos), Parsed);
  -st_else(Rest0, Pos0, [#st_if{}=If|Parsed]) ->
  -    {Rest1, Pos1, CodeBlock} = code_block(Rest0, Pos0, []),
  -    IfWithElse = If#st_if{else=CodeBlock},
  -    code(Rest1, Pos1, [IfWithElse|Parsed]);
  +st_else(Rest0, {Level,_,_}=Pos0, [#if_block{}=If|Parsed]) ->
  +    {Rest1, {_,Row1,Col1}, CodeBlock} = code_block(Rest0, add_pos(Pos0,4), []),
  +    IfWithElse = If#if_block{false_block=CodeBlock},
  +    code(Rest1, {Level,Row1,Col1}, [IfWithElse|Parsed]);
   st_else(<<>>, Pos, _Parsed) ->
       throw({error, {parse, Pos, incomplete_else_statement}}).
   
  
positive.code: %% helper functions
  %%------------------------------------------------------------------------------
  
  add_to_text(L, _Pos, [#text{content=Text}=T|Parsed]) ->
      NewText = <<Text/binary, L/binary>>,
      [T#text{content=NewText}|Parsed];
  add_to_text(L, {_Level,Row,Col}, Parsed) ->
      [#text{content=L, row=Row, col=Col}|Parsed].
  
  add_pos({Level,Row,Col}, Offset) ->
      {Level,Row,Col+Offset}.
  
negative.code: -module(ephp_parser).
  -compile([export_all]).
  
  -include("ephp.hrl").
  
  -define(IS_SPACE(X),
      erlang:'or'(X =:= <<" ">>,
                  erlang:'or'(X =:= <<"\t">>,
                              X =:= <<"\r">>)
                 )
  ).
  -define(IS_NEWLINE(X),
      X =:= <<"\n">>
  ).
  -define(IS_NUMBER(X),
      erlang:'and'(X >= $0, X =< $9)
  ).
  -define(IS_ALPHA(X),
      erlang:'or'(
          erlang:'and'(X >= $A, X =< $Z),
          erlang:'and'(X >= $a, X =< $z)
      )
  ).
  -define(OR(I,X,Y), erlang:'or'(I =:= X,I =:= Y)).
  -define(IS_OP1(X),
      X =:= <<126>> orelse
      X =:= <<"@">> orelse
      X =:= <<"!">> orelse
      X =:= <<"*">> orelse
      X =:= <<"/">> orelse
      X =:= <<"%">> orelse
      X =:= <<"+">> orelse
      X =:= <<"-">> orelse
      X =:= <<".">> orelse
      X =:= <<"<">> orelse
      X =:= <<">">> orelse
      X =:= <<"&">> orelse
      X =:= <<"^">> orelse
      X =:= <<"|">>
  ).
  -define(IS_OP2(X),
      X =:= <<"**">> orelse
      X =:= <<"++">> orelse
      X =:= <<"--">> orelse
      X =:= <<"<<">> orelse
      X =:= <<">>">> orelse
      X =:= <<"<=">> orelse
      X =:= <<">=">> orelse
      X =:= <<"==">> orelse
      X =:= <<"!=">> orelse
      X =:= <<"<>">> orelse
      X =:= <<"&&">> orelse
      X =:= <<"||">> orelse
      X =:= <<"??">> orelse
      X =:= <<"+=">> orelse
      X =:= <<"-=">> orelse
      X =:= <<"*=">> orelse
      X =:= <<"/=">> orelse
      X =:= <<".=">> orelse
      X =:= <<"%=">> orelse
      X =:= <<"&=">> orelse
      X =:= <<"|=">> orelse
      X =:= <<"^=">> orelse
      X =:= <<"or">> orelse X =:= <<"OR">> orelse
      X =:= <<"Or">> orelse X =:= <<"oR">>
  ).
  -define(IS_OP3(X),
      X =:= <<"===">> orelse
      X =:= <<"!==">> orelse
      X =:= <<"<=>">> orelse
      X =:= <<"**=">> orelse
      X =:= <<"<<=">> orelse
      X =:= <<">>=">> orelse
      X =:= <<"and">> orelse X =:= <<"And">> orelse X =:= <<"aNd">> orelse
      X =:= <<"ANd">> orelse X =:= <<"anD">> orelse X =:= <<"AnD">> orelse
      X =:= <<"aND">> orelse X =:= <<"AND">> orelse
      X =:= <<"xor">> orelse X =:= <<"Xor">> orelse X =:= <<"xOr">> orelse
      X =:= <<"XOr">> orelse X =:= <<"xoR">> orelse X =:= <<"XoR">> orelse
      X =:= <<"xOR">> orelse X =:= <<"XOR">>
  ).
  
  parse(Document) ->
  