Bạn sẽ nhận được gì nếu bạn thêm các tham số vào ngữ pháp miễn phí ngữ cảnh?


13

Tôi đã nghĩ về ngữ pháp cho các ngôn ngữ nhạy cảm với sự thay đổi và có vẻ như các ngữ pháp CF sẽ thực hiện thủ thuật nếu kết hợp với các tham số. Ví dụ, xem xét đoạn này cho ngữ pháp Python đơn giản hóa ở định dạng giống ANTLR:

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

Câu hỏi của tôi: Loại ngữ pháp này (CFG với các tham số) có tên không?

Có vẻ như sẽ không khó để viết một trình phân tích cú pháp gốc đệ quy cho ngữ pháp này (về cơ bản nên là các trình phân tích cú pháp). Điều gì có thể là những khó khăn với phương pháp này?

Việc bổ sung các tham số có nâng lớp ngôn ngữ được hỗ trợ lên trên không ngữ cảnh không?


1
Nếu tập hợp các giá trị mà các tham số có thể nhận là hữu hạn thì nó vẫn không có ngữ cảnh một cách tầm thường (sau đó bạn có thể lặp lại tất cả các giá trị và viết ra tất cả).
ratchet freak

1
Đáng lưu ý rằng đề xuất của bạn là dành cho các ngôn ngữ nhạy cảm thụt đầu dòng với thụt đầu dòng cố định. Python (và các ngôn ngữ khác) không bị hạn chế theo cách này; họ chấp nhận bất cứ thứ gì thụt vào mà người dùng muốn. Điều đó không ảnh hưởng đến khả năng phân tích cú pháp (ngoại trừ việc xử lý các ký tự tab) nhưng thật khó để diễn đạt với đề xuất của bạn, ít nhất là theo tôi hiểu.
rici


@HendrikJan, ngữ pháp thuộc tính là một cách chú thích ngữ pháp với hành động ngữ nghĩa, chúng không kiểm soát phân tích cú pháp.
Lập trình viên

1
Nếu mục tiêu là xử lý thụt lề, điều đó phù hợp hơn với mã thông báo hơn là trình phân tích cú pháp. Có mã thông báo phát ra mã thông báo INDENT và UNINDENT ảo khi mức độ thụt lề thay đổi. Sau đó, không cần phải tăng ngữ pháp ngôn ngữ với thông tin về thụt lề.
John Kugelman

Câu trả lời:


14

Ngữ pháp gắn liền ( ngữ pháp không ngữ cảnh được tham số hóa) được nghiên cứu rộng rãi bởi nhà khoa học máy tính nổi tiếng người Hà Lan Cornelis HA Koster , bắt đầu với bài báo năm 1962 "Tiếng Anh cơ bản, một ngữ pháp tổng quát cho một phần tiếng Anh", được viết cùng với LGLT Meertens. Năm 1970, ông đã sản xuất một chủ nghĩa hình thức của khái niệm này; một cái nhìn tổng quan hữu ích có sẵn trong bài viết năm 1971 "Các ngữ pháp gắn liền với ngôn ngữ lập trình", một phiên bản mà tôi tìm thấy trên Citeseer .

Trong bài báo đó, Koster so sánh chủ nghĩa hình thức của mình (và một thứ tương tự khác) với ngữ pháp hai cấp độ của Van Wijngaarden và thấy chúng rất giống nhau.

Thư mục tài liệu phân tích chú thích vô giá của Dick Grune bao gồm một số lượng lớn các tài liệu tham khảo hữu ích khác cho ngữ pháp gắn liền và các hình thức phi Chomskyian khác. (Xem phần 18.2.6 của thư mục, mặc dù có các tài liệu hữu ích trong các phần khác.) Grune trình bày ngắn gọn về ngữ pháp trong §15.3.2 của phiên bản thứ hai của Kỹ thuật phân tích cú pháp: Hướng dẫn thực hành (và thậm chí ngắn gọn hơn trong phiên bản đầu tiên , có sẵn trực tuyến) đề cập đến thực tế là nó dễ dàng thích ứng với các kỹ thuật phân tích cú pháp từ trên xuống (và khác).

