3

上下文

我正在攀登Nearley学习曲线并尝试为搜索查询解析器编写语法。

目标

我想编写能够解析包含布尔运算符(例如AND,,OR)的查询字符串的语法NOT。让我们将AND这个问题用作一个简单的案例。

例如,语法应该将这些示例字符串识别为有效:

  • 裤子
  • 裤子和袜子
  • 千斤顶

尝试

我天真的尝试看起来像这样:

query -> 
    statement
  | statement "AND" statement

statement -> .:+

问题

上面的语法尝试是模棱两可的,因为它.:+会匹配任何字符串。我真正想要的是第一个条件匹配任何不包含AND在其中的字符串。一旦出现“AND”,我只想输入第二个条件。

问题

我怎样才能检测到这两种不同的情况而不会出现语法不明确的情况?

我担心我错过了一些基本的东西;我可以想象大量的用例,我们希望任意文本被已知的操作符分割。

4

1 回答 1

3

是的,如果你有一个几乎可以是任何东西的逃生舱口,你就会遇到问题。

在某个地方,您将要定义您的基本标记集是什么,至少是一些类似的东西\S+,然后是如何组合这些标记。

我通常从解析器开始的地方是试图找出解析器中递归的位置,以及解析你所依赖的库的方法。

看起来 Nearley 是一个 Earley 解析器,正如他们的维基百科条目所指出的,它们对于 left-recursion 是有效的

这只是冒险的猜测,但这样的事情至少可以让你合起来。

CONJUNCTION -> AND | OR
STATEMENT -> TOKENS | (TOKENS CONJUNCTION STATEMENT)
TOKENS -> [^()]+

像这样的结构应该是明确的,并且禁止在标记中使用括号,除非它们被双引号包围。

于 2019-09-26T15:03:55.700 回答