2013-03-18 63 views
1

我怎么能最佳评估用户指定的布尔表达式的字符串,如:如何将布尔表达式字符串转换为对象?

A & B | (C & !D) 

我需要做什么用的?例如: 假设我们有一组人,并且用户有一个输入框,在那里他可以写为:String像布尔表达式连接这些人两个(及以上):

Peter & Klaus | (Peter & Clair | !Klaus) 

(我知道这表情没有任何意义,只是作为一个例子)。

然后我想用布尔语法来分割这个布尔字符串。 后来,如果一个人被重命名(例如彼得 - >约翰),我希望用户赋予的表达式也用新名称自动重命名。这样用户就可以用新名称查看他保存的表达式的更新。

因此,我可能必须使用代表名称后面的对象的ID来存储布尔表达式。因此必须从db中的表达式中查找每个名字,因此必须用布尔语法分割字符串。

问题:

  • 我怎么能最好的拆分此字符串?

  • 如何使用对象值存储此表达式,以便在名称更改时可以重新评估此字符串?

+0

也许我的问题题目不对:我不是真的想将表达式评估为true或false,而是想根据这个布尔expr来解析/分割/制作引用。 – membersound 2013-03-18 10:52:51

+0

您是否正在寻找一种方法来“表示”这样的表达式,并且最终并且只是可选地评估它的布尔值? 从概念上讲,像这样的东西? http://en.wikipedia.org/wiki/Binary_expression_tree 如果是这样,你可能想看看ANTLR和类似的东西......这几乎是他们存在的原因:词法和句法解析... – mdm 2013-03-18 11:00:43

+0

I “代表”或“存储”是正确的词。我想保存这个表达式,并用放置在数据库中的对象(人物对象)来表示它。然后,如果有人被重命名,表达式应该被自动更新。或者,一旦保存的表达式应该使用保存的对象引用来显示,并且执行像object.getName()这样的操作来构建表达式的可视表示。 – membersound 2013-03-18 11:03:15

回答

1

一种解决方案是将信息解析成节点树,其中节点可以存储名称,运算符或表达式。你可以在每个节点上使用一个id来允许你替换名字或者其他什么。

要进行解析本身,基本要求非常简单。这一切都取决于这些表达式可以变得多复杂。要做一个适当和完整的布尔表达式语法,我会推荐一个像antlr这样的解析器工具。

相关问题