2012-03-17 35 views
13

Dường như C++ 11 hỗ trợ một con số khổng lồ sáu văn phạm biểu thức chính quy khác nhau:Tại sao C++ 11 hỗ trợ 6 ngữ pháp biểu thức chính quy khác nhau?

  • ECMA-262 (ECMAScript) biểu thức thông thường (thay đổi chút ít?)
  • Basic POSIX biểu thức thông thường
  • mở rộng POSIX thường xuyên biểu
  • awk biểu thức thông thường
  • grep biểu thức thông thường
  • egrep biểu thức thông thường

Tại sao nó quyết định bao gồm rất nhiều lựa chọn thay vì giải quyết trên một ngữ pháp duy nhất? Tại sao 6 đặc biệt này?

+8

Bởi vì nó chỉ * tuyệt vời? –

+4

Biểu thức chính quy Perl ftw! –

+2

Hãy nhớ rằng, các ngôn ngữ biểu thức chính quy đều rất giống nhau. Tôi chắc chắn rằng động cơ đằng sau chúng đều giống nhau với một số biến thể nhỏ trong trình phân tích cú pháp. – Gabe

Trả lời

13

Quá trình chuẩn hóa là tất cả về chủ nghĩa thực dụng. Có những lợi ích để bao gồm một ngữ pháp RE trong tiêu chuẩn, miễn là nó được chỉ định chính xác, nhưng không có lợi ích để bỏ một ngữ pháp.

Loại trừ sẽ giúp người triển khai thư viện dễ dàng áp dụng huy hiệu "100% C++ 11 tuân thủ", nhưng ai thực sự quan tâm? Không ai nên đưa ra yêu sách đó, và chỉ những PHB không biết gì sẽ tìm kiếm nó. Thư viện luôn có lỗi ngăn chặn đạt 100% và thư viện tốt có nhiều tính năng.

Lưu ý rằng tất cả các ngữ pháp được bao gồm được chỉ định theo các tiêu chuẩn quốc tế hiện có. Vì vậy, rất ít nỗ lực là cần thiết trên một phần của ủy ban C + +. Chỉ §28,13, dài vài trang.

Nếu họ bỏ qua ngữ pháp chuẩn hóa, khi đó những người triển khai Thư viện chuẩn khác nhau sẽ thêm nó dưới các tên khác nhau, dẫn đến không tương thích. Điều này dường như không xảy ra đối với một ngữ pháp chỉ được định nghĩa bởi một thư viện phổ biến, nơi mà người triển khai thư viện sẽ chịu trách nhiệm về giao diện C++, chứ không phải là các nhà cung cấp Thư viện chuẩn.

+0

+1 cho lý do tại sao nhiều được bao gồm. Bất kỳ suy nghĩ về lý do tại sao sáu? Tôi có thể thấy có ngữ pháp giống như Perl, chẳng hạn như ngữ pháp ECMAScript đã sửa đổi, vì nhiều ngôn ngữ hiện đại nhất có ngữ pháp regex có nguồn gốc Perl. Nó cũng có ý nghĩa để bao gồm hai ngữ pháp POSIX, vì chúng được chuẩn hóa và được sử dụng trên các hệ điều hành giống Unix. Tuy nhiên, bao gồm cả các phần mở rộng được sử dụng bởi awk, grep, và egrep có vẻ khá tùy ý. API regex POSIX C có bao gồm chúng không? Các thư viện regex thường được sử dụng khác? – rkjnsn

+0

@rkjnsn: Tất cả các ngữ pháp ngoại trừ ECMAScript được định nghĩa bởi POSIX, bao gồm Awk và [e] grep. Tất cả các tiêu chuẩn C++ 11 nói về chúng là "tham khảo POSIX." POSIX định nghĩa ngữ pháp của Awk về ngữ pháp POSIX khác: http://pubs.opengroup.org/onlinepubs/009604499/utilities/awk.html#tag_04_06_13_04. Vì vậy, nó không thực sự sáu ngữ pháp được hỗ trợ, nhưng hai tiêu chuẩn được hỗ trợ. – Potatoswatter

+0

