我想创建一些辅助规则,它们采用一条规则并为其添加一些功能。例如,强制字符串文字需要被引用,或者将标记位置跟踪添加到标记规则/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)
我可以采用另一种方法:混合原始令牌解析器,然后创建我需要的变体。但我真的很想弄清楚发生了什么。