fredlawl/sinsql

一个用PHP编写的简易语言解释器,用于解析和执行用户定义的逻辑。

v1.1.2 2017-01-07 00:00 UTC

This package is not auto-updated.

Last update: 2024-09-26 04:23:05 UTC


README

一个用PHP编写的简易语言解释器,用于解析和执行用户定义的逻辑。

这个宠物项目是受到一个过去项目的启发,当时需要一个类似这种语法的语法来根据某些用户定义的标准在网站上条件性地渲染内容。

安装

要求

  • PHP5.5+

您需要 Composer,然后运行

composer require fredlawl/sinsql

将自动加载文件引入使用SINSQL的文件中

require_once('vendor/autoload.php');

示例

除非证明为真,否则结果总是假的。

语言语法

"text" IS "TEXT"
=> true
"Chiefs" IN ["L.A. Rams", "St. Louis Rams", "Rams"]
 => false
(25 GREATER THAN OR IS 21) OR (1991 LESS THAN OR IS 1995)
 => true
(:isAwesome IS "true") OR ((:age GREATER THAN OR IS 21) AND (:footballteam IN ["L.A. Rams", "St. Louis Rams", "Rams"]))
=> true

PHP

<?php

$parser = new \SINSQL\SINSQL();
$query = "12 IS 12";
if ($parser->parse($query)) {
    echo "it works!";
} else {
    echo "oops!";
}
<?php

class MyVariableMapper implements \SINSQL\Interfaces\IVariableMapper {
    
    private $variables = [
      'myvar' => 12  
    ];
    
    public function map($variableKey) {
      if (!isset($this->variables[$variableKey]))
          throw new Exception($variableKey . " not found in list.");
      
      return $this->variables[$variableKey];
    }
}

$parser = new \SINSQL\SINSQL(new MyVariableMapper());
$query = ":myvar IS 12";
if ($parser->parse($query)) {
    echo "it works!";
} else {
    echo "oops!";
}

语法定义

expression = left, operator, right;
left = term | "(", expression, ")";
right = term | sequence | "(", expression, ")";
operator = "AND" | "OR" | "IS" | "IS NOT" | "IN" | "NOT IN" | "LESS THAN" | "GREATER THAN" | "LESS THAN OR IS" | "GREATER THAN OR IS";
sequence = "[", { ( term, "," ) }, -",", "]"
term = number | string | variable;
string = '"', { ( letter | symbol | number ) -'"' }, '"';
variable = ":", { ( letter | number | "_" ) };
letter = [a-zA-Z];
symbol = ? anything not a letter but is considered (special?) character ?
number = { [0-9] };

许可协议

版权所有 2016 Frederick Lawler

特此授予任何人免费获得本软件及其相关文档副本(“软件”)的权利,无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供者提供软件的人这样做,前提是符合以下条件:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他原因,无论这些责任是源于、因之而产生或与之相关,包括但不限于软件或软件的使用或其它处置。