我希望将一个字符串表达式转换为一个真正的布尔表达式。
以下表达式将作为输入(字符串):
"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)"
变量A、B和C将具有布尔值(true或false)。
我如何转换字符串表达式,替换逻辑值并使用C#进行验证?
我希望将一个字符串表达式转换为一个真正的布尔表达式。
以下表达式将作为输入(字符串):
"(!A && B && C) || (A && !B && C) || (A && B && !C) || (A && B && C)"
变量A、B和C将具有布尔值(true或false)。
我如何转换字符串表达式,替换逻辑值并使用C#进行验证?
"a || b"
,我们可以循环遍历每个字符,并根据char == '|'
决定适当的操作。对于更复杂的情况,我会使用一个stack
来跟踪每个结果,就像这个可以处理没有括号的&&
和||
的例子一样:public bool ConvertToBool(string op, bool a, bool b)
{
var st = new Stack<bool>();
var opArray = op.ToCharArray();
var orFlag = false;
var andFlag = false;
for (var i = 0; i < opArray.Length; i++)
{
bool top;
switch (opArray[i])
{
case '|':
i++;
orFlag = true;
break;
case '&':
i++;
andFlag = true;
break;
case 'a':
if (orFlag)
{
top = st.Pop();
st.Push(top || a);
orFlag = false;
}
else if (andFlag)
{
top = st.Pop();
st.Push(top && a);
andFlag = false;
continue;
}
st.Push(a);
break;
case 'b':
if (orFlag)
{
top = st.Pop();
st.Push(top && b);
orFlag = false;
}
else if (andFlag)
{
top = st.Pop();
st.Push(top && b);
andFlag = false;
continue;
}
st.Push(b);
break;
}
}
return st.Pop();
}