Đúng. Nhiều ngôn ngữ lập trình hiện đại có thuộc tính này, bao gồm Algol 60, C và C ++; xem bên dưới để biết chi tiết.
Algol 60 nổi tiếng có vấn đề nguy hiểm khác , đối với một số chương trình, thật mơ hồ về cách chúng nên được phân tích cú pháp (kết quả là phân tích cây phân tích).
Nhiều ngôn ngữ hiện đại giải quyết điều này bằng cách chọn một ngữ pháp giải quyết sự mơ hồ theo một cách cụ thể. Tuy nhiên, điều này đòi hỏi cẩn thận xây dựng ngữ pháp để loại bỏ sự mơ hồ. Thường thì cách viết ngữ pháp tự nhiên nhất dẫn đến một ngữ pháp mơ hồ, và bạn phải biến đổi ngữ pháp để tránh sự mơ hồ.
Một cách tiếp cận khác là sử dụng trình phân tích cú pháp GLR, có thể xử lý các ngữ pháp này. Sau đó, bạn có thể kiểm tra trong thời gian chạy xem có nhiều trình phân tích cú pháp có thể không và giải quyết sự mơ hồ.
Một ví dụ kinh điển khác là ngôn ngữ lập trình C và C ++. Ngữ pháp tham chiếu cho C không có ngữ cảnh, bởi vì khi bạn nhìn thấy một tên, bạn cần biết đó là tên của một loại hoặc một biến để biết cách phân tích câu lệnh. Ví dụ, hãy xem xét biểu thức
(A)*B
Nếu A
là một biến, đây là phép nhân của hai biến và tương đương với A*B
. Tuy nhiên, nếu A
là tên của một loại, thì đây là một biểu tượng con trỏ và kiểu đúc (vì vậy B
là một tên biến chứa một loại con trỏ) và tương đương với (A) *B
.
Tương tự
A*B;
có thể là khai báo biến (nếu A
là tên của một loại, đây là khai báo một biến có tên là B
loại là con trỏ đến A
) hoặc phép nhân (nếu A
và B
là tên của các biến).
Trình biên dịch thường khắc phục điều này bằng cách bao gồm mã bổ sung "đi ra ngoài" ngôn ngữ của ngữ pháp không ngữ cảnh thuần túy. Họ theo dõi tất cả các tên biến và tên loại trong phạm vi và sử dụng tên này để hướng dẫn phân tích cú pháp trong trường hợp không rõ ràng này. Xem hack lexer .
Xem thêm LL và LR trong Ngữ cảnh: Tại sao các công cụ phân tích cú pháp lại cứng và các trang hướng dẫn của Bison trên trình phân tích cú pháp GLR của nó (bao gồm một cuộc thảo luận về một trường hợp mơ hồ khác trong ngữ pháp C ++).
Cuối cùng: Tôi nghĩ rằng câu hỏi có một số nhầm lẫn về sự khác biệt giữa sự mơ hồ và không xác định. Automata và ngôn ngữ có thể là xác định / không xác định, nhưng không phải là ngữ pháp. Ngữ pháp và ngôn ngữ có thể mơ hồ / không rõ ràng. Xem Có những ngôn ngữ không có ngữ cảnh mơ hồ và xác định không? và đặc tính ngữ pháp của các ngôn ngữ không có ngữ cảnh xác định và Nếu một trình phân tích cú pháp có thể phân tích cú pháp một ngữ pháp không xác định, thì trình phân tích cú pháp có phải là không xác định không? . Các ví dụ trên thực sự đủ điều kiện cả về ngữ pháp mơ hồ và ngôn ngữ không xác định.