formula

从零开始撸一个可扩展函数的数学公式解析轮子(第2部分)

前文请查看:从零开始撸一个可扩展函数的数学公式解析轮子(第1部分) 3. 实现语法树转换 在令牌流的实现中我们讨论了对公式的基本验证,但是对于复杂逻辑的验证,光令牌流则并不能满足需求。比如,我们想要验证多层函数在令牌流层面上实现就很不舒服。所以我们还需要在这之上进行语法树解析。 3.1. 实现原理 首先由于我们需求并不需要实现平衡树,所以只需要实现一个多叉树即可。下面举几个从令牌流解析成树形结构栗子: 比如公式:a+b*30-abs(a-b, c, count(d)) 转换为令牌流为(以|分割令牌字符): a|+|b|*|30|-|abs(

  • bakajinsei
    bakajinsei
4 min read
formula

从零开始撸一个可扩展函数的数学公式解析轮子(第1部分)

0. 前言 在某一天业务方需要做一个可通过自定义函数录入的功能来帮助自己动态配置一些数值的计算,而面临的问题是只有java开源程序能够进行公式的动态配置和计算。作为一个强迫症患者,npm上现有的包并不能满足需求,于是就踏上了从零开始撸公式解析器的道路。 友情提示:查看源码请拉到最后 1. 分析 我们的公式解析器需要能够对语法进行验证,保证公式输入的内容是符合语法且可以任意分拆操作的。同时,还需要对自定义的函数参数进行验参。于是我们把整个解析划分成了两部分。 令牌流解析:把公式解析成顺序的令牌 语法树解析:把解析完成的令牌流转化成语法树内容 2. 实现令牌流的思路 由于令牌流中并不考虑公式的执行问题,所以只需从左至右对一个公式字符串使用正则进行解析,并把相同的内容合并生成一个令牌。 2.1. 带变量的简单四则运算解析 如10+a我们可以分拆为10,+,a 3个令牌。 我们会把每个令牌形成一个如下内容的对象:

  • bakajinsei
    bakajinsei
4 min read