Như tiêu đề đã nói, tôi đã dành một vài giờ vào cuối tuần trước để cố gắng suy nghĩ về lớp ngôn ngữ phù hợp với các biểu thức chính quy tương thích Perl, ngoại trừ bất kỳ toán tử khớp nào cho phép thực thi mã tùy ý bên trong mẫu .
Nếu bạn không biết PCRE là gì, vui lòng đọc cái này và cái này .
Vấn đề là, các tài nguyên có sẵn trên internet dừng lại ở các ngôn ngữ không ngữ cảnh và PCRE có thể phù hợp hơn các ngôn ngữ (xem bên dưới); nhưng tôi thực sự không biết tìm thêm định lý hay bài báo nào về loại công cụ này.
Cụ thể: PCRE rõ ràng là một siêu ngôn ngữ thông thường (vì cú pháp PCRE có tất cả các toán tử ngôn ngữ thông thường).
Bất kỳ CFG nào cũng có thể được đặt ở dạng bình thường Greibach, loại bỏ đệ quy trái. Tôi nghĩ rằng điều này có thể được sử dụng bởi các (?(DEFINE)...)
nhóm để "dịch" ngữ pháp thành các chương trình con phù hợp, tránh bị nghẹt thở trong đệ quy trái, bằng cách dịch:
- thiết bị đầu cuối ở đầu mỗi sản phẩm trở thành chương trình con
(?<HEAD>...)
- cơ thể của mỗi sản xuất được đưa vào chương trình con; các thiết bị đầu cuối được để nguyên, các thiết bị đầu cuối không trở thành thủ tục (nghĩa là
(?&NONTERMINAL)
); - tất cả các sản phẩm có cùng tiếng ồn với đầu được ORed với nhau bằng phương tiện của
|
nhà điều hành (cộng với việc nhóm bổ sung với(?:...)
, nếu cần) - mẫu sau đó trở thành một
(?(DEFINE)...)
nhóm chứa tất cả các sản phẩm "được dịch" và một lời gọi cho thủ tục của biểu tượng bắt đầu, để khớp với toàn bộ chuỗi, nghĩa là^(?(DEFINE)...)(?&START)$
Điều này sẽ đối phó với bất kỳ CFG. Do đó, PCRE phải có thể phù hợp với bất kỳ CFL nào.
Còn nữa: hãy dùng ngôn ngữ đơn giản tức là ngôn ngữ của các chuỗi được lặp lại hai lần. Ngôn ngữ này không phải là CFL - bổ đề bơm cho CFL không thành công. (Đặc biệt chú ý rằng phải giữ, do đó bạn không thể chỉ bắt đầu hoặc kết thúc hai chuỗi lặp lại.)
Tuy nhiên, ngôn ngữ này dễ dàng được kết hợp bởi PCRE : ^(.*)\1$
. Do đó, chúng tôi hoàn toàn vượt trên CFL.
Bao nhiêu ở trên? Vâng, như tôi đã nói, tôi không có ý tưởng. Tôi không thể tìm thấy bất kỳ tài nguyên nào về CSL hoặc tất cả các lớp khác ở giữa để tạo nên tâm trí của tôi. Bất kỳ chuyên gia sẵn sàng để thảo luận về điều này?
Phụ lục: Tôi được yêu cầu chỉ định chính xác tập hợp con của cú pháp PCRE phải được cho phép. Như tôi đã viết ở đầu bài, tôi muốn loại trừ bất kỳ toán tử nào cho phép thực thi mã tùy ý bên trong mẫu, chẳng hạn như ??{}
.
Vì lợi ích của cuộc tranh luận, tôi nghĩ rằng chúng ta có thể sử dụng cú pháp được xác định bởi trang man pcresyntax (3) , đây là một tập hợp con hợp lý của những gì Perl 5.10-5.12 đưa ra, trừ đi các chú thích (vì chúng không nằm trong mẫu). Tôi không chắc chắn rằng việc thêm hoặc xóa các động từ điều khiển quay lui sẽ thay đổi ngôn ngữ mà chúng ta có thể nhận ra; nếu vậy, thật tuyệt khi tìm ra những lớp chúng ta có và không có những lớp đó.