0

pn複雑なテキストを解析しているときに、再利用と読みやすさの理由から正規表現の定義を分割する必要がある場合、この一般的な構造 ( - 正規表現パターン、vn変数)の Scala コードで終わることが多いようです。

val cp1 = p1 ~ p2 ~ p3 ~ p4 ~ p5 ~ p6 ^^
          case { dummy1 ~ v2 ~ dummy3 ~ v4 ~ dummy5 ~ v6 => ACaseClass(v2, v4, v6) }

vn明らかな問題は、コードの可読性と保守性です。有用な一致 ( ) とプレースホルダーの一致 ( )が分離されているため、新しいパターンを挿入する必要があるからですdummyn

それで、意図を表現するためのよりきちんとした方法はありますか?_代わりに for everyを使用できdummynますか?

SNOBOL 言語では、一致の結果を変数に代入する(pat . var)orを書くことができます。(pat $ var)同様に、最新の正規表現構文では、キャプチャ グループと名付けました(?P<name>pat)。その意図は明らかに、マッチ キャプチャ変数をパターンの近くに保つことです。

したがって、私が書きたいのは、次の一般的な行に沿ったものです。

val cp1 = p1 ~ ( p2 $$ v2 )  ~ p3 ~ ( p4 $$ v4 ) ~ p5 ~ ( p6 $$ v6 ) $=>
          ACaseClass(v2, v4, v6)

明らかに、私はある種の新しい演算子を想定して$$おり$=>、この単純な構文を可能にしています。

おそらくマクロが役立つかもしれませんが、現時点では私の能力を超えています。任意の入力を歓迎します!

4

1 に答える 1

2

を使用しようとしなかったのはなぜ_ですか? それが機能することがわかりました。また、 and を使用~><~てパターンの一部を破棄することもできますが、内側の部分を破棄する場合は括弧を使用する必要があります。

object SimpleScala extends JavaTokenParsers {

  def test = "(" ~> wholeNumber ~ ("," ~> wholeNumber <~ ",") ~ wholeNumber <~ ")" ^^ 
    { case i1 ~ i2 ~ i3 => (i1,i2,i3) }

  def test2 = "(" ~ wholeNumber ~ "," ~ wholeNumber ~ ")" ^^ 
    { case _ ~ i1 ~ _ ~i2 ~ _ => (i1,i2) }

  def main(args: Array[String]){
    println(parseAll(test,"(42,34,5)"))
    println(parseAll(test2,"(42,345)"))
  }
}
于 2013-05-31T21:53:06.183 に答える