如何为布尔搜索运算符编写明确的 nearley 语法
How can I write an unambiguous nearley grammar for boolean search operators
背景
我正在攀登 Nearley 学习曲线并尝试为搜索查询解析器编写语法。
目标
我想编写能够解析包含布尔运算符(例如 AND
、OR
、NOT
)的查询字符串的语法。让我们用 AND
作为一个简单的例子来解决这个问题。
例如,语法应将这些示例字符串识别为有效:
- 裤子
- 裤子和袜子
- 开合跳
尝试
我天真的尝试看起来像这样:
query ->
statement
| statement "AND" statement
statement -> .:+
问题
上面的语法尝试是有歧义的,因为 .:+
将匹配字面上的任何字符串。
我真正想要的是第一个条件匹配任何不包含 AND
的字符串。一旦出现“AND”我只想输入第二个条件
问题
如何在没有歧义语法的情况下检测这两种不同的情况?
我担心我遗漏了一些基本的东西;我可以想象大量的用例,我们希望通过已知运算符拆分任意文本。
是的,如果你有一个可以是任何东西的逃生舱口,你就会遇到问题。
在某处您要定义基本标记集是什么,至少类似于 \S+
,然后定义这些标记的组成方式。
我通常从解析器开始的地方是试图弄清楚递归在解析器中的位置,以及解析您所依赖的库的方法。
看起来 Nearley 是一个 Earley 解析器,并且 the wikipedia entry for them notes, they're efficient for left-recursion。
这只是一个冒险的猜测,但这样的事情至少可以让你合取。
CONJUNCTION -> AND | OR
STATEMENT -> TOKENS | (TOKENS CONJUNCTION STATEMENT)
TOKENS -> [^()]+
像这样的结构应该是明确的并且禁止在标记中使用括号,除非它们被双引号括起来。
背景
我正在攀登 Nearley 学习曲线并尝试为搜索查询解析器编写语法。
目标
我想编写能够解析包含布尔运算符(例如 AND
、OR
、NOT
)的查询字符串的语法。让我们用 AND
作为一个简单的例子来解决这个问题。
例如,语法应将这些示例字符串识别为有效:
- 裤子
- 裤子和袜子
- 开合跳
尝试
我天真的尝试看起来像这样:
query ->
statement
| statement "AND" statement
statement -> .:+
问题
上面的语法尝试是有歧义的,因为 .:+
将匹配字面上的任何字符串。
我真正想要的是第一个条件匹配任何不包含 AND
的字符串。一旦出现“AND”我只想输入第二个条件
问题
如何在没有歧义语法的情况下检测这两种不同的情况?
我担心我遗漏了一些基本的东西;我可以想象大量的用例,我们希望通过已知运算符拆分任意文本。
是的,如果你有一个可以是任何东西的逃生舱口,你就会遇到问题。
在某处您要定义基本标记集是什么,至少类似于 \S+
,然后定义这些标记的组成方式。
我通常从解析器开始的地方是试图弄清楚递归在解析器中的位置,以及解析您所依赖的库的方法。
看起来 Nearley 是一个 Earley 解析器,并且 the wikipedia entry for them notes, they're efficient for left-recursion。
这只是一个冒险的猜测,但这样的事情至少可以让你合取。
CONJUNCTION -> AND | OR
STATEMENT -> TOKENS | (TOKENS CONJUNCTION STATEMENT)
TOKENS -> [^()]+
像这样的结构应该是明确的并且禁止在标记中使用括号,除非它们被双引号括起来。