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)
我可以提交另一种方法:混合原始令牌解析器,然后创建我需要的变体.但我真的想知道发生了什么.
这似乎是元规则下描述的问题。描述的解决方案看起来像
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。
不幸的是,这对我的解析器不起作用,所以我可能误解了一些东西。