Java 在运行时计算逻辑表达式

Java 在运行时计算逻辑表达式,java,groovy,antlr,antlr3,abstract-syntax-tree,Java,Groovy,Antlr,Antlr3,Abstract Syntax Tree,如何计算运行时输入的逻辑表达式,如“VERB1或(VERB2和VERB3)或(VERB4)”。动词*是用于计算特定条件的占位符。例如,VERB1可能意味着检查数据库中是否存在记录 在表达式“VERB1 OR(VERB2和VERB3)或(VERB4)”中,如果VERB1为true,则不应执行其他动词 编辑:在中描述的示例似乎与我试图做的非常相似。但是,优化步骤(如果VERB1为true,则不应执行其他动词)似乎不存在。您在标记中提到了ANTLR:您尝试过了吗?您可以在ANTLR中创建完整的布尔语法

如何计算运行时输入的逻辑表达式,如“VERB1或(VERB2和VERB3)或(VERB4)”。动词*是用于计算特定条件的占位符。例如,VERB1可能意味着检查数据库中是否存在记录

在表达式“VERB1 OR(VERB2和VERB3)或(VERB4)”中,如果VERB1为true,则不应执行其他动词


编辑:在中描述的示例似乎与我试图做的非常相似。但是,优化步骤(如果VERB1为true,则不应执行其他动词)似乎不存在。

您在标记中提到了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) {
}
这并不能说明你要求早点回来,但我相信你能想出办法


这可能不是做事情的最佳方式,但这是我过去让它为我工作的方式。希望这有帮助。

如果您可以使用
|
&
来代替
,那么您可以使用groovy缺少的属性方法,如下所示:

应打印:

CHECK THE DATABASE, RETURN FALSE
WRITE A LOG ENTRY RETURN TRUE
VALIDATE SOMETHING, RETURN TRUE

我刚开始探索ANTLR。根据我的理解,通过定义语法,ANTLR将生成一个树(类似于中所示的表达式树)。树仍然需要求值——求值器不是由ANTLR提供的。我指的“求值器”在ANLTR行话中被称为“树解析器”。您是否尝试过Drools等规则引擎?或者另一种选择是利用Ognl、MVEL或Spring EL(),我们简要介绍了Drools,但没有介绍其他。我们觉得在我们的项目中引入Drools可能有点过头了,不清楚它是否能解决这个问题。
CHECK THE DATABASE, RETURN FALSE
WRITE A LOG ENTRY RETURN TRUE
VALIDATE SOMETHING, RETURN TRUE