• 授权协议:Apache
  • 开发厂商:-
  • 软件语言:Google Go
  • 更新日期:2019-06-08
math-engine

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

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

使用 Go 实现的数学表达式微型计算引擎,无任何依赖,相对比较完整的完成了数学表达式解析执行,包括词法分析、语法分析、构建AST、运行。DemoTODO已实现 加 +  减 -  乘 *  除 /  取余 %  整数次方 ^  科学计数法 e.g. 1.2e7  括号 ()  混合运算 e.g. 1+26/4+(456-89.2)-(2+4^5)  友好的长数字 e.g. 123_456_789  友好的错误消息 e.g.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
^
------------待实现 科学计数法 e.g. 1.2-e7  精确的浮点计算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.6Compilego version 1.12go test
go build
./math-engine也可以直接下载已编译好的二进制文件,直接运行:Github Releases实现细节请阅读我的博客文章:用 Go 实现一个完整的数学表达式计算引擎

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

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