2009-03-04 22 views
7

Trong những năm qua, kết hợp mẫu "regex" ngày càng trở nên mạnh mẽ hơn đến mức tôi tự hỏi: liệu nó có thực sự phù hợp với ngữ cảnh-ngữ pháp nhạy cảm không? Nó có phải là một biến thể/mở rộng của ngữ pháp-miễn phí-ngữ pháp phù hợp? Bây giờ nó ở đâu và tại sao chúng ta không gọi nó thay vì "biểu hiện chính quy" hạn chế, hạn chế?Là "regex" trong các ngôn ngữ lập trình hiện đại thực sự "ngữ pháp ngữ cảnh nhạy cảm"?

Trả lời

9

Trong các phần hậu thuẫn cụ thể để ghi dấu ngoặc đơn, biểu thức chính quy phức tạp hơn ngữ pháp thông thường, ngữ cảnh hoặc ngữ cảnh nhạy cảm. Tên chỉ đơn giản là được phát triển theo lịch sử (như nhiều từ). Xem thêm this section trong Wikipedia và điều này explanation with an example từ Perl.

+0

Bạn có thể giải thích sự khác biệt giữa 'ngôn ngữ thông thường' và' biểu thức chính quy' không? –

+1

Nó thực sự mạnh hơn CSG? Bạn có thể đưa ra một ví dụ? – notnot

+0

Một ngôn ngữ thông thường có thể được mô tả bằng ngữ pháp thông thường (xem http://en.wikipedia.org/wiki/Regular_grammar), trong khi cụm từ thông dụng là một mẫu khớp với ngôn ngữ ít bị hạn chế và do đó phức tạp hơn để xử lý. –

3

Con đường tôi nhìn thấy nó:

  • ngôn ngữ thông thường:
    • khớp do máy nhà nước. Chỉ có một biến thể được sử dụng để đại diện cho hiện tại "location" trong ngữ pháp để được xuất hiện: Đệ quy không thể được thực hiện
  • Context-free ngôn ngữ:
    • khớp bởi một máy stack. "Vị trí" hiện tại trong ngữ pháp được đại diện bởi một chồng trong một hoặc một hình thức khác. Không thể "nhớ" bất cứ điều gì đã xảy ra trước khi
  • Context-sensitive ngôn ngữ:
    • Hầu hết các ngôn ngữ lập trình
    • Tất cả Hầu hết các ngôn ngữ con người

tôi biết thường xuyên trình phân tích cú pháp biểu thức cho phép bạn đối sánh với nội dung nào đó mà trình phân tích cú pháp đã gặp phải, đạt được điều gì đó giống như ngữ cảnh-se ngữ pháp nsitive.

Tuy nhiên, trình phân tích cú pháp biểu thức chính quy, tuy nhiên chúng có thể phức tạp, không cho phép áp dụng quy tắc đệ quy, đây là yêu cầu nhất định đối với ngữ pháp không có ngữ cảnh.

Thuật ngữ regex, theo ý kiến ​​của tôi, chủ yếu đề cập đến cú pháp dùng để diễn tả những văn phạm thường xuyên (các ngôi sao và dấu hỏi).

+0

Lookahead/lookbehind và đặt tên chắc chắn thêm một cái gì đó mà ngồi ngoài biểu thức thông thường tiêu chuẩn - bộ nhớ. Vậy chúng ta không phải ở cấp PDA sao? – notnot

+1

Nó không phải là nói chung đúng là ngôn ngữ tự nhiên là bối cảnh nhạy cảm, xem http://www.eecs.harvard.edu/~shieber/Biblio/Papers/shieber85.pdf –

+0

ah, đó là những thứ tốt – notnot

3

Có các tính năng trong triển khai cụm từ thông dụng hiện đại, phá vỡ các quy tắc của classic regular expression definition.

Ví dụ Microsoft’s .NET Balancing Group(?<name1-name2> …):

^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$ 

này không phù hợp với ngôn ngữ L ₀₁ = {ε , 01, 0011, 000.111, ...}. Nhưng ngôn ngữ này không thường xuyên theo Pumping Lemma.

+0

Tôi biết rằng nó vượt ra ngoài regex kinh điển, nhưng tôi tự hỏi còn bao nhiêu nữa. Liên kết của Fabian ở trên rất thú vị. – notnot

Các vấn đề liên quan