math-engine v2.0,數學表達式解析計算引擎

2021-01-11 開源中國
更新日誌: 增加 常量 pi 增加 三角函數支持 sin(), cos(), tan(), cot(), sec(), csc() 增加 三角函數參數調整,可選 弧度RadianMode、角度AngleMode 增加 輔助函數 abs(), ceil(), floor(), round(), sqrt(). cbrt() 增加 godoc.org 支持 增加 頂級函數 ParseAndExec 增加 單元測試 修復 解析錯誤 e.g. (((Math-Engine

使用 Go 實現的數學表達式解析計算引擎,無任何依賴,相對比較完整的完成了數學表達式解析執行,包括詞法分析、語法分析、構建AST、運行。

能夠處理的表達式樣例:

1+127-21+(3-4)*6/2.5 (88+(1+8)*6)/2+99 123_345_456 * 1.5 - 2 ^ 4 -4 * 6 + 2e2 - 1.6e-3 sin(pi/2)+cos(45-45*1)+tan(pi/4) 99+abs(-1)-ceil(88.8)+floor(88.8)Demo

Method Support symbol explanation e.g. + 加,plus 1+2 = 3 - 減,sub 8-3.5 = 4.5 * 乘,multiply 2*3 = 6 / 除,division 5/2 = 2.5 % 取餘,remainder 5%2 = 1 ^ 整數次方,integer power 2^3 = 8, 3^2 = 9 e 科學計數法,E-notation 1.2e3 = 1200,1.2e-2 = 0.012 () 括號,brackets (2+3)*4 = 20 _ 數字分隔符,number separator 123_456_789 = 123456789 pi π pi = 3.141592653589793 sin(x) 正弦函數,sine sin(pi/2) = 1 cos(x) 餘弦函數,cosine cos(0) = 1 tan(x) 正切函數,tangent tan(pi/4) = 1 cot(x) 餘切函數,cotangent cot(pi/4) = 1 sec(x) 正割函數,secant sec(0) = 1 csc(x) 餘割函數,cosecant csc(pi/2) = 1 abs(x) 絕對值,absolute value abs(-6) = 6 ceil(x) 向上取整 ceil(4.2) = 5 floor(x) 向下取整 floor(4.8) = 4 round(x) 四捨五入取整 round(4.4) = 4, round(4.5) = 5 sqrt(x) 平方根,square root sqrt(4) = 2 cbrt(x) 立方根,cube root cbrt(27) = 3 Usage

你可以直接引用該庫嵌入到自己的程序中:

go get -u github.com/dengsgo/math-engine

在代碼中引入:

import "github.com/dengsgo/math-engine/engine"

e.g. 1 直接調用解析執行函數 :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + 2 * 6 / 4 + (456 - 8 * 9.2) - (2 + 4 ^ 5)" // call top level function r, err := engine.ParseAndExec(s) if err != nil { fmt.Println(err) } fmt.Printf("%s = %v", s, r)}

e.g. 2 依次調用函數,手動執行 :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + 2 * 6 / 4 + (456 - 8 * 9.2) - (2 + 4 ^ 5)" exec(s)}// call engine// one by onefunc exec(exp string) { // input text -> []token toks, err := engine.Parse(exp) if err != nil { fmt.Println("ERROR: " + err.Error()) return } // []token -> AST Tree ast := engine.NewAST(toks, exp) if ast.Err != nil { fmt.Println("ERROR: " + ast.Err.Error()) return } // AST builder ar := ast.ParseExpression() if ast.Err != nil { fmt.Println("ERROR: " + ast.Err.Error()) return } fmt.Printf("ExprAST: %+v\n", ar) // AST traversal -> result r := engine.ExprASTResult(ar) fmt.Println("progressing ...\t", r) fmt.Printf("%s = %v\n", exp, r)}

編譯運行,應該可以看到如下輸出:

ExprAST: {Op:- Lhs:{Op:+ Lhs:{Op:+ Lhs:{Val:1} Rhs:{Op:/ Lhs:{Op:* Lhs:{Val:2} Rhs:{Val:6}} Rhs:{Val:4}}} Rhs:{Op:- Lhs:{Val:456} Rhs:{Op:* Lhs:{Val:8} Rhs:{Val:9.2}}}} Rhs:{Op:+ Lhs:{Val:2} Rhs:{Op:^ Lhs:{Val:4} Rhs:{Val:5}}}}progressing ... -639.61+2*6/4+(456-8*9.2)-(2+4^5) = -639.6

TrigonometricMode

三角函數的參數類型默認為弧度RadianMode,e.g. sin(pi/2) = 1.

你可以通過設置 TrigonometricMode 調整參數類型,可選 弧度RadianMode、角度AngleMode,e.g. :

import "github.com/dengsgo/math-engine/engine"func main() { s := "1 + sin(90)" engine.TrigonometricMode = engine.AngleMode engine.ParseAndExec(s) // will return 2, nil s = "1 + sin(pi/2)" engine.TrigonometricMode = engine.RadianMode engine.ParseAndExec(s) // will return 2, nil}

Document

godoc.org/github.com/dengsgo/math-engine/engine

Compile

go version 1.12

# Compile Demogo testgo build./math-engine

也可以直接下載已編譯好的二進位文件,直接運行:

Github Releases

實現細節

請閱讀我的博客文章:用 Go 實現一個完整的數學表達式計算引擎

TODO已實現  加 +  減 -  乘 *  除 /  取餘 %  整數次方 ^  科學計數法 e.g. 1.2e7、 1.2e-7  括號 ()  混合運算 e.g. 1+2*6/4+(456-8*9.2)-(2+4^5)*2e3+1.2e-2  友好的長數字 e.g. 123_456_789  三角函數 e.g. sin, cos, tan, cot, sec, csc  常量 pi  輔助函數 e.g. abs, ceil, floor, sqrt, cbrt  友好的錯誤消息 e.g.

input /> 123+89-0.0.9ERROR: strconv.ParseFloat: parsing "0.0.9": invalid syntaxwant '(' or '0-9' but get '0.0.9'--123+89-0.0.9 ^--

待實現

相關焦點

  • 微軟發分布式圖處理引擎GraphEngine1.0
    【IT168 資訊】5月21日消息,由微軟亞洲研究院開發的Graph Engine 1.0預覽版正式發布。Graph Engine是一個基於內存的分布式大規模圖數據處理引擎。在此之前,它在學術界更廣為人之的名稱是Trinity。  大規模圖處理在很多領域扮演著重要的角色。
  • 1700頁數學筆記火了!全程敲代碼,速度飛快,硬核小哥教你上手
    制表位(Tab stop)——也就是你可以通過按Tab 和Shift+Tab跳轉到的位置——用$1、 $2、......來表示,最後一個用$0。行內和數學顯示在記數學筆記的過程中,最常用的兩個片段是mk和dm。它們負責啟動數學模式。第一個片段用於「行內數學」,第二個用於「顯示數學」。
  • JFinal 3.0 發布,重新定義模板引擎
    JFinal Template Engine 經過公司內部開發者近三個月的試用時間,直到每位開發者都沉醉其中後才放出 jfinal 3.0 版本。2:獨創 DLRD(Double layer Recursive Descent) 語法分析算法針對模板文件大量純文本摻雜少量代碼特徵,獨創 DLRD 語法分析算法,將指令與表達式的語法分析劃分在不同的層次之中相比傳統遞歸下降語法分析算法,複雜度降到極致,代碼量少到極致僅 215 行代碼搞定 statement 語法分析。
  • 初識分布式圖資料庫 Nebula Graph 2.0 Query Engine
    一、概述分布式圖資料庫 Nebula Graph 2.0 版本相比 1.0 有較大改動,最明顯的變化便是,在 1.0 版本中 Query、Storage 和 Meta 模塊代碼不作區分放在同一個代碼倉中,而 Nebula Graph 2.0 開始在架構上先解耦成三個代碼倉:nebula-graph、nebula-common 和 nebula-storage,其中 nebula-common
  • 【第160期】指尖上的正則表達式–入門篇
    正則表達式被作為用來描述其稱之為「正則集的代數」的一種表達式,因而採用了「正則表達式」這個術語。之後一段時間,人們發現可以將這一工作成果應用於其他方面。Ken Thompson就把這一成果應用於計算搜索算法的一些早期研究,Ken Thompson是 Unix的主要發明人,也就是大名鼎鼎的Unix之父。
  • 表達式解析器--jeval試用 - OSCHINA - 中文開源技術交流社區
    jeval是為為你的Java應用程式提供可加入的、高性能、數學、  布爾和函數表達式的解析和運算的高級資源包。
  • Cocos2d-x v3.3-RC0 發布說明! - OSCHINA - 中文開源技術交流社區
    我們很高興地宣布Cocos2d-x v3.3-RC0發布了!
  • python計算平方和平方根的方法
    平方是一種運算,比如,a的平方表示a×a,簡寫成a,也可寫成a×a(a的一次方乘a的一次方等於a的2次方),例如4×4=16,8×8=64,平方符號為2。相反的開平方就是√ ̄(這裡我們只考慮正數),也就是求平方根。例如:16的平方根有4,64的平方根有8。
  • 如何學習AE表達式以及一些常用的使用方法
    什麼是表達式關於表達式,我們可以這樣更直觀去理解,表達式是我們通過一些代碼,去實現參數的轉移、計算,以便我們更有效率的去控制某個參數的變化,達到關鍵幀比較難實現的效果。什麼時候我們需要用到表達式1 當我們想使用一個參數的數值去控制另一個參數的數值時,我們可以使用表達式將數值賦予另一個想要控制的參數上。2 當使用關鍵幀去製作一個效果的時候,不容易做的很流暢而且效率不高,這時候我們可以使用表達式去控制。
  • 正則表達式和 CPU 100%有什麼故事?
    看到這裡,我們基本可以推斷,這個正則表達式就是導致 CPU 利用率居高不下的兇手!於是,我們將排錯的重點放在了那個正則表達式上:^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)
  • python教程之python數學運算
    ,math.isinf(float(b))) #輸出true#decimal模塊:decimal意思為十進位,這個模塊提供了十進位浮點運算支持from decimal import Decimalnum1=Decimal('0.5534')num2=Decimal('0.427')num3=Decimal('0.37')
  • 高中數學複習,指數函數重要題型匯總2及解析
    高中數學複習,指數函數重要題型匯總2及解析。07、函數表達式含有絕對值時,可以先去絕對值,再研究其性質,去絕對值的過程實際上就是分類討論,一般分兩類:分別令絕對值中的式子≥0和<0;去掉絕對值後,就可以根據指數函數的性質求或者判斷其單調性。
  • 2.1 數學模型
    其中 Kxx、Kyy和Kzz是沿x、y和z坐標軸的水力傳導率的值,它們假定平行於水力傳導率的主軸(L/T);H是水頭(L);W是每單位體積的體積通量,代表水的源和/或匯,其中W<0.0用於流出地下水系統,w>0.0用於流入系統(T-1);Ss是多孔材料(L-1)的儲水率;t是時間(t)對於方程2—1的推導,參見例如Rushton和RexSaw
  • 2018考研數學:歷年必考知識點極限的計算
    極限是考研數學每年必考的內容,分值在10分左右。極限的計算是考研數學的重難點,現分別從涉及的知識點、考查方式、計算常規方法、求解步驟等幾個個方面進行分析。如果這部分掌握了複習的要點,還是很容易得分。處理方式一般有以幾個:一是通過未知極限函數去湊已知極限的極限函數形式,然後用極限的四則運算求出極限;二是通過已知極限的極限函數去湊未知極限函數形式,然後有極限的四則運算算極限;三是通過函數極限與無窮小關係,從已知極限中解出未知的函數部分,然後把表達式帶入到未知的極限函數中,求出極限。極限存在性證明,這類題通常是以證明數列極限存在性為主。
  • 淺談實測測量電路和示波器獲得波形的數學表達式
    淺談實測測量電路和示波器獲得波形的數學表達式 卓晴 發表於 2020-12-28 15:26:29 實驗要求 在第一次作業中的第二小題,練習了根據信號的波形寫出對應信號的表達式
  • 遊戲開發引擎 Cryengine 在 GitHub 上公開全部原始碼
    Crytek在GitHub上公開了CRYENGINE引擎的原始碼Crytek在今年3月宣布新一代引擎CryEngine 5的同時,引入了用戶自由定價的商業模式,開發者隨意支付一筆費用就能訪問引擎的功能集和完整原始碼,無需支付任何版稅。在GitHub上公開原始碼應該只是這一策略的延續。
  • 高一數學必修2,八類直線,七種表達式詳細講解,十個考點早知道
    高一數學必修2,八類直線,七種表達式詳細講解,十個考點早知道本課程適用於高一以及高一以上的學生,請根據自身水平進行選擇性的閱讀。文章中黑色標記為重點掌握內容。希望能夠引起讀者的反思。圖像如下:例2 x+y=0按照上面說的方法,令x=0,y=0,再隨便取一個點,令y=1,x=-1,因此描出兩個點(0,0)和(-1,1)即可。
  • 【必學】AE常用表達式解析
    >中括號裡面的數值0表示---XYZ在AE中定義的是 X軸用0表示 Y用1表示 Z用2表示。和5.就是smooth(0.2,5)0.2表示--每多少秒進行平滑。loopOut(type="cycle",numkeyframes=0)這是個圓形的類型的循環,就是對一組動作進行循環。loopOut(type="continue")這是計算機繼續計算未完成的運動。
  • 精選中小學常用Python數學函數
    注意,round(a,b)不需要調用數學函數庫。>>>4**0.5>>>26.開方方法一:直接使用算術運算符中的冪運算(**)>>>4**0.5>>>2方法二:使用 math.sqrt( ) 函數,只能開平方>>>#調用數學函數庫>>>importmath>>>math.radians(57.29578)>>>0.9948376736367679