首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala Parboiled 2总结了一些规则

Scala Parboiled 2总结了一些规则
EN

Stack Overflow用户
提问于 2014-08-10 23:40:04
回答 1查看 571关注 0票数 5

我想创建一些帮助器规则,这些规则接受一个规则并添加一些功能。例如,强制字符串文字需要加引号,或者向令牌规则/ADT添加令牌位置跟踪。

我尝试了以下语法(以及相当多的排列)。

代码语言:javascript
复制
  def quoted[T](rl: Rule1[T]) = rule {
    '"' ~ rl ~ '"'
  }

它编译得很好,但只要我把它连接起来--例如,

代码语言:javascript
复制
  def NodeObjPathEntry: Rule1[CNodeObjPathEntry] = rule {
    WhiteSpace ~ quoted(IdentifierStringUnwrapped) ~ ':' ~ (NodeObjArray | NodeObjObj) ~> CNodeObjPathEntry
  }

使用子规则:

代码语言:javascript
复制
def IdentifierStringUnwrapped: Rule1[String] = rule {
    clearSB() ~ IdentifierChars ~ push(sb.toString)   
}

 def IdentifierChars = rule {
    Alpha ~ appendSB() ~ zeroOrMore(AlphaNum ~ appendSB())
  }

我得到了Illegal rule call: quoted[this.String](this.IdentifierStringUnwrapped)

我可以采用另一种方法:混合使用原语令牌解析器,然后创建所需的变体。但我真的想弄清楚到底是怎么回事。

EN

回答 1

Stack Overflow用户

发布于 2014-09-16 21:30:13

这似乎是Meta-rules下描述的问题。所描述的解决方案如下所示

代码语言:javascript
复制
val IdentifierStringUnwrapped: () => Rule1[String] = () => rule { ... }
// same for other rules you want to apply quoted to

def quoted[T](rl: () => Rule1[T]) = rule {
  '"' ~ rl() ~ '"'
}

NodeObjPathEntry没有变化。

不幸的是,这不适用于我的解析器,所以我可能误解了什么。

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

https://stackoverflow.com/questions/25230208

复制
相关文章

相似问题

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