Python语法结束"返回外部函数"

时间:2016-08-08 11:25:38

标签: python parsing ebnf

我注意到Python语法允许返回语句出现在函数外部,但我真的不明白,为什么?我相信可以指定语法,这是不允许的。

这是Python语法的一部分,它允许:

single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
             import_stmt | global_stmt | nonlocal_stmt | assert_stmt)
flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
return_stmt: 'return' [testlist]

此外,解释器将此报告为语法错误('返回'外部函数),但解析器如何检测它,如果在语法中没有指定?

1 个答案:

答案 0 :(得分:4)

首先,中断器构建AST树。然后,当它通过访问AST树生成基本块的代码时,它验证return语句是否在函数内。

compiler_visit_stmt(struct compiler *c, stmt_ty s)
    ...
    switch (s->kind) {
        ...
        case Return_kind:
            if (c->u->u_ste->ste_type != FunctionBlock)
                return compiler_error(c, "'return' outside function");

正如您所看到的,语言的语义不仅仅由其语法定义。