2012-04-02 100 views
14

你能給我一些關於如何在C中創建一個簡單的數學表達式解析器的想法嗎?從字符串評估數學函數

用戶在一個字符串和我想在C 比如建立一個功能串入一個數學函數。 x + sin(2*x)

- >return x + sin(2x);

在此先感謝。

+0

看一看野牛文件以外,還有[實例](http://www.gnu.org/software/bison/manual/html_node/Infix-Calc.html#Infix-Calc),它會引導你。 – 2012-04-02 13:11:00

+0

http://stackoverflow.com/questions/1151127/evaluating-mathematical-expressions,[什麼是快速C或Objective-C數學解析器?]可能的重複(http://stackoverflow.com/questions/4892152/what -is-a-fast-c-or-objective-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,和其他幾個。 – lhf 2012-04-02 13:35:23

+0

嘗試[TinyExpr](https://github.com/codeplea/tinyexpr)。它在一個C源代碼文件和頭文件中。 – 131 2016-01-22 21:32:04

回答

6

您可以分析基於「調度場算法」 http://en.wikipedia.org/wiki/Shunting-yard_algorithm表達。您將需要擴充以處理爲正弦,餘弦等函數調用等...

+0

+1的調車場。這是解決它可以處理的任務的正確方法(算法簡單,沒有堆棧溢出的風險)。 – 2012-04-02 14:19:21

1

一種方式做到這一點是要使用的表達逆波蘭表示法以及用於操作數堆棧。 一些快速的僞代碼:

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

重複,直到表達式結束。最終結果是堆棧中唯一的元素。

3

這不是一件簡單的事情,面對面,這是一件很難的事情。您需要一個完整的語法分析器,並結合預定義的常量/函數(sin,log,pi等)。

如果你有CI沒有廣泛以往的經驗將disrecommend這樣做,但如果你真的想在recursive descent parsing做到這一點看看這無疑是做到這一點(不把負擔對用戶最簡單的方法,如逆波蘭符號)。

最後但並非最不重要的是,你說你想從用戶生成的輸入創建一個C函數。這幾乎總是一件錯誤的事情 - 從用戶輸入生成代碼,而最簡單的方法是預處理創建可以高效執行的中間表示。

+0

我會在你應該研究[BNF(Backus-Naur Form)](http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form)裁決 – Eregrith 2012-04-02 13:11:25

+0

我會第二,這不是一個簡單的事情要做。這並不可怕,實際上它非常優雅,但絕非簡單。遞歸下降是最簡單的方法,運營商的優先級更高,但相當複雜 – 2012-04-02 13:13:40

0

寫一個表達式解析器和評估器使用時討論解析器的寫作手法通常的例子之一。 例如,您可以查看flex/bison或lex/yacc的文檔。這將有構造解析器/表達式評估器的例子。