2010-02-18 10 views
9

Tôi đang viết một ứng dụng cho phép người dùng nhập biểu thức logic. Tôi cần khả năng đánh giá biểu thức boolean được nhập vào lúc chạy và đang tìm cả trình phân tích cú pháp và trình xác thực expressoin.Trình phân tích cú pháp Boolean và Math

Parser
Các phân tích cú pháp cần phải mất một biểu thức boolean như là một chuỗi và trả về đúng/sai.

Ví dụ:

 
string expression = "(1 == 1) && (1 > 0)"; 
Parser parser = new Parser(); 
boolean result = parser.parse(expression); // Result should be True. 

Ngoài xử lý biểu thức boolean Tôi cũng cần nó để xử lý Math.

 
expression = "((1 + 1 * 2) == 1)"; 
result = parser.parse(expression); // Result should be False. 

Validate
Vì vậy mà tôi có thể nói cho người dùng nếu có một vấn đề với các biểu hiện được nhập Tôi cũng cần một cách để xác nhận các cú pháp.

Tôi đang làm việc trong C# bằng .NET Compact Framework, nhưng nếu bạn biết điều gì đó được viết bằng ngôn ngữ khác có thể hữu ích.

Cảm ơn bạn đã trợ giúp bạn có thể cung cấp. Tom

Trả lời

3

http://www.antlr.org

văn phạm tiếng ANTLR thể được thiết kế để cho phép cả hai phân tích và đánh giá.

Dưới đây là một ví dụ: http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator

+0

+1 cho ANTLR. Nếu bạn nhìn vào điều này và bỏ qua nó, nghĩ rằng đây là quá nhiều rắc rối, hãy xem xét lại. Tôi khuyên bạn nên sử dụng ANTLRworks như một công cụ phát triển ngữ pháp và có nó xuất ra các lớp lexer và phân tích cú pháp của nó vào cây dự án Visual Studio của bạn. Nó tương đối liền mạch và dễ dàng lặp lại ngữ pháp của bạn và nhanh chóng nhìn thấy hiệu ứng của nó trong thế giới .NET của bạn. –

+0

Bởi "bạn" ở trên, tôi có nghĩa là Thomas OP. –

+0

@Chris Nông dân: Đây là mục tiêu nhắm mục tiêu C# Compact Framework ... có thể hơi nặng một chút ... – t0mm13b

0

Tôi không biết bất kỳ thư viện nào để thực hiện việc này dễ dàng hơn, nhưng bạn thực sự chỉ có hai vấn đề phụ ở đây. Bạn cần phải xây dựng một infix để chuyển đổi postfix, sau đó viết một máy tính cơ bản cho các hoạt động boolean và toán học.

Khi bạn đã xây dựng xong cây/ngăn xếp boolean, hãy bắt đầu thực hiện các thao tác. Nếu bạn có bất kỳ thứ gì không phải là số, hãy đánh giá nó bằng cách gửi chuỗi/biểu thức tới máy tính số học thực hiện chuyển đổi hậu tố sau đó và sau đó trả về một giá trị.

Nếu bạn google "infix to postfix" và "stack rpn calculator", bạn có thể tìm thêm tài nguyên.

+2

Nếu bạn có thể loại bỏ ngôn ngữ bằng "eval", tuy nhiên, sự cố được giải quyết. Bạn tìm kiếm đúng hay sai, và cho mọi thứ khác, bạn biết bạn không hợp lệ. –

+0

Tôi nghĩ rằng "eval" hoàn toàn là sai lầm để đi. Nó có khả năng dễ dàng, nhưng nó nguy hiểm cho phép mọi người viết bất kỳ mã nào hợp pháp trong ngôn ngữ của bạn. Nó tốt hơn, IMHO, để có một ngữ pháp riêng biệt và hạn chế có sẵn cho các biểu thức này. –

0

Bạn có thể sử dụng thư viện dotMath để thực hiện việc này.

0

Dưới đây là một phân tích cú pháp đánh giá tuyệt vời trên Codeproject, sử dụng phương thức eval và không dựa vào CodeDOM hoặc bất cứ điều như thế. Dưới đây là một bài viết tuyệt vời về cách xây dựng một expression evaluator bằng Antlr, cũng trên cùng một trang ..

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

0

Loại thứ này là bánh mì và bơ của F #. Bạn có thể thử điều đó. Để phân tích cú pháp, sử dụng gốc đệ quy, sau đó bạn có thể chạy trên cây kết quả. Nếu bạn có quyền kiểm soát ngôn ngữ nhập liệu, bạn có thể thực hiện bằng thao tác trích dẫn.

2

Giả sử bạn có thể thay đổi cú pháp của bạn một chút, chúng ta hãy một cơ sở dữ liệu nhúng làm công việc cho bạn với một truy vấn như thế này T-SQL:

select case when <Expression> then 1 else 0 end as Result 

Sử dụng ví dụ của bạn:

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result 
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result 
+1

Theo câu hỏi, biểu thức thực sự được nhập bởi người dùng. Vì vậy, giải pháp của bạn dễ bị tiêm SQL. –

6

dự án của chúng tôi đang sử dụng NCalc (với ANTLR bên dưới để lexing/phân tích cú pháp) và chúng tôi rất hài lòng với nó.

NCalc là biểu thức toán học bộ đánh giá trong .NET. NCalc có thể phân tích bất kỳ biểu thức nào và đánh giá kết quả, bao gồm các tham số tĩnh hoặc động và các chức năng tùy chỉnh.

Ứng dụng của chúng tôi yêu cầu phải được biên dịch chéo cho cả Khung đầy đủ và nhỏ gọn. Với những điều chỉnh tương đối đơn giản, chúng tôi đã có thể làm cho cả NCalc và ANTLR hoạt động cho cả hai khuôn khổ.