查看parboiled2部分,Rule Combinators and Modifiers

我不明白a,b,然后是a ~ b图。
到目前为止,我发现文档很简单。但我有点迷路了。
你能解释一下每个街区吗?
发布于 2015-03-20 03:42:25
以下是Rule的定义
class Rule[-I <: HList, +O <: HList]您所链接的文档给出了更多的解释,但本质上I是规则的输入,O是规则的输出。冒号表示法可能有点混乱。parboiled2使用堆栈来管理状态。只需记住冒号列表(HList)中的类型是从左到右产生/推送的,消费/弹出是从右到左的。在HList A:B:C中,C是堆栈的顶部,必须首先使用C。
~运行一个规则,然后运行下一个规则。因此,在第一个示例中,类型为a的Rule[, A]不消耗任何东西,“生成”一个A,而Rule[, B]类型的b不消耗任何东西,“生成”一个B。因此,如果您运行a,然后运行b,那么您将生成一个A,然后是一个B。结果类型是Rule[, A:B]。
当您添加输入时,事情会变得更加复杂。您需要确保a生成的类型(或任何第一条规则)都是b将要使用的类型。~就像函数组合一样。如果要组合g和f以获得g . f,则需要确保f的输出与g的输入类型相同。
让我们看一下表中的第三个例子。
a有Rule[A, B:C]类型b有Rule[D:B:C, E:F]类型当我们运行a时,从堆栈中消耗一个A,将一个B添加到堆栈中,并将一个C添加到堆栈中。然后运行b,首先使用C,然后使用B,然后从堆栈中消耗D。为了在正确的时间在正确的地点,D需要在a消费的A之下。然后,b将生成一个E,然后生成一个F。
总共,我们消耗了一个D和一个A。B和C不算在内,因为它们是按照规则在内部产生和消耗的。在使用D和A之后,我们将E和F留在堆栈中。因此,a ~ b的类型是Rule[D:A, E:F]。
自述文件中的第四个示例给出了一个示例,其中a生成了供b使用的错误类型。在这种情况下,a ~ b是非法的。
https://stackoverflow.com/questions/29158804
复制相似问题