Những ngôn ngữ nào biểu thức chính quy tương thích Perl nhận ra?


23

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àycá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.)

L= ={ww|wΛ*}
|vxw|p

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 đó.


2
Vui lòng bao gồm định nghĩa PCRE đã chọn của bạn trong câu hỏi của bạn, vì nó đã thay đổi giữa các phiên bản. Các biểu thức Perl thực có thể chứa mã Perl tùy ý, làm cho chúng hoàn chỉnh.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã thêm một ghi chú ở cuối, tôi hy vọng nó làm cho điểm này rõ ràng hơn.
peppe

Câu trả lời:


7

Tôi cũng đã tìm thấy bài đăng trên blog này cực kỳ thú vị http://nikic.github.io/2012/06/15/The-true-power-of-THER-expressions.html . Nó cung cấp bằng chứng tương tự mà tôi đã đưa ra trước đây về việc regexps nhận ra CFL (bằng cách viết lại ngữ pháp thông qua DEFINEcác khối) và thậm chí một số CSL (như ngôn ngữ của các chuỗi lặp lại); nó dựa trên cơ sở đó và tiếp tục, đưa ra một bằng chứng rằng biểu thức chính quy với phản hồi là NP-hard (bằng cách giảm 3-SAT xuống mức regrec).


2
Khi tác giả nói "NP-hoàn thành", họ sẽ nói "NP-hard". Họ không cung cấp bằng chứng rằng lớp ngôn ngữ PCRE có trong NP.
András Salamon

Đúng, nó cũng được ghi nhận trong các ý kiến.
peppe

5

Họ quyết định nhiều nhất là các ngôn ngữ nhạy cảm theo ngữ cảnh (mà, như bạn chỉ ra, là một siêu ngôn ngữ của các ngôn ngữ không ngữ cảnh). Xem bài này các nhà sư perl .

Cái nhìn sâu sắc cơ bản là "bộ nhớ" của máy là số lượng nhóm chụp, được giới hạn tuyến tính.


5
Đối số bạn đưa ra trong đoạn thứ hai giải thích tại sao PCRE không thể chấp nhận nhiều hơn CS, nhưng không phải tại sao sự bao gồm này là chính xác (mà bạn đề xuất trong đoạn đầu tiên của bạn). Dường như bài báo được liên kết cũng không đưa ra bằng chứng về điều đó.
Raphael

Chà, bạn không thể nhóm nhiều hơn những gì trong chuỗi đầu vào và số lượng nhóm được cố định trong một mẫu nhất định, do đó bạn có giới hạn trên (tuyến tính) đối với bộ nhớ mà mẫu sử dụng. Tuy nhiên, tôi vẫn bỏ lỡ một bằng chứng chính thức về PCRE -> chuyển đổi tự động giới hạn tuyến tính ...
peppe

Vâng, hai bạn nói đúng. Tôi đã sửa đổi câu trả lời.
Xodarap

Xem thêm perlmonks.org/?node_id=406253 để thảo luận trước đó.
András Salamon
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.