2014-10-16 20 views
6

Trong tuyên bố full python grammar specificationwith được định nghĩa là:Python ngữ pháp: with_stmt

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

đâu expr là:

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

Tại sao with_item chứa expr quy tắc thay vì đơn giản name?

Đây là mã python hợp lệ:

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

Theo ngữ pháp mã này cũng là hợp lệ?

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

Trả lời

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

Vâng, mã này là hợp lệ theo ngữ pháp! Nếu không, bạn sẽ gặp lỗi phân tích cú pháp ("cú pháp không hợp lệ"). Trình phân tích cú pháp thích hợp là tốt với cú pháp này, nó là một phần khác của trình biên dịch kiểm tra biểu thức đó không được phép ở phía bên trái (vì as tương đương ngữ nghĩa với phép gán). Lý do tại sao ngữ pháp cho phép expr đây, và không chỉ NAME là bạn có thể có bất kỳ giá trị trái sau as:

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

nhưng không có quy tắc riêng cho lvalues, ví dụ bài tập sử dụng testlist ở bên trái, thậm chí còn rộng hơn expr.

+2

+1 Phân tích cú pháp xác định liệu các mã thông báo được tìm thấy trong mã nguồn có tạo thành một cây phân tích chính xác (như được định nghĩa bởi ngữ pháp) hay không. Phân tích ngữ nghĩa xác định liệu cây phân tích kết quả có thể được đánh giá hay không. (http://en.wikipedia.org/wiki/Compiler#Front_end) – chepner

Các vấn đề liên quan