5

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)

別のアプローチにコミットすることもできます。プリミティブ トークン パーサーを混ぜてから、必要なバリアントを作成します。しかし、私は本当に何が起こっているのかを理解したい.

4

1 に答える 1

0

これは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

残念ながら、これは私のパーサーでは機能しなかったため、何か誤解している可能性があります。

于 2014-09-16T13:30:13.323 に答える