我必须阅读这样的文件行
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
答案 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