2014-10-16 42 views
6

W sprawozdaniu full python grammar specificationwith jest zdefiniowany jako:Python gramatyka: with_stmt

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

expr Gdzie jest:

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

Dlaczego with_item zawiera expr zasadę zamiast zwykłego name?

Jest to ważny kod Python:

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

Według gramatyki kod ten jest również ważny?

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

Odpowiedz

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

Tak, ten kod jest poprawnywedług gramatyki! W przeciwnym razie wystąpi błąd analizy ("nieprawidłowa składnia"). Odpowiedni składni parsera ma tę składnię, jest to kolejna część kompilatora, która sprawdza, czy takie wyrażenie nie jest dozwolone po lewej stronie (ponieważ as jest semantycznie równoważne przypisaniu). Powodem, dla którego gramatyka pozwala expr tutaj, a nie tylko NAME to, że można mieć żadnych lwartość po as:

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

ale nie ma osobny przepis dla lwartościami, np przypisania używają po lewej stronie testlist, która jest szersza niż expr.

+2

+1 Analiza syntaktyczna określa, czy tokeny znalezione w kodzie źródłowym tworzą poprawne drzewo analizy (zdefiniowane przez gramatykę). Analiza semantyczna określa, czy wynikowe drzewo analizy może zostać ocenione. (http://en.wikipedia.org/wiki/Compiler#Front_end) – chepner