@ В комментарии oenone упоминается, что GNAT отклоняет x AND THEN y AND z
, но не объясняется почему. В некотором смысле это правда, что and
и and then
имеют одинаковый приоритет, но это еще не все.
Грамматика для выражения:
expression ::=
relation {and relation} | relation {and then relation}
| relation {or relation} | relation {or else relation}
| relation {xor relation}
, где { FOO }
обозначает ноль или более вхождений FOO
.
Эта грамматика специально разработана для того, чтобы позволить любому из этих операторов или управляющих форм быть объединенными в одно выражение (X and Y and Z
, A and then B and then C
), но запретить их смешивание. Таким образом, выражение в вопросе x AND THEN y AND z
является незаконным, и вопрос о том, что он означает, даже не возникает. Смысл этого правила состоит именно в том, чтобы избежать путаницы в подобных случаях.
Вам просто нужно написать (X and then Y) and Z
или X and then (Y and Z)
, в зависимости от того, что вы хотите сделать.
То же самое относится к смешиванию and
и or
:
X and Y and Z -- legal
X and Y or Z -- ILLEGAL
(X and Y) or Z -- legal
X and (Y or Z) -- legal