5

我想创建一些辅助规则,它们采用一条规则并为其添加一些功能。例如,强制字符串文字需要被引用,或者将标记位置跟踪添加到标记规则/ADT。

我尝试了以下语法(以及很多排列)。

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

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

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

使用子规则:

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)

我可以采用另一种方法:混合原始令牌解析器,然后创建我需要的变体。但我真的很想弄清楚发生了什么。

4

1 回答 1

0

这似乎是Meta-rules下描述的问题。描述的解决方案看起来像

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

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

没有变化NodeObjPathEntry

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

于 2014-09-16T13:30:13.323 回答