math-engine Go 实现的数学表达式解析计算引擎 math-engine

agolangf • 3199 次点击    
这是一个分享于 的项目,其中的信息可能已经有所发展或是发生改变。
使用 Go 实现的数学表达式微型计算引擎,无任何依赖,相对比较完整的完成了数学表达式解析执行,包括词法分析、语法分析、构建AST、运行。 [Demo](http://wx3.sinaimg.cn/large/c2a95e3dly1g4i4unamlhg211o0iokk1.gif) ## TODO ### 已实现 *  加 + *  减 - *  乘 * *  除 / *  取余 % *  整数次方 ^ *  科学计数法 e.g. 1.2e7 *  括号 () *  混合运算 e.g. 1+26/4_+_(456_-_89.2)-(2+4^5) *  友好的长数字 e.g. 123_456_789 *  友好的错误消息 e.g. <pre>input /&gt; 123+89-0.0.9 ERROR: strconv.ParseFloat: parsing &#34;0.0.9&#34;: invalid syntax want &#39;(&#39; or &#39;0-9&#39; but get &#39;0.0.9&#39; ------------ 123+89-0.0.9 ^ ------------</pre> ### 待实现 *  科学计数法 e.g. 1.2-e7 *  精确的浮点计算 ## Usage 你可以直接引用该库嵌入到自己的程序中: <pre>go get -u github.com/dengsgo/math-engine</pre> 在代码中引入: <pre>import &#34;github.com/dengsgo/math-engine/engine&#34;</pre> e.g. : <pre>import &#34;github.com/dengsgo/math-engine/engine&#34; func main() { s := &#34;1 + 2 * 6 / 4 + (456 - 8 * 9.2) - (2 + 4 ^ 5)&#34; exec(s) } // call engine func exec(exp string) { // input text -&gt; []token toks, err := engine.Parse(exp) if err != nil { fmt.Println(&#34;ERROR: &#34; + err.Error()) return } // []token -&gt; AST Tree ast := engine.NewAST(toks, exp) if ast.Err != nil { fmt.Println(&#34;ERROR: &#34; + ast.Err.Error()) return } // AST builder ar := ast.ParseExpression() if ast.Err != nil { fmt.Println(&#34;ERROR: &#34; + ast.Err.Error()) return } fmt.Printf(&#34;ExprAST: %+v\n&#34;, ar) // AST traversal -&gt; result r := engine.ExprASTResult(ar) fmt.Println(&#34;progressing ...\t&#34;, r) fmt.Printf(&#34;%s = %v\n&#34;, exp, r) }</pre> 编译运行,应该可以看到如下输出: <pre>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.6 1+2*6/4+(456-8*9.2)-(2+4^5) = -639.6</pre> ## Compile go version 1.12 <pre>go test go build ./math-engine</pre> 也可以直接下载已编译好的二进制文件,直接运行: [Github Releases](https://github.com/dengsgo/math-engine/releases) ## 实现细节 请阅读我的博客文章:[用 Go 实现一个完整的数学表达式计算引擎](https://www.yoytang.com/math-expression-engine.html)
授权协议:
Apache
开发语言:
Google Go 查看源码»
操作系统:
跨平台
3199 次点击  
加入收藏 微博
1 回复  |  直到
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传