2016-08-08 15 views
2

Ich habe festgestellt, dass Python-Grammatik ermöglicht Rückkehr Anweisung außerhalb der Funktion erscheinen, aber ich verstehe wirklich nicht, warum? Ich glaube, dass man Grammatik so spezifizieren kann, dass dies nicht erlaubt wäre. Python Grammatik Ende "Rückkehr außerhalb der Funktion"

Dies ist ein Stück von Python Grammatik, die dieses ermöglicht:

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] 

Auch die Dolmetscher Berichte diese als Syntaxfehler (‚return‘ außerhalb Funktion), aber wie kann es Parser erkennen, wenn dies nicht der Fall ist in der Grammatik angegeben?

+2

Ich habe noch nie davon gehört, aber wo in Ihrem Beispiel gibt es eine Return-Anweisung außerhalb einer Funktion? – Julien

+0

Nun, aus dieser Grammatik haben wir: single_input => simple_stmt => small_stmt NEWLINE => flow_stmt NEWLINE => return_stmt NEWLINE => 'return' NEWLINE. Da single_input ein Startsymbol für die Grammatik ist (wie es in Python-Dokumenten erwähnt wird), haben wir dies. –

Antwort

4

Zuerst baut der Unterbrecher den AST-Baum. Wenn es dann Code für Basisblöcke generiert, indem es den AST-Baum besucht, überprüft es, dass sich die Rückgabeanweisung in einer Funktion befindet.

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

Wie Sie wird nur durch seine Grammatik nicht definiert ist, die Semantik der Sprache sehen.

+0

Sie haben natürlich Recht, dass Semantik nicht nur durch die Grammatik definiert ist, aber dennoch ist es seltsam, da es in diesem Fall könnte. Oder liege ich falsch? –

+1

Sie können es in der Grammatik definieren - aber es wird komplizierter (da die Funktionsdefinition auch eine Anweisung ist) – napuzba