I'd like to create some helper rules that take one rule and add some features to it. For example enforcing that string literals need to be quoted, or adding token position tracking to the token rules / ADT's.
I tried the following syntax (and quite a few permutations).
def quoted[T](rl: Rule1[T]) = rule {
'"' ~ rl ~ '"'
}
It compiles fine but as soon as I wire it up --e.g.,
def NodeObjPathEntry: Rule1[CNodeObjPathEntry] = rule {
WhiteSpace ~ quoted(IdentifierStringUnwrapped) ~ ':' ~ (NodeObjArray | NodeObjObj) ~> CNodeObjPathEntry
}
With the sub-rules :
def IdentifierStringUnwrapped: Rule1[String] = rule {
clearSB() ~ IdentifierChars ~ push(sb.toString)
}
def IdentifierChars = rule {
Alpha ~ appendSB() ~ zeroOrMore(AlphaNum ~ appendSB())
}
I get Illegal rule call: quoted[this.String](this.IdentifierStringUnwrapped)
I could commit to an alternative approach: mix in the primitive token parsers, and then create the variants I need. But I really wanna figure out what is going on.
This seems to be the issue described under Meta-rules. The solution described would look like
No change in
NodeObjPathEntry
.Unfortunately, this didn't work for my parser, so I may be misunderstanding something.