Tại sao BNF được coi là một kỹ thuật không đạt yêu cầu để mô tả một ngôn ngữ?


8

Tôi đã đọc bài báo Khái niệm cơ bản về ngôn ngữ lập trình của C. Strachey vào một ngày khác, trong đó tôi đọc một thứ khá lạ đối với tôi. Trích dẫn trực tiếp (với phần lạ được tôi nhấn mạnh):

Đối mặt với tình hình như nó tồn tại ngày hôm nay, nơi có một phương pháp thường được biết đến của mô tả một lớp nhất định của văn phạm tiếng (được gọi là BNF hoặc bối cảnh miễn phí), bản năng đầu tiên của các nhà toán học có vẻ là để điều tra các giới hạn của BNF -Điều gì bạn có thể thể hiện bằng BNF ngay cả với chi phí xây dựng rất cồng kềnh và nhân tạo không? Đây có thể là một câu hỏi về một số lợi ích toán học (bất kể điều đó có nghĩa là gì), nhưng nó có rất ít liên quan đến các ngôn ngữ lập trình trong đó điều quan trọng hơn là khám phá các phương pháp mô tả cú pháp tốt hơn BNF (điều này vừa bất tiện vừa không phù hợp với ALGOL) hơn là kiểm tra các giới hạn có thể có của những gì chúng ta đã biết là một kỹ thuật không đạt yêu cầu .

Có một lý do cụ thể mà tác giả coi BNF là một kỹ thuật không đạt yêu cầu để mô tả các ngôn ngữ? Có thể là do bạn chỉ có thể mô tả cú pháp chứ không phải ngữ nghĩa với một ngữ pháp BNF duy nhất (tuy nhiên, bạn có thể mở rộng nó để mô tả ngữ nghĩa hoạt động thông qua việc biến nó thành một ngữ pháp thuộc tính)?


Câu trả lời:


3

Bạn đề cập đến một lý do.

Lý do khác là cú pháp của các ngôn ngữ lập trình không có ngữ cảnh, trừ khi bạn xác định cú pháp là ngữ pháp có thể hoặc được mô tả bằng ngữ pháp không ngữ cảnh.

Khi bài báo của Strachey được viết, cú pháp của một ngôn ngữ mới, Algol 68, đã được định nghĩa theo một chủ nghĩa hình thức mới, ngữ pháp hai cấp, được sử dụng để mô tả tính hợp lệ cú pháp đầy đủ, bao gồm nhiều điều, bị tẩy não bởi "BNF là cú pháp "meme, nhiều người trong chúng ta không xem xét một phần của cú pháp, chẳng hạn như tất cả các biến cần phải được khai báo trước khi sử dụng.

Hầu hết chúng ta sẽ không đi xa đến thế, nhưng vẫn sẽ đồng ý rằng các tính năng cú pháp không ngữ cảnh trong các ngôn ngữ lập trình tồn tại.


3

Tôi không nghĩ rằng ngữ nghĩa đóng một vai trò. Trích dẫn của bạn yêu cầu "khám phá các phương pháp mô tả cú pháp tốt hơn BNF." Tất nhiên, những thứ như hàm và tên biến là một phần của cú pháp. Ví dụ, với BNF, bạn không thể phân biệt một ngôn ngữ mà các biến phải được dán nhãn trước khi sử dụng từ một ngôn ngữ mà bạn có thể sử dụng các biến không được khai báo. Những điều này phải được giải thích trong văn bản kèm theo thường không hoàn hảo.


"Những điều này phải được giải thích trong văn bản kèm theo thường" - có ngữ nghĩa chính thức, mặc dù.
Raphael

1
Câu hỏi liệu một chương trình với một định danh nhất định tại một vị trí nhất định có hợp pháp hay không đối với tôi là cú pháp, không phải là ngữ nghĩa. Ngữ nghĩa là ý nghĩa, cú pháp đang mô tả ngôn ngữ chính thức của các chương trình pháp lý. Do đó tôi nghĩ ví dụ của tôi mô tả một phần cú pháp thường được mô tả dưới dạng văn bản.
Peter Leupold

1
Bỏ thuật ngữ ngôn ngữ lập trình sang một bên, nhánh của TCS được gọi là ngữ nghĩa chính thức là những gì bạn có thể sử dụng ở đó. Bạn có thể gọi là cú pháp sau đó, nếu bạn muốn (mặc dù tôi cho rằng điều đó thật ngớ ngẩn); vấn đề là ngôn ngữ tự nhiên không phải là sự thay thế duy nhất để xác định những điều này.
Raphael
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.