使用 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)
max(min(2^3, 3^2), 10*1.5-7)
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 |
max(x, y) |
x, y 中的较大值 | max(2, 3) = 3 |
min(x, y) |
x, y 中的较小值 | min(2, 3) = 2 |
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 one 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
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 Demo go test go build ./math-engine
也可以直接下载已编译好的二进制文件,直接运行:
实现细节
请阅读我的博客文章:用 Go 实现一个完整的数学表达式计算引擎
TODO
已实现
+
-
*
/
%
^
1.2e7
、 1.2e-7
()
1+2*6/4+(456-8*9.2)-(2+4^5)*2e3+1.2e-2
123_456_789
sin, cos, tan, cot, sec, csc
abs, ceil, floor, sqrt, cbrt
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 ^ ------------
待实现
本文基于高通msm8939/8994平台文档及源码。 说明文档: vendor/qcom/proprietary/thermal-engine/readme.txt; 源码文件: venror/qcom/proprietary/thermal-engine/thermal_config_v2.c; 实际配置文件: vendor/qcom/proprietary/thermal-en
什么是这里所说的360全景h5页面?查看下面的案例进行了解: 开发项目:http://game.flyh5.cn/resources/game/wechat/zjh/fangtuo/index.html 案例1:http://cpic18ny1.energytrust.com.cn/ 案例2:https://open.weixin.qq.com/connect/oauth2/authorize?
安装 @angular/cli 由于npm的版本问题出现 Unsupported engine 导致安装不成功的问题解决记录 $ npm install -g @angular/cli npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular/cli@11.1.4', npm WARN EB
Evaluates simple math expression like 2*4 or 10/2 and outputs its result. You can use \ operator which is equivalent to round(a/b). 计算简单的数学表达式,比如2*4 或 10/2,并输出结果。\ 操作符结果同 round(a/b)。 Very useful in CS
由于问题不清楚,我先前的问题被搁置。 用特定查询再次过帐 我的要求是使用PHP解决任何数学复杂表达式。例如, 如果我有一个字符串“1(12)/34”,使用BODMAS规则,我必须求解它。但我也必须得到所有单独的步骤。 我提到的两个网站是: http://www.careerbless.com/calculators/ScientificCalculator/ http://web2.0calc.c
问题内容: 这将返回以下错误: 我知道可以解决此问题,但是难道没有更好,更重要的是更安全的方法来评估存储在字符串中的数学表达式吗? 问题答案: 可用于解析数学表达式。特别是, 显示了如何解析基本算术表达式。下面,我将fourFn重新包装为一个数字解析器类,以便于重用。
Math can be applied directly to variable values. 数学运算可以直接应用到变量 Example 3-5. math examples 例 3-5.数学运算的例子 {$foo+1} {$foo*$bar} {* some more complicated examples *} {$foo->bar-$bar[1]*$baz->foo-
使用DevTools控制台的求值计算功能,探测页面上任何项的状态。 DevTools控制台允许您以特别的方式了解页面中项的状态。他可以计算JavaScript的任何表达式,控制台本身支持几个功能。 TL;DR 计算键入的表达式。 使用其中一个快捷方式选择元素。 使用 inspect()检查DOM元素和JavaScript对象。 使用$0 - 4访问最近选择的元素和对象。 操作表达式 在控制台中输入
问题内容: 我想从字符串中计算数学表达式。我已经读过解决方案是使用eval()。但是当我尝试运行以下代码时: 它给了我以下错误: 解析错误:语法错误,C:\ xampp \ htdocs \ eclipseWorkspaceWebDev \ MandatoryHandinSite \ tester.php(4)中意外的$ end:第1行上的eval()代码 有人知道解决这个问题的方法吗? 问题答案
我正在寻找一个JAVA库来解析 我的要求: 支持所有的值类型(例如int,双,布尔,String等) 支持所有已知的数学 有什么建议吗?
主要内容:示例在MS Access中,表达式就像Excel中的公式。 这包括一些可以单独使用或组合使用以产生结果的元素。 表达式可以包括运算符,常量,函数和标识符。 表达式可用于执行各种任务,从检索控件的值或将查询条件提供给查询来创建计算的控件和字段,或者为报表定义组级别。 在本章中,我们将着重于创建一个称为计算表达式的非常具体的表达式。创建几个计算的字段,这些字段将计算并显示不存储在数据库本身任何位置的数据,