2010-10-24 48 views
15

Tôi đang tìm một bộ đánh giá cho các biểu thức điều kiện đơn giản. Biểu thức phải bao gồm các biến (chỉ đọc), chuỗi, số và một số toán tử cơ bản.Tìm kiếm một bộ đánh giá biểu thức

Ví dụ: biểu một cái gì đó như thế này:

${a} == "Peter" && (${b} == null || ${c} > 10) 

Cho đến nay tôi thực hiện một thay "ma thuật" phân tích cú pháp mà trả về một AST mà tôi có thể đánh giá, nhưng tôi không thể tin rằng tôi là người đầu tiên để giải quyết vấn đề đó.

Tôi có thể sử dụng mã hiện tại nào?

+0

Bạn muốn đánh giá ngôn ngữ/ngữ pháp nào? Có phải bạn đã tạo ra thứ gì đó không? Java phải làm gì với điều này? –

+2

Tôi đoán OP muốn một cái gì đó chạy trên JVM. –

+0

Chúng tôi đã sử dụng JEP trên một dự án (http://www.singularsys.com/jep/) nhưng tôi thực sự thích một tương đương nhỏ, có khả năng thích ứng thực sự có thể sản xuất bytecode cho một chức năng vì lý do hiệu suất. Chúng tôi đã từ bỏ JEP vì lý do này và kết thúc việc mã hóa một số lượng lớn các lớp Java. Có lẽ một linh hồn đáng sợ với ANTLR và BCEL có thể làm được điều này? – andersoj

Trả lời

3

Tại sao bạn không sử dụng Tê giác? Đó là một công cụ JavaScript đã có mặt trong JDK.

Nó có thể đánh giá bất cứ điều gì bạn muốn viết bằng JS .. hãy xem here

+0

Trên thực tế, chúng tôi đang sử dụng Rhino cho các tập lệnh tùy chỉnh lớn hơn. Nhưng tôi không muốn đưa ra những biểu hiện nhỏ bé đầy đủ sức mạnh của một ngôn ngữ kịch bản. – Stroboskop

3

này đơn giản recursive descent parser đánh giá hằng số như các chức năng được đặt tên không có thông số.

+3

Khi tôi thay thế ma thuật bằng khoa học, tôi sẽ đi theo cách đó. Nhưng ngay bây giờ tôi đang tìm một giải pháp hiện có. – Stroboskop

11

Bạn đã xem MVEL? Chúng cung cấp getting started guideperformance analysis.

Dưới đây là một trong những ví dụ đơn giản của họ:

// The compiled expression is serializable and can be cached for re-use. 
CompiledExpression compiled = MVEL.compileExpression("x * y"); 

Map vars = new HashMap(); 
vars.put("x", new Integer(5)); 
vars.put("y", new Integer(10)); 

// Executes the compiled expression 
Integer result = (Integer) MVEL.executeExpression(compiled, vars); 
assert result.intValue() == 50; 

Ngoài (trả lời câu hỏi của riêng tôi) MVEL dường như cung cấp một số hỗ trợ cho bytecode generation.

lựa chọn thay thế khác, chọn lọc từ các câu trả lời trên và của riêng tôi:

2

Rất đơn giản và dễ sử dụng alternative với rất nhiều chức năng được xây dựng sẵn cho chuỗi, ngày và định dạng số.

Thư viện cũng cho phép dễ dàng bổ sung các chức năng tùy chỉnh. Rất nhiều ví dụ có sẵn trên trang git. Một ví dụ đơn giản sử dụng các biến

ExpressionsEvaluator evalExpr = ExpressionsFactory.create("LEFT(City, 3)"); 
    Map<String, Object> variables = new HashMap<String, Object>(); 
    variables.put("City", "New York"); 
    assertEquals("New", evalExpr.eval(variables)); 
+0

Điều đó có vẻ thực sự hứa hẹn cho một giải pháp ra khỏi hộp. Nhưng cuối cùng tôi đã đi tìm Antlr và xây dựng ngôn ngữ biểu hiện của riêng tôi. – Stroboskop

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