引力子/rql-parser

v3.1.0 2023-03-13 13:22 UTC

README

CI Packagist Version Packagist Downloads Packagist License

这是一个用PHP编写的RQL解析库。

该库包含以下部分

  • RQL代码的词法分析器
  • 创建抽象语法树的解析器

安装

安装库的首选方式是通过 composer

运行以下命令

composer require graviton/rql-parser

或者在您的 composer.json 文件的require部分添加

"graviton/rql-parser": "*",

基本用法

<?php
require 'vendor/autoload.php';

// default lexer supports all RQL rules
$lexer = new Graviton\RqlParser\Lexer();

// default parser contains all parsing strategies
$parser = new Graviton\RqlParser\Parser();


// RQL code
$rql = '(eq(a,string:1)|lt(b,2)|(c<>3&d>=string:4&e=eq=boolean:1))&u!=5&not(or(u=6,ge(i,10)))&z=1&(a==2|b<-3|in(c,(2,float:3)))&select(a,b)&sort(+a,-b)&limit(1,2)';

// tokenize RQL
$tokens = $lexer->tokenize($rql);


// parsing
var_dump($parser->parse($tokens));

也请参阅 rql-command库。这是一个用于调试RQL词法和解析的控制台应用程序。

高级用法

请参阅示例

当前状态

运算符

基本语法

  • 标量运算符
    • eq(a,b)
    • ne(a,b)
    • lt(a,b)
    • gt(a,b)
    • le(a,b)
    • ge(a,b)
  • 数组运算符
    • in(a,(b,c))
    • out(a,(b,c))
  • 逻辑运算符
    • and(eq(a,b),ne(c,d))
    • or(eq(a,b),ne(c,d))
    • not(eq(a,b))

简化的逻辑语法

  • (eq(a,b)&ne(b,c))
  • (eq(a,b)|ne(b,c))

FIQL语法

  • 标量运算符
    • a=eq=b
    • a=ne=b
    • a=lt=b
    • a=gt=b
    • a=le=b
    • a=ge=b
  • 数组运算符
    • a=in=(b,c)
    • a=out=(b,c)

简化的FIQL语法

  • a=b
  • a==b
  • a<>b
  • a!=b
  • a<b
  • a>b
  • a<=b
  • a>=b

其他

  • select(a,b,c)
  • sort(+a,-b)
  • limit(1,2)

所有语法变体可以一起使用。

值类型

  • 字符串
    • abc
    • abc%20def
  • 整数
    • 1, +1, -1
  • 浮点数
    • 1., +1., -1.
    • 0.1, +0.1, -0.1,
    • 0.1e5, +0.1e+5, -0.1e-5
    • .1, +.1, -.1
    • .1e5, +.1e+5, -.1e-5
  • 布尔值
    • true()
    • false()
  • null
    • null()
  • empty
    • empty()
  • 日期
    • 2015-06-02T20:00:00Z
  • glob
    • abc*
    • ?abc
    • abc*def?

类型转换

  • string:1
  • boolean:0
  • integer:a
  • float:1

编码规则

字符串值

在字符串值中,所有非字母数字字符都必须使用百分号(%)后跟两个十六进制数字进行编码。

示例

eq(string,2015%2D05%2D30T15%3A10%3A00Z)
in(string,(%2B1%2E5,%2D1%2E5))
in(string,(null%28%29,empty%28%29,true%28%29,false%28%29))

PHP中的字符串编码

function encodeString($value)
{
    return strtr(rawurlencode($value), [
        '-' => '%2D',
        '_' => '%5F',
        '.' => '%2E',
        '~' => '%7E',
    ]);
}

JavaScript中的字符串编码

function encodeString(value) {
    return encodeURIComponent(value).replace(/[\-_\.~!\\'\*\(\)]/g, function (char) {
        return '%' + char.charCodeAt(0).toString(16).toUpperCase();
    });
}

其他值

日期、数字和常函数值不得编码。

示例

eq(date,2015-05-30T15:10:00Z)
in(number,(+1.5,-1.5))
in(const,(null(),empty(),true(),false()))

资源