Gần đây tôi đã có một số niềm vui khám phá sự phát triển của các trình phân tích cú pháp ngôn ngữ trong bối cảnh làm thế nào chúng phù hợp với Phân cấp Chomsky.
Một ví dụ thực tế tốt (tức là không lý thuyết) của một ngữ pháp nhạy cảm ngữ cảnh là gì?
Gần đây tôi đã có một số niềm vui khám phá sự phát triển của các trình phân tích cú pháp ngôn ngữ trong bối cảnh làm thế nào chúng phù hợp với Phân cấp Chomsky.
Một ví dụ thực tế tốt (tức là không lý thuyết) của một ngữ pháp nhạy cảm ngữ cảnh là gì?
Câu trả lời:
Câu hỏi hay. Mặc dù như đã đề cập trong các bình luận, rất nhiều ngôn ngữ lập trình nhạy cảm với ngữ cảnh, độ nhạy ngữ cảnh đó thường không được giải quyết trong giai đoạn phân tích cú pháp nhưng trong các giai đoạn sau - nghĩa là, một siêu ngôn ngữ được phân tích cú pháp bằng ngữ pháp không ngữ cảnh, và một số cây phân tích sau đó được lọc ra.
Tuy nhiên, điều đó không có nghĩa là những ngôn ngữ đó không nhạy cảm với ngữ cảnh , vì vậy đây là một số ví dụ:
Haskell cho phép bạn xác định các hàm được sử dụng làm toán tử và cũng xác định mức độ ưu tiên và kết hợp của các toán tử đó. Nói cách khác, bạn không thể xây dựng cây phân tích chính xác cho biểu thức toán tử như:
a @@ b @@ c ## d ## e
trừ khi bạn đã phân tích các khai báo ưu tiên / kết hợp cho @@và ##:
infixr 8 @@
infixr 6 ##
Một ví dụ thứ hai là Bencode , một ngôn ngữ dữ liệu có tiền tố nội dung với độ dài của nó:
<length>:<contents>
Vấn đề với định dạng này là không thể phân tích cú pháp mà không có thứ gì nhạy cảm với ngữ cảnh, bởi vì cách duy nhất để tìm ra kích thước "trường" là bằng cách ... phân tích chuỗi.
Một ví dụ thứ ba là XML, giả sử tên thẻ tùy ý được phép: mở tên thẻ phải có thẻ đóng trùng khớp:
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
Chừng nào tôi biết, văn phạm tiếng bối cảnh nhạy cảm được sử dụng trong xử lý ngôn ngữ tự nhiên, chỉ . Các trình thông dịch và trình biên dịch ngôn ngữ lập trình không cố phân tích ngữ pháp không ngữ cảnh vì sự phức tạp (ngay cả khi một số nỗ lực đã được thực hiện trong quá khứ).
Có lẽ, bạn có thể tìm thấy một số ví dụ về việc sử dụng thực tế trong một trong những thư viện này:
http://en.wikipedia.org/wiki/List_of_natural_lingu_ Processing_toolkits
Ngữ pháp nhạy cảm ngữ cảnh đôi khi được sử dụng trong các mô tả về ngữ nghĩa ngôn ngữ lập trình. Có lẽ việc sử dụng toàn diện nhất các ngữ pháp nhạy cảm ngữ cảnh là định nghĩa ngôn ngữ Algol68. Nó đã sử dụng một ngữ pháp miễn phí ngữ cảnh hai cấp độ (xem http://en.wikipedia.org/wiki/Two-level_grammar ) để mô tả cả cú pháp và ngữ nghĩa của các chương trình Algol68.
Một vài đồng nghiệp của tôi đã sử dụng ngữ pháp van Wijngaarden để chỉ đạo việc thực hiện Algol68 của họ (xem http://en.wikipedia.org/wiki/FLACC ).