chkt/ash

基本表达式求解器

v1.4.1 2020-06-24 13:47 UTC

This package is auto-updated.

Last update: 2024-08-29 05:00:03 UTC


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")。

0x0b开头的任何数字将被视为整数,任何包含点的数字(格式0.0)将被视为浮点数。所有其他数字将被视为整数。

字符串可以用双引号(格式")和单引号(格式')分隔,分隔符可以用反斜杠(格式\ )转义。

计划支持布尔值、非数、正负无穷和类型转换。

算术运算

Ash目前支持加法(格式a + b)、减法(格式a - b)、乘法(格式a * b)、除法(格式a / b)和取模运算(格式a % b)的算术表达式,以及括号表达式(格式a * (b + c))。

所有算术运算都将布尔参数转换为整数值01。如果至少有一个操作数是浮点数,整数将被转换为浮点数。除以零(格式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()