簡単なフィルタ
こんな言語(?)でやってみようかなと。
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種類
別にこの辺の拡張は大変じゃないので、とりあえずこのあたりで。