Những ngôn ngữ máy tính trong thế giới thực không thể được mô tả bằng các ngữ pháp xác định?


7

Có ví dụ nào về ngôn ngữ máy tính trong thế giới thực không mang tính quyết định không?

Theo ngôn ngữ máy tính, tôi bao gồm ngôn ngữ lập trình, ngôn ngữ đánh dấu, ngôn ngữ truy vấn, ngôn ngữ mô hình hóa, ngôn ngữ chuyển đổi, v.v.

Bởi không xác định tôi có nghĩa là chúng không thể được phân tích cú pháp bằng ngữ pháp xác định.


Nitpick: ngữ pháp không phân tích ngôn ngữ. Trả lời: nổi tiếng, Perl không thể được phân tích ở tất cả .
Raphael

nghĩ rằng có một số câu hỏi hay ở đây nhưng thực sự không có khái niệm "ngữ pháp không xác định" afaik. nó sẽ được định nghĩa như thế nào? có những automata không đặc biệt có tương quan với nhiều định nghĩa về ngữ pháp, v.v ... câu hỏi này có vẻ khác nhiều đối với RLsCFLs . lưu ý rằng có một cách để xây dựng một DFA tương đương từ bất kỳ NFA (thuật toán tiêu chuẩn) nào nên điều này rất khó. bạn có thể muốn nghiên cứu một số lý thuyết CFL để cố gắng xây dựng điều này tốt hơn / chính xác hơn ...
vzn

Uhhh .. có lẽ nên đọc "automata đẩy xuống không điều kiện". Nhưng câu hỏi là khá vô nghĩa, tất cả phụ thuộc vào loại phân tích mà bạn mong đợi phân tích để làm. Ví dụ, nhận ra rằng tất cả các biến được khai báo trước khi sử dụng không có ngữ cảnh.
Revierpost

Câu trả lời:


4

Đú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 Alà 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 Alà 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 Blà 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 Alà tên của một loại, đây là khai báo một biến có tên là Bloại là con trỏ đến A) hoặc phép nhân (nếu ABlà 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ứngcá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? đặc tính ngữ pháp của các ngôn ngữ không có ngữ cảnh xác địnhNế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.


1
điều này dường như gần với một câu trả lời nhưng sự mơ hồ trong các ngôn ngữ / CFL không giống như chủ nghĩa không xác định ....
vzn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.