c++ - 如何读取一串布尔运算并赋予其优先级?
问题描述
我必须读取这样的文件行
assign x = (c OR (a AND B)) OR (NOT D)
Whereassign
是一个激活类方法的关键字Logic_gate
,它计算并存储布尔运算的结果。
我从文件中读取了这一行 by ,并用objectgetline
读取了这个字符串,但我不知道如何为操作赋予优先级。即我想做第一个括号之间的操作,然后是另一个。sstream
istringstream
在这个例子中,我想要:
-A AND B
-(c OR (a AND B))
-(NOT D)
-(c OR (a AND B)) OR (NOT D)
-Store result in x
解决方案
听起来好像您正在寻找一种将中缀表达式转换为后缀表示法的方法?这使您可以构建一个非常容易评估的操作堆栈。有一个非常古老的表达式解析器可能不会再编译了,但是它可以进行中缀到后缀的转换(参见 Parse 函数): http ://www.flipcode.com/archives/Expression_Compiler_Evaluator.shtml
如果您知道 or/not/and/() 的运算符优先级,那么它应该非常简单。(您可能会注意到 Parse 函数中 if/else 语句的顺序与 C++ 的运算符优先级相匹配)。
.... 显然我不是建议你把它编译成 x86 机器码!!这只是一些我知道有一些相关性的代码:)
一个非常简单的例子:
// 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
原来的表达:
// infix
x = (c OR (a AND B)) OR (NOT D)
// postfix
x = A B AND C OR D NOT OR
// evaluated like so:
A is a var, push on stack
B is a var, push on stack
AND - perform op, pop value from stack, store result in stack.top()
C is a var, push on stack
OR - perform op, pop value from stack, store result in stack.top()
D is a var, push on stack
NOT is unary. store !stack.top() in stack.top(). DO NOT POP!
OR - perform op, pop value from stack, store result in stack.top()
// the stack should contain the result.
推荐阅读
- firebase - 对文档的部分写入权限
- python - rpy2 importr 错误:无法导入任何包
- google-bigquery - 具有比特币输入和输出的重复列名
- installation - Inno Setup 安装程序多个页面上的组件
- sql - 如何在查询中汇总特定字符串
- java - 在我的应用程序中使用 OSGI 包时出现 java.lang.NoSuchMethodError 错误
- python - 如何在python中将安装路径与通配符应用程序名称进行比较
- xpath - 如何针对 html 文档评估 xpath 表达式?
- java - 新的 JSONObject 触发 java.lang.NoClassDefFoundError
- c - 如何在 Swift 中复制指向数组的指针?