式ツリーを中置記法に似た形式に変換する作業を行っています。ツリーを評価したり、その操作を実行したりしていません。ツリーには論理演算とリレーショナル演算の両方が含まれているので、翻訳中にインテリジェントな方法で括弧を出力したいと思います。
説明のために、次の不自然な表現を考えてみましょう。
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.
}