2009-07-22 32 views
6

Tôi chưa vào lĩnh vực ngôn ngữ chính thức trong khoa học máy tính, vì vậy có lẽ câu hỏi của tôi là ngớ ngẩn. Tôi đang viết một trình phân tích cú pháp NMEA đơn giản trong C++ và tôi phải chọn:Khi nào sử dụng trình tạo phân tích cú pháp, khi nào thì regex là đủ?

Ý tưởng đầu tiên của tôi là xây dựng một máy trạng thái hữu hạn đơn giản theo cách thủ công, nhưng sau đó tôi nghĩ rằng tôi có thể làm điều đó với ít công việc hơn . Tôi đã sử dụng các biểu thức chính quy trước đây, nhưng tôi nghĩ rằng biểu thức chính quy NMEA là rất dài và phải mất "thời gian dài" để phù hợp với nó.

Sau đó, tôi đã nghĩ đến việc sử dụng trình tạo trình phân tích cú pháp. Tôi nghĩ rằng tất cả sử dụng cùng một phương pháp: họ tạo ra một FSA. Nhưng tôi không biết cái nào hiệu quả hơn. Khi nào bạn thường sử dụng trình tạo phân tích cú pháp thay vì regex (tôi nghĩ bạn có thể viết regex trong trình tạo trình phân tích cú pháp)?

Vui lòng giải thích sự khác biệt, tôi quan tâm đến cả lý thuyết và kinh nghiệm.

Trả lời

7

Vâng, một quy tắc đơn giản là: Nếu ngữ pháp của dữ liệu bạn đang cố phân tích là regular, hãy sử dụng cụm từ thông dụng. Nếu không, các biểu thức thông thường có thể vẫn hoạt động (vì hầu hết các công cụ regex cũng hỗ trợ các ngữ pháp không thường xuyên), nhưng nó cũng có thể gây đau (hiệu năng phức tạp/xấu).

Một khía cạnh khác là những gì bạn đang cố gắng làm với dữ liệu được phân tích cú pháp. Nếu bạn chỉ quan tâm đến một trường, một regex có thể dễ đọc hơn. Nếu bạn cần đọc các cấu trúc lồng nhau sâu sắc, một trình phân tích cú pháp có khả năng duy trì được nhiều hơn.

4

Regex trình tạo phân tích cú pháp.

Từ wikipedia:

Regular expressions (viết tắt là regex hoặc regexp, với các hình thức số nhiều regexes, regexps, hoặc regexen) được viết bằng một ngôn ngữ chính thức có thể được giải thích bởi một bộ xử lý biểu thức chính quy, một chương trình hoặc là máy phát phân tích cú pháp hoặc kiểm tra văn bản và xác định các phần khớp với đặc tả được cung cấp.

Nếu bạn đang xem qua danh sách chỉ cần được chuyển đi một lần, hãy lưu danh sách vào tệp và đọc tệp từ đó. Nếu bạn đang kiểm tra những thứ khác nhau mỗi lần, hãy sử dụng regex và lưu trữ các kết quả trong một mảng hoặc một cái gì đó.

Nhanh hơn nhiều so với mức bạn cho là như vậy. Tôi đã thấy các biểu thức lớn hơn bài đăng này.

Thêm rằng bạn có thể lồng bao nhiêu tùy thích, bằng bất kỳ ngôn ngữ nào bạn quyết định mã hóa. Bạn thậm chí có thể làm điều đó trong các phần, để có thể sử dụng lại tối đa.

2

Vì tính lén lút chỉ ra, bạn có thể có một biểu thức chính quy lớn và phức tạp đáng kinh ngạc. Tôi đã nhìn thấy một số ví dụ về điều này, nhưng không ai có thể duy trì được bằng những con người. Ngay cả việc sử dụng Expresso chỉ giúp ích rất nhiều; nó vẫn còn khó hiểu và rủi ro để sửa đổi. Vì vậy, trừ khi bạn là một savant với một cố định trên Grep, tôi sẽ không khuyên bạn nên hướng này.

Thay vào đó, hãy cân nhắc tập trung vào ngữ pháp và để cho phép nâng hạng nặng cho bạn.

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