2

查看parboiled2部分,Rule Combinators and Modifiers

在此处输入图像描述

我不明白a,b和 thena ~ b图表。

到目前为止,我发现文档很简单。但在这里有点迷路了。

你能解释一下每个块吗?

4

1 回答 1

5

这是 的定义Rule

class Rule[-I <: HList, +O <: HList]

您链接的文档提供了更多解释,但本质上I是规则的输入,也是规则O的输出。冒号表示法可能有点令人困惑。parboiled2使用堆栈来管理状态。请记住,冒号列表 ( HList) 中的类型是从左到右生成/推送,从右到左消费/弹出。其中HList A:B:C,C是栈顶,必须先被消费。

~运行一个规则,然后运行下一个。因此,在atype 的第一个示例中,Rule[, A]不消耗任何内容并“产生” an A,而bof typeRule[, B]不消耗任何内容并“产生” a B。那么这是有道理的,如果你a跟着跑b,你会产生一个A跟着一个B。结果类型是Rule[, A:B].

当您添加输入时,事情变得更加复杂。您需要确保a(或任何第一条规则)生成的类型b是要使用的类型。~就像函数组合一样。如果我们想组合gf得到g . f,我们需要确保 的输出与f的输入类型相同g

让我们看一下表中的第三个示例。

  • a有类型Rule[A, B:C]
  • b有类型Rule[D:B:C, E:F]

当我们运行a一个A从栈中消费的时候,aB被添加到栈中,aC被添加到栈中。然后b运行,首先它消耗C,然后是B,然后它消耗D堆栈外的 a。要在正确的时间出现在正确的地方,那D将需要低于A消耗量ab然后会产生一个E然后一个F

总的来说,我们消耗了 aD和 an A。和不计算在内,因为它们是在规则内部生产和消费的BC使用Dand之后A,我们将EandF留在堆栈上。所以,类型a ~ bRule[D:A, E:F]

自述文件中的第四个示例给出了一个示例,该示例a生成了错误的b消费类型。在这种情况下a ~ b是非法的。

于 2015-03-20T03:42:25.097 回答