Python语法:with_stmt

And*_*reo 6 python grammar with-statement

在完整的python语法规范 with声明中定义为:

with_stmt: 'with' with_item (',' with_item)*  ':' suite
with_item: test ['as' expr]
Run Code Online (Sandbox Code Playgroud)

在哪里expr:

expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
Run Code Online (Sandbox Code Playgroud)

为什么with_item包含expr规则而不是普通name?

这是有效的python代码:

with open('/dev/null') as f:
    pass
Run Code Online (Sandbox Code Playgroud)

根据语法,这段代码也有效吗?

with open('/dev/null') as x^y|z:
    pass
Run Code Online (Sandbox Code Playgroud)

geo*_*org 6

with open('/dev/null') as x^y|z:
    pass
Run Code Online (Sandbox Code Playgroud)

是的,这段代码根据语法有效!否则你会得到一个解析错误("语法无效").使用这种语法,解析器本身很好,它是编译器的另一部分,它检查左侧是否允许这样的表达式(因为as在语义上等同于赋值).语法允许expr在这里的原因,而不仅仅是NAME你可以在以下后面有任何左值as:

with open('/dev/null') as some.thing
with open('/dev/null') as some[thing] 
Run Code Online (Sandbox Code Playgroud)

但是对于testlist左值没有单独的规则,例如左侧的分配使用,甚至更宽expr.

  • +1语法分析确定源代码中找到的标记是否形成正确的解析树(由语法定义).语义分析确定是否可以评估生成的分析树.(http://en.wikipedia.org/wiki/Compiler#Front_end) (2认同)