2016-08-08 8 views
2

私は、Python文法がreturn文を関数の外に出せるようになっていることに気付きましたが、私は文法を指定できるので、これは許されないと信じています。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] 

また、インタプリタは、構文エラー(関数外の「リターン」)としてこれを報告しますが、これがない場合はどのように、それを検出パーサすることができます文法で指定されていますか?

+2

私はこれまで聞いたことがありませんが、あなたの例では、関数の外にreturn文がありますか? – Julien

+0

さて、この文法から、私たちは:single_input => simple_stmt => small_stmt NEWLINE => flow_stmt NEWLINE => return_stmt NEWLINE => 'NEWLINE'を返します。 single_inputは文法の開始記号である(これはPythonのドキュメントで言及されているように)これを持っている。 –

答えて

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"); 

あなたが見ることができるように、言語の意味論のみ、その文法で定義されていません。

+0

もちろん、セマンティクスは文法によってのみ定義されているわけではありませんが、それにもかかわらず、この場合は可能です。または私は間違っていますか? –

+1

文法で定義することはできますが、複雑になります(関数定義も文であるため) – napuzba

関連する問題