Как определить использование скобок при переводе дерева выражений?
Я работаю над переводом дерева выражений в формат, напоминающий инфиксную нотацию; Я не оцениваю дерево и не выполняю его операции. Дерево содержит как логические, так и реляционные операции, и я хотел бы разумно выводить скобки во время перевода.
Для иллюстрации рассмотрим следующее придуманное выражение:
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.
}