タグで ANTLR について言及しましたが、試してみましたか? ANTLR で完全なブール文法を作成することはできますが、動詞を評価する方法のレベルになると、はるかに難しくなります。
照会される動詞の小さな固定セットがある場合は、動詞と関数の間のマッピングを簡単に作成できます。
動詞のより大きなリストがある場合は、リフレクションを使用して特定のメソッドを呼び出してそれらを評価できる場合があります。
動詞に数学的比較を含めることができる場合、数学的レクサーとパーサーも作成するため、これはすべて少し難しくなります。
より具体的な質問と、ANTLR で試したことに関する知識がなければ、これ以上のアドバイスを提供できるかどうかわかりません。
編集:あなたのコメントに基づいて、さらに追加します。構文解析規則を文法に追加できます。
boolean_or returns [boolean b]
: b1=boolean_and {$b = $b1.b;}
(OR b2=boolean_and {$b = $b || $b2.b;})*
;
boolean_atom returns [boolean b]
:
((numeric_comparison)=> b1=numeric_comparison {$b = $b1.b;}
| TRUE {$b = true;} | FALSE {$b = false;}
| s1=VERB {$b = evalVerb($s1.s);}
| LPAREN b1=boolean_expr RPAREN {$b = $b1.b;}
)
;
それは私が現在使用しているブールパーサーのごく一部です。空白を埋めることができます。
そして、次のようなものを使用してパーサーを呼び出します
ANTLRStringStream in = new ANTLRStringStream(booleanString);
ActionLexer lexer = new ActionLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
BooleanParser parser = new BooleanParser(tokens);
try {
return parser.eval();
} catch (Exception e) {
}
これはあなたが早く帰る必要があることを説明していませんが、それを行う方法を理解できると確信しています.
これは物事を行うための最良の方法ではないかもしれませんが、過去に私がうまくいった方法です. お役に立てれば。