2012-09-16 33 views
6

Tôi hiện đang cố gắng để tạo ra một thành phần phần mềm mà sẽ có thể phiên dịch chuỗi động như:Làm thế nào để phân tích một chuỗi mà không biểu thức thông thường

%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT")) 

nào sẽ cho kết quả trong chuỗi này:

asampletext 

Tôi muốn có thể xác định một tập hợp các chức năng có sẵn, với các tham số ngữ nghĩa, v.v. Tôi đã biết (nhiều hơn hoặc ít hơn) cách thực hiện bằng cách sử dụng cụm từ thông dụng.

Câu hỏi của tôi là:

  • là lexing/phân tích cách tốt hơn so với regexp cho một mục đích như vậy, hoặc nên tôi chỉ đi với regexp và quên về điều đó?
  • Thư viện này đã tồn tại trong Java chưa?
  • Bạn có biết bất kỳ hướng dẫn nào hiển thị một số thuật toán phân tích cú pháp/lexing mẫu không?

Cảm ơn!

+5

Có, antlr là giải pháp. Bạn không nên sử dụng regex để nâng cao khả năng phân tích cú pháp ngôn ngữ. Một ví dụ rất tốt là trong ngăn xếp tràn - http://stackoverflow.com/questions/1931307/antlr-is-there-a-simple-example –

+0

Thông thường, các ngôn ngữ tùy chỉnh này cho các mục đích cụ thể được gọi là [Ngôn ngữ cụ thể của miền] (http : //en.wikipedia.org/wiki/Domain-specific_language). –

Trả lời

7

Cách làm lexing/phân tích cú pháp tốt hơn so với regexp cho mục đích như vậy hay tôi nên dùng regexp và quên điều đó?

Regexes không thể diễn đạt ngữ pháp đệ quy và cú pháp của bạn dường như yêu cầu ngữ pháp đệ quy. Nếu đây là trường hợp, sau đó regexes chỉ đơn giản là sẽ không giải quyết được vấn đề.

Thư viện này đã tồn tại trong Java chưa?

Đây không phải là vấn đề mà thư viện sẽ giải quyết. Bạn cần phải sử dụng một hệ thống trình tạo phân tích cú pháp (chẳng hạn như Antlr hoặc Javacc) để tạo ra từ khoá và trình phân tích cú pháp, hoặc viết nó/chúng hầu như từ đầu. Cách tiếp cận trước đây có lẽ là tốt hơn ... trừ khi bạn đã thực hiện một chủ đề Uni-level bao gồm lĩnh vực này, hoặc được chuẩn bị để đọc rộng rãi.

Bạn có biết bất kỳ hướng dẫn nào hiển thị một số thuật toán phân tích cú pháp/lexing mẫu không?

Cả Antlr và Javacc đều có tài liệu hướng dẫn mở rộng và ví dụ.

0

Khi không gắn với chỉ Java, bạn có thể sử dụng trình phân tích cú pháp PEG của ngôn ngữ khác hoặc Rebol (có phương ngữ "phân tích cú pháp" tương đương PEG) - hoặc quay lại WAY trở lại biểu tượng hoặc Unicon hoặc ngay bây giờ tại code.google.com/p/objecticon

Đó là thời điểm đáng tiếc khi tôi nhận ra rằng ngôn ngữ nội dung web MIT Curl (www.curl.com) đã chọn regexp cho người dùng mặc dù Curl có macro và cung cấp quyền truy cập đến một AST.

chủ đề chung: Ngữ pháp biểu thức phân tích cú pháp (PEG) và phân tích cú pháp đóng gói nói chung.

Sử dụng Perl đã thừa kế PCRE của chúng tôi, vì vậy chúng tôi có thể làm gì nhưng tránh khi không cần thiết (có antlr và bison ...và không nghi ngờ gì nữa, chúng cũng có vị trí phù hợp dễ dàng)

Lưu ý: Rebol, Icon và Curl là ngôn ngữ dựa trên biểu thức (Biểu tượng có hạn chế theo dõi lại).

tùy chọn out-một-cách khác bao gồm Oz và Mercury (sau lon ra erlang)

Tôi không sử dụng pyPEG bởi vì tôi đang giới hạn trong Python 2.6.6; phân vùng python Lepl không còn được hỗ trợ - nhưng sẽ cài đặt cho 2.6

Tùy chọn phân tích cú pháp trong Python bao gồm YAPPS tại http://theory.stanford.edu/~amitp/yapps/ và nhiều thứ khác; lưu ý: pyparsing thất bại trong việc cài đặt trong một số trăn env của

Và đối với Scala/Java có dự án PEG này: https://github.com/sirthias/parboiled/wiki

Bạn có thể tìm thấy một equiv Java để peg và chân mỗi http://piumarta.com/software/peg/

CiteSeer có Ralph Bài viết của Becket về phân tích cú pháp đóng gói và Mercury (google cho trang web phân tích cú pháp PEG: psu.edu)

Ngoài ra còn có một loạt 3 bài đăng trên blog trong blog AdventuresInMercury.

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