Parsing I';我在想如何将一个带括号的布尔表达式展平为一组逻辑上相同的有序表达式

Parsing I';我在想如何将一个带括号的布尔表达式展平为一组逻辑上相同的有序表达式,parsing,boolean-logic,Parsing,Boolean Logic,假设我有这样一个表达式: (((e1)或(e2))和(e3或(e5和e6))和(e7)或(e8)) 最后我需要一个表达式列表(e1、e2、e3等),后跟and/or运算符,这样从左到右计算该列表就会得到相同的逻辑布尔答案 即e1或e2、e5和e6或e3和e7或e8。但这不是正确的答案,但这正是我最终需要解决的问题 我知道递归下降解析器将对表达式求值,但这不是我需要的,我需要得到一个表达式列表,以后可以从左到右求值 我想把它放在一个二叉树中,然后导航到树的后缀或者类似的东西,但这似乎不正确 我过去

假设我有这样一个表达式:

(((e1)或(e2))和(e3或(e5和e6))和(e7)或(e8))

最后我需要一个表达式列表(e1、e2、e3等),后跟and/or运算符,这样从左到右计算该列表就会得到相同的逻辑布尔答案

即e1或e2、e5和e6或e3和e7或e8。但这不是正确的答案,但这正是我最终需要解决的问题

我知道递归下降解析器将对表达式求值,但这不是我需要的,我需要得到一个表达式列表,以后可以从左到右求值

我想把它放在一个二叉树中,然后导航到树的后缀或者类似的东西,但这似乎不正确


我过去很聪明,能理解这样的事情,但现在我有了一个孩子,我失去了所有更高的认知能力。帮助?

首先,您要做的是将中缀符号转换为后缀符号


您对解析器的想法是正确的,因为您确实需要解析(而不是计算)原始表达式,然后以后缀符号打印出来。

我的父亲以近乎无限的智慧(尽管有两个孩子)指出了一个相当简单的解决方案: demorgan定律说,你可以重写任何表达式,只使用AND或or,并使用NOT的各种用法。因此,只需将所有AND表达式转换为AND或等效表达式,去掉括号,然后从左向右求值即可。
非常可行的想法,只是在我的情况下,NOT手术非常昂贵。

+1因为失去了巴比之后更高的认知能力,我怀疑这是可能的。在最终版本中,两个运算符具有相同的优先级,并且是左关联的?不要假设任何关于优先级的内容,在最终列表中,最终列表将从左到右进行操作。运算顺序在原始表达式中很重要,并且都被高度括号化,因此运算顺序不是问题。这可能没有多大意义。我的意思是,得到的扁平列表需要从左到右运行,而不考虑传统的优先顺序。原来的表达式有很多括号,你只需要根据括号的深度计算出顺序。我以为这是一个后缀渲染,但出于某种原因,直觉上我觉得它不正确。我要试试看。谢谢。所以我在一次会议上开始在纸上画画,我意识到后缀将产生我:e1 e2或e5 e6和e3或e7和e8,或者这不是我想要的。也许你正在寻找的输出的一个例子会对这个问题有所帮助。。。。e1或e2和e5和e6或e3和e7或e8在逻辑上是不正确的,但这就是我要找的。也许这样的表情是不可能变平的。也许它不能以线性方式完成,并且仍然保持逻辑正确。