2014-10-16 15 views
6

Nella dichiarazione full python grammar specificationwith è definito come:Python grammatica: with_stmt

with_stmt: 'with' with_item (',' with_item)* ':' suite 
with_item: test ['as' expr] 

Dove expr è:

expr: xor_expr ('|' xor_expr)* 
xor_expr: and_expr ('^' and_expr)* 
and_expr: shift_expr ('&' shift_expr)* 

Perché with_item contiene expr regola invece di pianura name?

Questo è codice Python valido:

with open('/dev/null') as f: 
    pass 

Secondo la grammatica questo codice è valido anche?

with open('/dev/null') as x^y|z: 
    pass 

risposta

6
with open('/dev/null') as x^y|z: 
    pass 

Sì, questo codice è valido secondo la grammatica! Altrimenti si otterrebbe un errore di analisi ("sintassi non valida"). Il parser corretto va bene con questa sintassi, è un'altra parte del compilatore che controlla che tale espressione non è consentita sul lato sinistro (perché as è semanticamente equivalente all'assegnazione). Il motivo per cui la grammatica permette expr qui, e non solo NAME è che si può avere qualsiasi valore assegnabile dopo as:

with open('/dev/null') as some.thing 
with open('/dev/null') as some[thing] 

ma non c'è regola separata per lvalue, per esempio gli incarichi utilizzano testlist a sinistra, che è ancora più largo di expr.

+2

+1 L'analisi sintattica determina se i token trovati nel codice sorgente formano un albero di analisi corretto (come definito dalla grammatica). L'analisi semantica determina se l'albero di analisi risultante può essere valutato. (Http://en.wikipedia.org/wiki/Compiler#Front_end) – chepner