2013-03-16 30 views
5

Tôi đang làm việc trên một dự án mà người dùng nhập chuỗi tìm kiếm có thể đọc được của con người với các toán tử HOẶC VÀ OR. tôi cung cấp cho ba ví dụChuyển đổi đầu vào của người dùng thành regex

  1. một AND (b hoặc c) -> (= \ ba \ b?.) (= (\ bb \ b) |?. (\ Bc \ b)). *
  2. a OR (b và c)
  3. (a OR b) và (c HOẶC d)

trên đây là mẫu đầu vào tôi có thể nhận được. Tôi muốn nhập dữ liệu đó và chuyển nó thành regex. Đây không phải là mẫu của trình biên dịch phải không? Nhìn vào nó, tôi thấy rằng những gì tôi muốn làm là chuyển đổi một lệnh mức cao thành một cấp độ thấp. Bạn có bất cứ đề xuất nào về số cách tôi có thể thực hiện điều này không? Những gì tôi muốn là, vượt qua các regex được sản xuất để jsoup (giả chọn: matchesOwn) và truy vấn một tài liệu html. Cảm ơn sự giúp đỡ của bạn.

+0

Nếu bạn có khung làm tổ như thế này (()()) ((())()) ', bạn không thể phân tích cú pháp nó bằng regex trong Java. – nhahtdh

+0

Cảm ơn bạn đã phản hồi. Tôi không muốn phân tích cú pháp đầu vào bằng regex, tôi muốn chuyển nó thành regex. Thay vì yêu cầu từ người sử dụng để cho tôi regex, tôi hỏi anh ta một phiên bản dễ đọc hơn của con người của nó. – alkis

+0

Làm thế nào bạn sẽ đối phó với thực tế là regex có trật tự nhưng chuỗi tìm kiếm thì không. nếu người dùng nhập 'foo AND bar', họ mong đợi' bar foo' khớp với ví dụ của bạn. Hoặc bạn sẽ tạo ra mọi hoán vị. – user1937198

Trả lời

5

Cách chung để thực hiện việc này là tạo biểu diễn trung gian dưới dạng cấu trúc dữ liệu dễ dàng di chuyển. Điều này thường được gọi là AST. Nếu bạn không quen với khái niệm này, hãy xem calculator-ast để thực hiện phép chuyển đổi này cho ngôn ngữ máy tính.

Để chuyển chuỗi đầu vào của người dùng thành AST, bạn cần phải sử dụng trình phân tích cú pháp. Bạn có thể có một cái nhìn tại antlr. Cá nhân tôi sử dụng v3, v4 có vẻ ít trưởng thành hơn. Hãy xem antlr3.org. Nếu bạn muốn tự mình viết trình phân tích cú pháp, bạn có thể tạo một ảnh chụp pratt parser. Đây không phải là tầm thường và kết hợp xử lý lỗi tốt đẹp mất thời gian, nhưng nó có thể là một bài tập thú vị.

Khi bạn có AST, chuyển nó thành regex sẽ không đáng kể bằng cách vượt qua AST và xuất ra các ký tự khi bạn đi theo.

Chúc may mắn!

+0

Câu trả lời của bạn rất hữu ích. Vì vậy, theo một cách suy nghĩ rất trừu tượng, một trình biên dịch nhỏ ... – alkis

+2

Đúng! Và những ngôn ngữ nhỏ như vậy là một cách tuyệt vời để bắt đầu làm quen với các công nghệ và thuật ngữ trình biên dịch. Chúc vui vẻ. –

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