Scala Parboiled 2讨论了一些规则

Has*_*yed 5 parsing scala parboiled scala-macros

我想创建一些帮助规则,这些规则采用一个规则并为其添加一些功能.例如,强制要求引用字符串文字,或者将令牌位置跟踪添加到令牌规则/ ADT.

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

  def quoted[T](rl: Rule1[T]) = rule {
    '"' ~ rl ~ '"'
  }
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是一旦我将它连接起来 - 例如,

  def NodeObjPathEntry: Rule1[CNodeObjPathEntry] = rule {
    WhiteSpace ~ quoted(IdentifierStringUnwrapped) ~ ':' ~ (NodeObjArray | NodeObjObj) ~> CNodeObjPathEntry
  }
Run Code Online (Sandbox Code Playgroud)

使用子规则:

def IdentifierStringUnwrapped: Rule1[String] = rule {
    clearSB() ~ IdentifierChars ~ push(sb.toString)   
}

 def IdentifierChars = rule {
    Alpha ~ appendSB() ~ zeroOrMore(AlphaNum ~ appendSB())
  }
Run Code Online (Sandbox Code Playgroud)

我明白了 Illegal rule call: quoted[this.String](this.IdentifierStringUnwrapped)

我可以提交另一种方法:混合原始令牌解析器,然后创建我需要的变体.但我真的想知道发生了什么.

Ale*_*nov 0

这似乎是元规则下描述的问题。描述的解决方案看起来像

val IdentifierStringUnwrapped: () => Rule1[String] = () => rule { ... }
// same for other rules you want to apply quoted to

def quoted[T](rl: () => Rule1[T]) = rule {
  '"' ~ rl() ~ '"'
}
Run Code Online (Sandbox Code Playgroud)

没有变化NodeObjPathEntry

不幸的是,这对我的解析器不起作用,所以我可能误解了一些东西。