您在标签中提到了 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) {
}
这并没有考虑到您提前返回的要求,但我相信您可以弄清楚如何做到这一点。
这可能不是做事的最佳方式,但它是我过去让它为我工作的方式。希望这可以帮助。