我想创建一些帮助器规则,这些规则接受一个规则并添加一些功能。例如,强制字符串文字需要加引号,或者向令牌规则/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)
我可以采用另一种方法:混合使用原语令牌解析器,然后创建所需的变体。但我真的想弄清楚到底是怎么回事。
发布于 2014-09-16 21:30:13
这似乎是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没有变化。
不幸的是,这不适用于我的解析器,所以我可能误解了什么。
https://stackoverflow.com/questions/25230208
复制相似问题