如何读取布尔操作字符串并赋予其优先级?

时间:2019-05-28 07:58:02

标签: c++ string

我必须阅读这样的文件行

assign x = (c OR (a AND B)) OR (NOT D)

assign是一个关键字,它激活称为Logic_gate的类的方法,该方法计算并存储布尔运算的结果。

我通过getline从文件中读取了这一行,并使用sstream对象istringstream来读取了此字符串,但是我不知道如何赋予操作优先级。也就是说,我想先在支架之间进行操作,然后再进行另一个操作。

在此示例中,我想要:

-A AND B
-(c OR (a AND B))
-(NOT D)
-(c OR (a AND B)) OR (NOT D)
-Store result in x

1 个答案:

答案 0 :(得分:0)

听起来好像您正在寻找一种将中缀表达式转换为后缀表示法的方法?这使您可以构建易于评估的操作堆栈。有一个非常古老的表达式解析器,可能不再编译了,但是会执行后缀转换的中缀(请参阅Parse函数):http://www.flipcode.com/archives/Expression_Compiler_Evaluator.shtml

如果您知道or / not / and /()的运算符优先级,那么它应该非常简单。 (您可能会注意到Parse函数中if / else语句的顺序与C ++的运算符优先级相匹配)。

....显然,我不建议您将其编译为x86机器代码!那只是我知道有些相关性的代码:)

一个非常简单的例子:

officers.map((item) => {
   searchAndChangeFor.find((item2) => {
       if (item.id === item2.id) {
          return { ...item, name: 'Change name for 56' } 
       }
   }) || item; 
});

原始表达:

// infix
x = A AND B

// postfix
x = A B AND

// to evaluate
A is a variable, push onto stack
B is a variable, push onto stack
AND is a binary op, so compute:
   stack[last - 1] = stack[last - 1] AND stack[last]
pop a value from the stack

// stack now contains 1 value, the result