私はPythonのドキュメント2.76を読んでいます
or_test ::= and_test | or_test "or" and_test
and_test ::= not_test | and_test "and" not_test
not_test ::= comparison | "not" not_test
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
and_expr ::= shift_expr | and_expr "&" shift_expr
xor_expr ::= and_expr | xor_expr "^" and_expr
or_expr ::= xor_expr | or_expr "|" xor_expr
ドキュメントの表記については、次のとおりです。
垂直バー (|) は、選択肢を区切るために使用されます。これは、この表記法で最も拘束力の低い演算子です。
ここで質問が来ます:
not_test ::= comparison | "not" not_test
のように解析されますnot_test ::= comparison | ("not" not_test)
?1.
が true の場合、有効なcomparison
も有効ですnot_test
。1 < 2
not_test
not
さらに、valid
and_test
は単一の validnot_test
である可能性があるため、1 < 2
validand_test
も同様です。についても同様or_test
です。では、有効な とは何
comparison
ですか?1 < 2
明らかにパターンに適合します。そして、これらのビットごとの比較 expr も有効ですcomparison
。共通しているのは、少なくとも 1 つの演算子 ('>'、'<'、またはビット単位のもの) の存在が必要であることです。(わからない。)ここで奇妙な部分になります。
x and y
たとえば、考えてみましょう。によると
and_test ::= not_test | and_test "and" not_test
and_test ::= not_test | (and_test "and" not_test)
# このように解析されたと思いますか?
が true でx and y
ある場合and_test
( がnot_test
存在するため、 になることはありませんand
)、は valid であるx
必要があり、and_test
これはただ 1 つの valid である可能性がありますnot_test
。そして、あまりにもy
有効でなければなりませnot_test
ん。
Anot_test
は、1 つまたは が前に付いたcomparison
別のいずれかです。したがって、 aは基本的に 0 個以上の s の後に 1 が続きます。ここで重要なのは、 の字句構文です。not_test
not
not_test
not
comparison
comparison
によると4.
、 acomparison
には少なくとも 1 つの演算子が必要です。ただし、これは次の例と競合します。
x = 3、y = 4 を割り当てます。3 and 4
有効なようですand_test
。
しかし、どうすれば有効なの3
かわかりません。どこで私は間違えましたか?4
comparison