我正在将表达式树转换为类似于中缀符号的格式;我不是在评估树或执行它的操作。树包含逻辑和关系操作,我想在翻译过程中以智能的方式发出括号。
为了说明,请考虑以下人为的表达式:
a < x & (a < y | a == c) & a != d
如果我按顺序遍历这个表达式产生的表达式树,那么我会打印出下面的表达式,这是不正确的。
a < x & a < y | a == c & a != d
// equivalent to (a < x & a < y) | (a == c & a != d)
或者,我可以再次执行中序遍历,但在处理二进制表达式之前和之后发出括号。这将产生以下正确的表达式,但有几个多余的括号。
(((a < x) & ((a < y) | (a == c))) & (a != d))
是否有一个表达式树遍历算法可以产生最佳括号表达式?
作为参考,这是ExpressionVisitor
我用来检查树的片段。
class MyVisitor : ExpressionVisitor
{
protected override Expression VisitBinary(BinaryExpression node)
{
Console.Write("(");
Visit(node.Left);
Console.WriteLine(node.NodeType.ToString());
Visit(node.Right);
Console.Write(")");
return node;
}
// VisitConstant, VisitMember, and VisitParameter omitted for brevity.
}