【问题标题】:How to convert boolean expression strings to objects? [duplicate]如何将布尔表达式字符串转换为对象? [复制]
【发布时间】:2013-03-06 16:15:30
【问题描述】:

我怎样才能最好地评估用户给定的布尔表达式字符串,例如:

A & B | (C & !D)

我需要这个做什么?例子: 想象一下,我们有一组人,用户有一个输入字段,他可以在其中使用写为 String 的布尔表达式连接其中的两个(以及更多)人,例如:

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

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

然后我想使用布尔语法以某种方式拆分这个布尔字符串。 稍后,如果一个人被重命名(例如 Peter -> John),我希望用户给出的表达式也可以使用新名称自动重命名。这样用户就可以看到他保存的带有新名称的表达式的更新。

因此,我可能必须使用代表名称背后对象的 id 来存储布尔表达式。因此必须从数据库中的表达式中查找每个名称,因此必须通过布尔语法拆分字符串。

问题:

  • 我怎样才能最好地分割这个字符串?

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

【问题讨论】:

  • 可能我的问题标题不对:我真的不想将表达式评估为truefalse,而是想根据这个布尔表达式解析/拆分/进行引用。
  • 您是否正在寻找一种方法来“表示”此类表达式,并最终且仅可选择性地评估它的布尔值?从概念上讲像建造这个? en.wikipedia.org/wiki/Binary_expression_tree 如果是这样,你可能想看看像 ANTLR 和类似的东西......这几乎就是它们存在的原因:词法和句法解析......
  • 我认为“代表”或“商店”是正确的词。我想保存这个表达式并用数据库中的对象(人对象)表示它。然后,如果有人重命名,则表达式应自动更新。或者更进一步:保存后的表达式应该使用保存的对象引用显示,并执行类似object.getName() 的操作来构建表达式的可视化表示。

标签: java parsing boolean boolean-expression


【解决方案1】:

一种解决方案是将信息解析为节点树,其中节点可以存储名称、运算符或表达式。您可以在每个节点上使用 id 来允许您替换名称或以后的任何内容。

要自己进行解析,基础非常简单。这一切都取决于这些表达式有多复杂/可以变得多么复杂。做一个正确和完整的布尔表达式语法,我会推荐一个像antlr这样的解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2012-07-05
    相关资源
    最近更新 更多