Trừ khi miền của các tham số là hữu hạn, trong trường hợp đó chúng có thể được loại bỏ bằng cách tạo tĩnh tất cả các sản phẩm có thể dẫn đến CFG, lớp ngữ pháp gắn liền chắc chắn là một siêu ngữ pháp nghiêm ngặt của tập hợp các ngữ pháp không ngữ cảnh. (Có thể tìm thấy ngữ pháp gắn liền với trong tài liệu tham khảo Kỹ thuật phân tích cú pháp của Dick Grune ở trên.)mộtnbncn

Koster, người cũng là biên tập viên của báo cáo Algol 68, là nhà phát triển ban đầu của Ngôn ngữ mô tả trình biên dịch (CDL) , dựa trên ý tưởng của ông về ngữ pháp gắn liền. Bộ công cụ này và các dẫn xuất sau này của nó đã được sử dụng trong sản xuất trong nhiều năm. Trang này , mà tôi tìm thấy với một tìm kiếm Google và có thể không đảm bảo được sự tồn tại của tôi, có liên kết đến trang hướng dẫn và tải xuống cho CDL3.


Tôi cảm thấy các ngôn ngữ CDL giống như các ngữ pháp thuộc tính : các giá trị của các thuộc tính có thể được tính bằng các hàm được xác định bên ngoài. Tôi bảo lưu ngữ pháp gắn tên cho các trường hợp trong đó mối quan hệ giữa các giá trị của các phụ tố (thuộc tính) được xác định trong chủ nghĩa hình thức, như trong Ngữ pháp gắn kết mở rộng .
Revierpost

@reinierpost: Tất nhiên, bạn được hưởng thuật ngữ riêng của bạn; đặc quyền không bị hạn chế đối với trứng hình người. Tuy nhiên, hướng dẫn sử dụng CDL tự khẳng định rằng "CDL3 là ngôn ngữ triển khai dựa trên ngữ pháp gắn liền", mà tôi nghĩ nên được tính đến. (Hướng dẫn có sẵn tại ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ). Đó là những gì tôi đã tuyên bố trong câu trả lời của mình: rằng CDL dựa trên công trình của Walter về ngữ pháp gắn liền. Như Grune chỉ ra, sự khác biệt giữa ngữ pháp thuộc tính và thuộc tính là nhẹ; sự khác biệt của anh ấy là liệu các phụ tố được sử dụng để quyết định tính hợp lệ của cú pháp.
22 giờ 22 phút

(Trích dẫn từ trang đầu tiên của tài liệu hướng dẫn.)
rici

Tôi biết ... và bạn đã đúng. Nhận xét của tôi không có nghĩa là mâu thuẫn với bạn.
Revierpost

6

Lấy bổ đề bơm cho CFGs :

Lấy ngữ pháp

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

Điều này mô tả một hình tam giác sao:

*
**
***
**
*

bạnvwxy{bạnvnwxny|n>0}vx

Điều này có nghĩa là tam giác sao không phải là ngôn ngữ tự do ngữ cảnh.

Hoặc một ví dụ đơn giản hơn:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{bnmộtbnmộtbn|n0}


3

Tôi chưa bao giờ thấy chủ nghĩa hình thức này được trình bày (ngay cả trong một cái gì đó như Kỹ thuật phân tích cú pháp của Grune ), tùy thuộc vào chi tiết về cách bạn xác định chính xác "các tham số nên về cơ bản là trình phân tích cú pháp", có thể ánh xạ tới van Wijngaarden hai ngữ pháp, có sức mạnh tương tự như ngữ pháp cấu trúc pha không giới hạn (nghĩa là mạnh hơn so với ngữ cảnh nhạy cảm, bạn có thể viết một ngữ pháp của VW cung cấp cho tất cả các chương trình tạm dừng).



Koster và nhóm của ông đã nghiên cứu hai loại ngữ pháp gắn liền, theo như tôi biết: 1) các dạng ngữ pháp Van Wijngaarden bị hạn chế, có nghĩa là cho phép nhận biết dễ dàng hơn; 2) các ngôn ngữ CDL, ngôn ngữ mô tả trình biên dịch thực tế mà không có bất kỳ thao tác giá trị đóng dấu rõ ràng nào nhưng với tùy chọn xác định quy tắc trong ngôn ngữ đích (ví dụ: trình biên dịch chương trình), làm cho chúng hoàn thành Turing.
Revierpost
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.