... một chủ đề cũ tôi muốn thêm một cái gì đó tôi không thấy đề cập. Một sự lựa chọn ngữ pháp cho phép một đường dẫn dễ dàng hơn để chuyển các nhiệm vụ ReGex hiện có sang C++. Các nhiệm vụ hiện tại có thể đã trải qua rất nhiều lần lặp lại trước khi các cụm từ thông dụng được điều chỉnh theo nhu cầu của chúng và bao gồm tất cả các điều kiện bất thường. Xem tất cả các nỗ lực để xác thực địa chỉ email trên mạng. Tôi có thể thấy một số môi trường được chuyển đổi về việc chuyển ứng dụng của họ sang C++ nếu họ phải bắt đầu lại để tạo ra các mẫu của họ một lần nữa. Nhưng để làm lại các ứng dụng và chỉ mang lại các mô hình hiện có của họ là một win-win. – Arbalest

0

Tôi nghĩ rằng bacause C++ là ngôn ngữ đa nền tảng. Nó đã tạo ra các chương trình trên nhiều chương trình khác nhau. Và hầu hết người dùng mong đợi chương trình theo các quy ước của ví dụ như hệ điều hành.

Để giải quyết những vấn đề này có hai giải pháp:

  • Hãy một API cho bất kỳ của những
  • Bao gồm tất cả các tiêu chuẩn phổ biến trong ngôn ngữ

Thứ hai là tao nhã hơn bởi vì nếu bạn thay đổi giao diện của một API, vấn đề tương thích xảy ra.

Ví dụ POSIX là chuẩn Unix. Một số khách hàng ví dụ quân đội yêu cầu các công ty phần mềm để làm cho các chương trình của họ tương thích với POSIX. Có một câu chuyện mà Microsoft đã làm việc vài tháng để thay đổi Windows thành một hệ điều hành tương thích POSIX, chỉ để có thể bán nó cho hải quân.

+1

Tôi không biết bất kỳ hệ điều hành nào có quy ước bao gồm cụm từ thông dụng ... –

+0

POSIX là viết tắt của Giao diện hệ điều hành di động (X là dành cho Unix). Bản thân điều hành không cần biểu thức chính quy. Tuy nhiên nếu bạn muốn làm một quản lý tập tin có thể sử dụng một regex để tìm kiếm các tập tin. Hầu hết các chương trình đi kèm với Linux/Unix đều sử dụng tiêu chuẩn POSIX cho Biểu thức chính quy. –

+1

@KerrekSB: Các quy ước của Unix bao gồm các biểu thức chính quy. Tất nhiên, đó là hệ điều hành duy nhất làm như vậy, và các công ước của nó bao gồm 5 trong số 6. – Gabe

4

Điều này được bao gồm trong số TR1 proposal. Tôi sẽ cố gắng tóm tắt.

Có vẻ như thận trọng khi xây dựng dựa trên tiêu chuẩn hiện tại thay vì tự mình thực hiện.

Hai tiêu chuẩn hiện có mà chúng có thể xây dựng được xác định: POSIX REs và ECMAScript REs. Perl REs đã bị loại bỏ vì chúng không được tiêu chuẩn hóa. (Những người hợp lý nào có thể không đồng ý.) Ngoài ra, RES ECMAScript được xem như một tập hợp con đơn giản của Perl REs, bao gồm các tính năng hữu ích nhất (hoặc có lẽ là được sử dụng nhiều nhất).

Trong hai, triển khai “dài nhất bên trái” của POSIX REs không hoạt động tốt với các tính năng quan trọng, chẳng hạn như lặp lại không tham lam, và mâu thuẫn với hầu hết các công cụ RE hoạt động trong những ngày này.

Mặt khác, ECMAScript REs thiếu hỗ trợ bản địa hóa của POSIX REs. Vì vậy, họ đã mở rộng ECMAScript REs để bao gồm hỗ trợ bản địa hóa POSIX-RE.

Hỗ trợ POSIX RE được đưa vào tùy chọn vì hành vi của nó khác đủ so với RECM của ECMAScript để biện minh cho tùy chọn chuẩn. Tiêu chuẩn POSIX đi kèm với hai ngữ pháp: Cơ bản và mở rộng. Các awk, grep, và egrep REs là tất cả các biến thể tầm thường đối với các ngữ pháp POSIX cơ bản hoặc mở rộng hơn là các ngữ pháp thực sự riêng biệt.

Vì vậy: Hai tiêu chuẩn, ba ngữ pháp, sáu biến thể.

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