2012-04-02 36 views
14

Bạn có thể cho tôi một số ý tưởng về cách tôi có thể tạo một trình phân tích cú pháp biểu thức toán học đơn giản trong C?Đánh giá hàm toán học từ chuỗi

Người dùng nhập hàm toán học vào chuỗi và từ chuỗi tôi muốn tạo hàm trong C. ví dụ: x + sin(2*x)

->return x + sin(2x);

Cảm ơn trước.

+0

Hãy xem tài liệu Bison, có [ví dụ] (http://www.gnu.org/software/bison/manual/html_node/Infix-Calc.html#Infix-Calc) sẽ hướng dẫn bạn. –

+0

có thể trùng lặp với http://stackoverflow.com/questions/1151127/evaluating-mathematical-expressions, [Trình phân tích cú pháp toán tử C hoặc Objective-C nhanh là gì?] (Http://stackoverflow.com/questions/4892152/what -is-a-nhanh-c-hoặc-mục tiêu-c-math-parser), http://stackoverflow.com/questions/5115872/what-is-the-best-way-to-evaluate-mathematical-expression- in-c/5117028 # 5117028, http://stackoverflow.com/questions/4071456/opensouce-cc-math-expression-parser-library/4071701#4071701 và một số mục khác. – lhf

+0

Hãy thử [TinyExpr] (https://github.com/codeplea/tinyexpr). Nó nằm trong một tệp và tiêu đề mã nguồn C duy nhất. – 131

Trả lời

6

Bạn có thể phân tích cú pháp cụm từ dựa trên thuật toán "Shunting-Yard Algorithm" http://en.wikipedia.org/wiki/Shunting-yard_algorithm. Bạn sẽ cần phải mở rộng để xử lý các cuộc gọi hàm như sin, cos, v.v ...

+0

+1 cho shunting sân. Đây là cách tiếp cận chính xác (đơn giản hóa thuật toán, không có nguy cơ tràn ngăn xếp) để phân tích các tác vụ mà nó có thể xử lý. –

1

Một cách để làm điều đó là sử dụng ký pháp đánh bóng ngược cho các biểu thức và một ngăn xếp cho các toán hạng. Một số mã giả nhanh:

if element is operand 
    push in stack 
else if element is operation 
    pop last 2 elements 
    perform operation 
    push result in stack 

Lặp lại cho đến khi kết thúc biểu thức. Kết quả cuối cùng là phần tử duy nhất trong ngăn xếp.

3

Đây không phải là một điều đơn giản để làm ở tất cả, trong khuôn mặt, đó là một điều khó khăn. Bạn cần một trình phân tích ngữ pháp đầy đủ, được kết hợp với các hằng số/hàm được xác định trước (sin, log, pi, v.v.).

Nếu bạn không có kinh nghiệm trước đây với CI sẽ không khuyến nghị thực hiện việc này, nhưng nếu bạn thực sự muốn thực hiện điều này, hãy xem recursive descent parsing, đây là cách dễ nhất để thực hiện việc này (không đặt gánh nặng lên người dùng) ký hiệu).

Cuối cùng nhưng không kém phần quan trọng bạn nói bạn muốn tạo hàm C từ đầu vào do người dùng tạo. Điều này gần như luôn luôn là một điều sai lầm để làm - tạo mã từ đầu vào của người dùng, thay vào đó cách tiếp cận dễ nhất là xử lý trước để tạo ra một biểu diễn trung gian có thể được thực thi một cách hiệu quả.

+0

Tôi sẽ dựa vào đó bạn có lẽ nên nghiên cứu [BNF (Backus-Naur Form)] (http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form) phán quyết – Eregrith

+0

Tôi sẽ thứ hai rằng đây không phải là một điều đơn giản để làm. Nó không phải là khủng khiếp, trên thực tế nó là khá thanh lịch, nhưng nó không có nghĩa là đơn giản. Đệ quy phong nha là phương pháp đơn giản nhất, điều hành ưu tiên là phức tạp hơn nhưng đáng kể phức tạp hơn –

0

Viết trình phân tích biểu thức và bộ đánh giá là một trong các ví dụ thông thường được sử dụng khi thảo luận phân tích kỹ thuật viết. Ví dụ: bạn có thể xem tài liệu về flex/bison hoặc lex/yacc. Điều đó sẽ có các ví dụ về việc xây dựng các trình đánh giá trình phân tích cú pháp/biểu thức.

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