private bool Check(string tags, int level)
{
if (tags == "")
return true;
var result = false;
var length = tags.Length;
var start = 0;
var prevOperator = '|';
var open = 0;
for (int i = 0; i < length; ++i)
{
// End
if (i == length - 1)
{
var val = tags.Substring(start, i - start + 1);
bool eval;
if (val[0] == '(')
eval = Check(val.Substring(1, val.Length - 2), level + 1);
else
eval = this.Evaluate(val);
if (prevOperator == '|') result |= eval; else if (prevOperator == '&') result &= eval; else result ^= eval;
break;
}
// Sub
if (tags[i] == '(')
{
open++;
continue;
}
else if (tags[i] == ')')
{
if (open != 0)
{
open--;
continue;
}
}
// Or/And/Xor
if (open == 0 && (tags[i] == '|' || tags[i] == '&' /*|| tags[i] == '^'*/))
{
var val = tags.Substring(start, i - start);
bool eval;
if (val[0] == '(')
eval = Check(val.Substring(1, val.Length - 2), level + 1);
else
eval = Evaluate(val);
if (prevOperator == '|') result |= eval; else if (prevOperator == '&') result &= eval; else result ^= eval;
prevOperator = tags[i];
start = i + 1;
continue;
}
}
return result;
}