1 つのルールにいくつかの機能を追加するヘルパー ルールをいくつか作成したいと思います。たとえば、文字列リテラルを引用符で囲む必要があることを強制したり、トークン ルール / 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)
別のアプローチにコミットすることもできます。プリミティブ トークン パーサーを混ぜてから、必要なバリアントを作成します。しかし、私は本当に何が起こっているのかを理解したい.