在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用 Go 实现的数学表达式微型计算引擎,无任何依赖,相对比较完整的完成了数学表达式解析执行,包括词法分析、语法分析、构建AST、运行。 TODO已实现
input /> 123+89-0.0.9 ERROR: strconv.ParseFloat: parsing "0.0.9": invalid syntax want '(' or '0-9' but get '0.0.9' ------------ 123+89-0.0.9 ^ ------------ 待实现
Usage你可以直接引用该库嵌入到自己的程序中: go get -u github.com/dengsgo/math-engine 在代码中引入: import "github.com/dengsgo/math-engine/engine" e.g. : 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 func 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.6 1+2*6/4+(456-8*9.2)-(2+4^5) = -639.6 Compilego version 1.12 go test go build ./math-engine 也可以直接下载已编译好的二进制文件,直接运行: 实现细节请阅读我的博客文章:用 Go 实现一个完整的数学表达式计算引擎 |
请发表评论