Ответ 1
Идентификаторы в python описываются как:
identifier ::= (letter|"_") (letter | digit | "_")*
Следовательно, 2if
не может быть идентификатором, следовательно, если должно быть 2
, if
. Аналогичная логика применяется к остальной части выражения.
В основном интерпретация 2if-1e1else 1
будет выглядеть примерно так (полный анализ будет довольно сложным):
2if
Недействительный идентификатор, 2
соответствует значению digit ::= "0"..."9"
, if
соответствует ключевому слову.
-1e1else
, -1
- это унарное отрицание (u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr
) : (1
, которое соответствует intpart
в exponentfloat ::= (intpart | pointfloat) | exponent
, e1
является экспонентой exponent ::= ("e" | "E") ["+" | "-"] digit+
.) Вы можете видеть, что выражения формы Ne+|-x
дают поплавок из:
>>> type(2e3)
<type 'float'>
тогда else
рассматривается как ключевое слово, а -1
и т.д.
Вы можете прочитать гаммар, чтобы узнать больше об этом.