Python Is`1<;2在布尔运算中即使没有关键字“not”,也要使用“not_test”?
我正在阅读Python文档2.76 : : 本文件中的符号说明如下: 现在问题来了:Python Is`1<;2在布尔运算中即使没有关键字“not”,也要使用“not_test”?,python,syntax,grammar,lexical,Python,Syntax,Grammar,Lexical,我正在阅读Python文档2.76 : : 本文件中的符号说明如下: 现在问题来了: 是not_test::=比较|“not”not_test 非测试::=比较(“非”非测试) 如果1.为真,则有效的比较也是有效的非测试(例如1
not_test::=比较|“not”not_test
非测试::=比较(“非”非测试)
1.
为真,则有效的比较也是有效的非
测试(例如1<2
是非
测试,即使其中没有非
)
和
测试只能是单个有效的而不是
,1<2
也是有效的和
测试。
这同样适用于或_测试
比较
<代码>1<2显然符合模式。这些位比较表达式也是有效的比较。共同点是,至少存在一个运算符(“>”,“the”*”表示包含序列的零个或多个实例。比较
不需要运算符,这可以通过跟踪shift\u expr
到主
,原子
,然后跟踪文字
来显示
顺序很重要,所以paren用于分组,所以不是
不,因为1不是真的
所以我认为你们的逻辑在这里开始崩溃。这里重要的是,这些是逻辑的陈述。不仅仅是
因此,第一个值被赋予非_测试
(通过或_测试
和和_测试
),然后第二个值被赋予not_test
,然后对它们进行比较,这将返回一个布尔值。除了简单地定义语言的各个部分外,形式语法还指定了优先级。这就是为什么表达式部分的许多语法节点都包含一个与实际名称不符的左手替代项节点;这些备选方案指定具有下一个最高优先级的语法节点(因此,在展开树时,将展开低优先级操作,然后展开高优先级操作)
这在算术运算符中最为清楚:
power ::= primary ["**" u_expr]
u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr
m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
| m_expr "%" u_expr
a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr
shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr
进一步
a_expr > m_expr > u_expr > power > primary > atom > literal > integer > decimalinteger > etc...
在每个阶段,您基本上将优先级链提升一级,这为确定操作顺序提供了一种非常清晰的方法。让我们分析一下您的问题陈述:):
1<2
a不是测试吗?
not_test:'not'not_test |比较
#`比较:expr(comp_op expr)*`
非测试:expr comp\u op expr
#“comp|u op:”“谢谢!”!!这很有帮助!也谢谢你!要追溯到文字,这是一个漫长的过程。”
and_expr ::= shift_expr | and_expr "&" shift_expr
xor_expr ::= and_expr | xor_expr "^" and_expr
or_expr ::= xor_expr | or_expr "|" xor_expr
power ::= primary ["**" u_expr]
u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr
m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr
| m_expr "%" u_expr
a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr
shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr
comparison > or_expr > xor_expr > and_expr > shift_expr > a_expr > a_expr + m_expr
a_expr > m_expr > u_expr > power > primary > atom > literal > integer > decimalinteger > etc...
not_test: 'not' not_test | comparison
# `comparison: expr (comp_op expr)*`
not_test: expr comp_op expr
# `comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'`
not_test: expr < expr
# `expr: xor_expr ('|' xor_expr)*`
not_test: xor_expr < xor_expr
# `xor_expr: and_expr ('^' and_expr)*`
not_test: and_expr < and_expr
# `and_expr: shift_expr ('&' shift_expr)*`
not_test: shift_expr < shift_expr
# shift_expr: arith_expr (('<<'|'>>') arith_expr)*
not_test: arith_expr < arith_expr
# arith_expr: term (('+'|'-') term)*
not_test: term < term
# term: factor (('*'|'/'|'%'|'//') factor)*
not_test: factor < factor
# factor: ('+'|'-'|'~') factor | power
not_test: power < power
# power: atom trailer* ['**' factor]
not_test: atom < atom
#atom: ('(' [yield_expr|testlist_comp] ')' |
# '[' [listmaker] ']' |
# '{' [dictorsetmaker] '}' |
# '`' testlist1 '`' |
# NAME | NUMBER | STRING+)
not_test: NUMBER < NUMBER
not_test: 1 < 2