开发上位机程序,有时需要用户对已知条件的逻辑进行编辑,然后程序判断逻辑的真假。比如你已经知道了AA,BB,CC,DD,EE,FF六个条件的真假,但是这六个条件之间的逻辑需要用户自行填写,那么如何在用户填写之后自动判断这个表达式最终结果呢。
我们先从一个比较简单的表达式入手,比如现在只有AA,BB,CC三个条件,AA&&BB||CC对应Bool值为{ true, false, true },这时只需要将表达式中的逻辑运算符提取出来,然后通过for循环对Bool值数组进行运算即可。但是如果表达式较为复杂,例如 ” ((AA && !BB)|| CC) && DD ||(EE && FF)”,取值为{ true, false, false, true, false, true },这种就需要先对括号进行处理了。思路如下:
1.将表达式中的条件名称替换成Bool值
((AA && !BB)|| CC) && DD ||(EE && FF) → ((true && !false) || false) && true || ( false && true )
2.找到最后一个左括号和其右侧距离他最近的右括号,这两个括号中间一定不存在其他括号。
如上面例子就是其中的(EE&&FF)位置对应的( false && true )
3.将括号中间的表达式进行运算,将其和括号替换成结果
( false && true ) → false
((true && !false) || false) && true || false
4.继续按照这个方法简化下去,直到得到最终结果
以下是实现的代码
class Program
{
static void Main(string[] args)
{
bool[] arrLogicValue = new bool[6] { true, false, false, true, false, true };
//假设所有bool值都用一个字母表示,也可以使用多个字母,但是需要统一字母的数量
string logicExpression = " ((AA && !BB)|| CC) && DD ||(EE && FF)";
//去除空格,括号
string logicExpressionTemp = logicExpression.Replace(" ", "");
logicExpressionTemp = logicExpressionTemp.Replace("(",