icecave / dialekt
Requires
- php: >=5.3
Requires (Dev)
- icecave/archer: ~1
Suggests
- eloquent/asplode: Drop-in exception-based error handling.
This package is auto-updated.
Last update: 2022-02-01 12:34:56 UTC
README
此项目已被作者弃用。请使用dialekt/dialekt。
Dialekt 是一种非常简单的语言,用于表示搜索引擎经常使用的布尔表达式。
composer require icecave/dialekt
理由和概念
Dialekt 是为了指定基于人类可读的“标签”或“标签”集的对象列表过滤器而设计的。此 PHP 包提供了一种 表达式解析器,它将 Dialekt 表达式解析为 抽象语法树,一个 列表解析器,它将标签列表解析为数组,以及一个 评估器,它检查给定的标签集是否与特定表达式匹配。
此外,抽象语法树的节点实现了 访问者模式,允许创建遍历语法树的新算法。例如,可以用于生成一个 SQL 查询,该查询查找具有匹配表达式的标签的实体。
语法
以下是一个示例 Dialekt 表达式,展示了可用的语言功能。您可以看到如何使用 在线演示 解析此表达式。
foo bar AND (baz OR qux) AND NOT "doom hammer"
在上面的示例中,foo
、bar
、baz
、qux
和 "doom hammer"
是 标签 的示例。标签是表达式的最基本句法元素。表达式由一个或多个标签组成,以及逻辑运算符 AND
、OR
和 NOT
。逻辑运算符不区分大小写。
标签可以由任何非空白字符组成,但不能是括号和星号字符。标签可以选择性地用双引号括起来,如上面示例中的 doom hammer
标签所示。这样做允许包含括号和空白字符。如果标签是保留字 AND
、OR
或 NOT
之一,则必须用双引号括起来。在引号内的标签中,反斜杠字符提供了类似于双引号 PHP 字符串的转义功能。
隐式 AND 运算符
当标签直接相邻时(如上面的 foo
和 bar
),它们被视为等同于 AND
,因此表达式 foo bar baz
等同于 foo AND bar AND baz
。
分组和运算符优先级
子表达式可以通过括号进行分组以控制求值顺序,如上面的示例中baz
和qux
所展示的。
当没有括号时,AND
运算符的优先级高于OR
,因此foo OR bar AND baz
等价于foo OR (bar AND baz)
。