簡単なフィルタ

こんな言語(?)でやってみようかなと。

class Hoge {
  public int a;
  public int b;
}
List<Hoge> list = new ArrayList<Hoge>();
...
List<Hoge> filtered = ListFilter
    .source(list)
    .includes("a != 0")
    .includes("b > 0")
    .excludes("a > b")
    .toList();

includes("condition") は、.source(list)で指定したリストの各要素のうち、conditionの条件を満たすものだけを結果に含めます。excludesはその逆。conditionの部分が今回対象とする言語で、.sourceに指定したフィールド名を利用して、そのフィールドの制約を記述できます。

SQLの条件式を極限まで簡単にしたイメージです。ここに、要素型で存在しないプロパティがincludes/excludesの中に含まれていたり、文法エラーだったりしたら警告を出す感じ。

一応文法書いておきます。

    <PROGRAM> ::= <TERM> <OP> <TERM>

    <TERM> ::= <PROPERTY>
            |  <INTEGER>

      <OP> ::= "=="
            |  "!="
            |  ">"

<PROPERTY> ::= ["a"-"z", "A"-"Z"]["a"-"z", "A"-"Z", "0"-"9"]*

 <INTEGER> ::= "0"
            |  ["+", "-"]? ["1"-"9"]["0"-"9"]*

かなり制約かかった言語で

  • PROPERTYはint型のpublicフィールドのみ
  • INTEGERは符号付き整数のみ
  • OPは3種類

別にこの辺の拡張は大変じゃないので、とりあえずこのあたりで。