ややくどい解説をしておきますか・・・

'}'トークンが抽出されない限り、bison側のルールにあるstatementが還元されません(syntaxエラーになる)。
'}'トークンが抽出されるためには、flex側のルールにある#L1904-L1910行目を通る必要があるのですが、状態がST_IN_SCRIPTINGでないといけません。
BEGIN(ST_IN_SCRIPTING)
されてないといけないわけです。
ではそのようなトークンを抽出しているのは?と見ると、INITIAL状態から抽出してるのは、#L2214-L2304行目あたりになります。

今回エラーになってるのは後ろにホワイトスペースがないケースなので、#L2230行目からですね。
デフォルトでphpのショートタグは有効なので、例えば
<?php if(true){?>
<?php}

<?php if(true){?>
<? php}
と解釈され、
<?php if(true){?>
<?php php}
こう書いたのと同じ結果になります。例えば
<?php if(true){?>
<?phpinfo();}
ならエラーは起きないわけです。

te2jiさんとkei344さんが面白がっているのは、普通に空白がないからエラーというわけじゃない理由を探すためのパズルを解いてるからです。
答えは二人の予想どおり「ショートタグとして解釈しようとしてるから」でしたが、私がやったのは正解を見て詰まらない解説をしただけですね。