`
Surmounting
  • 浏览: 62470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spads 公式解析系统 - Java

阅读更多

很多网络应用中,涉及到一些内部运算的具体求值逻辑并不能够在开发阶段就定下来。这些逻辑需要随着使用,探测用户反应,不断修正。符合的情况,常见的就是网络游戏中的行动收获计算公式,等等。现 Spads 开发组推出了针对此种情况的解析公式系统,供大家使用。

此公式解析系统能够计算各种算术运算、逻辑运算和比较运算,可以连接本地函数,支持括号分级,允许逐级设置公式内临时变量,提供了分支运算符,并且支持 Json 数据格式的运算。系统编写中使用了很多设计方法,包括概念抽取、继承、多态、面向接口设计、枚举、递归、工厂等等。数据结构也使用了好用但少见的双端队列。很适合对应情况的实用以及学习 Java 的设计思路、编程方式。本程序由 Shane Loo LI 设计和编写,所有的细节都注重了运行效率,在很多细节上都制作了数倍优于爪哇(Java)系统类库的方法;由于只需要处理公式,所以语法树结构单一,也因此保证了比现有其它注入语言的代码解释器更高的执行速度。

下面来介绍一下公式解析系统的用法。
首先,公式通过 ?= 来给变量赋值。这种赋值并不是一个运算,而是公式每一行需要且只能出现一次的专属符号。
Result ?= 38 * 6
公式解析系统用 Result 来表示最终的结果。以上公式表示最终的结果为 228 。

本系统支持以下算术运算:
求负 -
加 +
减 -
乘 *
除 /
求余 %
乘方 ^
阶乘 !
比如

Result ?= ((2^5 - (-13)) % 10)!

能够得到 120 。

接下来,让我们看看公式系统的分支控制。

DayCount ?= 31
DayCost ?= 58.5
Limit ?= 1500
Result ?= DayCount * DayCost > Limit ? "超支了!" ~ "没超支"

我们看到整个公式分为四行。每行声明了一个变量。
实际上在这个公式系统中,并不严格要求上边的公式不能够使用下边公式声明的变量,但如果嵌套使用则会抛出异常。
上述公式将得到一个字符串,内容是“超支了”。

支持的有关运算如下:
大于 >
小于 <
等于 =
与 &
或 |
非 -(这个和 C 语言系列的 ! 有所不同)
条件 ?
分支 ~(这个和 C 语言系列的 : 有所不同)

这个系统最重要的特性,就是能够把公式中出现的函数,和本地函数绑定起来。
只需要制作 Function 接口的实现类,并且在 FunctionEnum 对其进行注册,就能够得到一种可以在公式中识别的函数。
我最近学习了“约定优于明示”的思想,近期会将这种 FunctionEnum 配置方式进行一定程度的更改。

比如,我提供了内置函数 TOGETHER ,其含义是以第一个参数为名称,第二个参数为值,构成键值对;第三个参数为名称,第四个参数为值,构成键值对;等等。最终将其组合成 Json 字符串。请看如下公式。

Name ?= "Shane"
Level ?= 16
Result ?= TOGETHER(\"name\", Name, "graduated", Level > 10 ? "毕业了" ~ "没毕业")

最终结果为 {"name": "Shane", "graduated": "毕业了"}


说了这么多公式解析系统的用法。现在来从编程角度介绍一下如何启用此系统功能。
首先,肯定是要导入 .jar 包。然后参看以下代码。

EvaluatorFactory factory = EvaluatorFactory.INST;
Evaluator eva = factory.getEvaluator("Result ?= 28 + 2 / 10.0");
ExpValue result = eva.evaluate();
System.out.println(result);

或者

String form = "Result ?= 28 + 2 / 10.0";
ExpValue result = EvaluatorFactory.INST.getEvaluator(form).evaluate();

首先,计算器工厂是单例的,但以后如果要扩展函数库,则可以改写成多种工厂。获取工厂后,传入公式字符串(多行),以通过工厂获取针对此公式的计算器。然后调用计算器的计算方法,即可获得公式最终的结果。

如有疑问,可以联系 Surmounting@gmail.com
项目包下载地址为: http://download.csdn.net/detail/shanelooli/4726670

本文也在我的 CSDN 日志中发表: http://blog.csdn.net/shanelooli/article/details/8142726

分享到:
评论
1 楼 a78113534 2015-08-01  
用eclipse编译成jar导入到android里用了,没有成功。还是感谢大神

相关推荐

    Spads 公式解析系统

    此公式解析系统能够计算各种算术运算、逻辑运算和比较运算,可以连接本地函数,支持括号分级,允许逐级设置公式内临时变量,提供了分支运算符,并且支持 Json 数据格式的运算。系统编写中使用了很多设计方法,包括...

    Spads and Fokkers-开源

    这是一款名为Spads and Fokkers的游戏的增强现实化身,其中2台计算机生成的3d飞机在用户的思想引导下在现实世界中相互搏斗。 在此实现中,使用AR和BCI技术使之成为可能。

    雪崩抑制技术在SPADs中的应用

    本文就极微弱光探测的发展,简要说明了单光子探测器种类,分析了雪崩光电二极管(APD)用作单光子探测的工作原理及相关特性,全面地介绍了SPADs(Single-photonavalanchediodes)目前广泛采用的四种工作方式及其各自性能...

    Tunneling in submicron CMOS single-photon avalanche diodes

    Device simulation, I-V measurements, and dark count calculations and measurements demonstrate that tunneling is the main source of noise in NTGR, but it is less dominant in PTGR SPADs. All structures...

    Shane版详细设计书模板

    Shane 版详细设计书文档模板 本文件为通用适配的 Word 2003 .doc 格式。 模板使用了市面通用的蓝色注解字,为每一种需要使用的格式提供了快捷键。...来自 Spads 的 Shane 出品。敬请下载参考指正。

    Determination of breakdown voltage of In0.53Ga0.47As/InP single photon avalanche diodes

    We examine the saturation of relative current gain of In0.53Ga0.47As/InP single photon avalanche diodes (SPADs) operated in Geiger mode. The punch-through voltage and breakdown voltage of the SPADs ...

Global site tag (gtag.js) - Google Analytics