chkt / ash
基本表达式求解器
Requires
- php: ^7.0
- chkt/eve: 1.0.0
Requires (Dev)
- php-mock/php-mock-phpunit: 1.1.*
- phpunit/phpunit: 5.6.*
README
基本表达式求解器
Ash是一个在沙盒环境中使用基本算术表达式进行表达式求解的工具。它旨在提供一种方便的方式,以编程方式访问分层数据中的属性。
安装
Composer
Ash可以通过composer获取。
命令行
$ php composer.phar install chkt/ash
composer.json
{ "require" : { "chkt/eve" : "<version>" } }
手动安装
或者,您可以克隆github仓库到您喜欢的位置。之后,您需要自己注册php中的PSR-4命名空间ash
。
$ git clone https://github.com/chkt/ash.git
Ash依赖于chkt/eve。在手动克隆时,您需要确保该包可用,并且您需要自己注册其PSR-4命名空间。
创建求解器
$baseFactory = new \eve\common\factory\BaseFactory(); $parserFactory = new \ash\ParserFactory($baseFactory);
parserFactory需要\eve\common\factory\IBaseFactory的一个实例。您可以使用捆绑的工厂或者实现自己的。
$parser = $parserFactory->produce(); $solver = $parser->parse('a + b');
解析表达式a + b
将返回该表达式的求解器对象。
$result = $solver->resolve([ 'a' => 1, 'b' => 2 ]);
求解器将为提供给其->resolve()
方法的数据解析此表达式。
支持的语法
表达式语法广泛遵循C风格语法约定,同时借鉴了JavaScript的函数式编程范式。
Ash并非旨在全面,因此故意限制为评估表达式。没有语句,没有赋值,没有定义函数或组合数据的方式,也没有通过语法修改其作用域内任何数据的方式。
求解器作用域内可访问的所有内容都需要由宿主程序提供,这使得在未故意提供访问的情况下,无法在表达式中访问宿主系统的任何部分。
标量值
目前支持的基本数据类型包括浮点数(基本格式1.0
和指数格式1.0e-1
)、整数(基本格式1
、二进制格式0b1
和十六进制格式0x1
)和基本字符串(格式'foo'
、"foo"
)。
以0x
或0b
开头的任何数字将被视为整数,任何包含点的数字(格式0.0
)将被视为浮点数。所有其他数字将被视为整数。
字符串可以用双引号(格式"
)和单引号(格式'
)分隔,分隔符可以用反斜杠(格式\
)转义。
计划支持布尔值、非数、正负无穷和类型转换。
算术运算
Ash目前支持加法(格式a + b
)、减法(格式a - b
)、乘法(格式a * b
)、除法(格式a / b
)和取模运算(格式a % b
)的算术表达式,以及括号表达式(格式a * (b + c)
)。
所有算术运算都将布尔参数转换为整数值0
和1
。如果至少有一个操作数是浮点数,整数将被转换为浮点数。除以零(格式1 / 0
)将返回INF
和-INF
,取模零(格式1 % 0
)将返回NAN
,无论输入类型如何。
计划支持比较、前缀+
和-
、typeof
、指数运算符和逻辑运算。
属性访问
属性访问使用点操作符.
进行静态访问,例如foo.bar
,使用方括号进行计算访问,例如foo[bar]
。
静态访问和计算访问可以自由混合,例如foo[bar].baz[qux][qux]
,计算访问可以解析为整数foo[ 1 ]
或字符串foo[ 'bar' ]
。
调用
在PHP中,任何解析为callable
的对象都可以通过解算器使用圆括号foo()
进行调用。
$solver = $parser->parse('baz[ foo() ]'); $context = [ 'foo' : function() : string { return 'bar'; }, 'baz' => [ 'bar' => 'qux' ]] ]; $result = $solver->resolve($context);
参数通过逗号foo(bar, baz)
分隔。
允许嵌套调用foo(bar(), baz())
和链式调用foo()()
。调用返回的值可以自由用于任何后续操作foo().bar + baz()
。