首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Parboiled2 2‘'~’组合子

理解Parboiled2 2‘'~’组合子
EN

Stack Overflow用户
提问于 2015-03-20 03:18:01
回答 1查看 133关注 0票数 2

查看parboiled2部分,Rule Combinators and Modifiers

我不明白ab,然后是a ~ b图。

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

你能解释一下每个街区吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 03:42:25

以下是Rule的定义

代码语言:javascript
复制
class Rule[-I <: HList, +O <: HList]

您所链接的文档给出了更多的解释,但本质上I是规则的输入,O是规则的输出。冒号表示法可能有点混乱。parboiled2使用堆栈来管理状态。只需记住冒号列表(HList)中的类型是从左到右产生/推送的,消费/弹出是从右到左的。在HList A:B:C中,C是堆栈的顶部,必须首先使用C

~运行一个规则,然后运行下一个规则。因此,在第一个示例中,类型为aRule[, A]不消耗任何东西,“生成”一个A,而Rule[, B]类型的b不消耗任何东西,“生成”一个B。因此,如果您运行a,然后运行b,那么您将生成一个A,然后是一个B。结果类型是Rule[, A:B]

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

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

  • aRule[A, B:C]类型
  • bRule[D:B:C, E:F]类型

当我们运行a时,从堆栈中消耗一个A,将一个B添加到堆栈中,并将一个C添加到堆栈中。然后运行b,首先使用C,然后使用B,然后从堆栈中消耗D。为了在正确的时间在正确的地点,D需要在a消费的A之下。然后,b将生成一个E,然后生成一个F

总共,我们消耗了一个D和一个ABC不算在内,因为它们是按照规则在内部产生和消耗的。在使用DA之后,我们将EF留在堆栈中。因此,a ~ b的类型是Rule[D:A, E:F]

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29158804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档