Назад к задачам
Junior — Senior
17

Преобразование AST арифметического выражения в строковое представление кода

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Дано: арифметическое выражение задано в виде AST (Abstract Syntax Tree) в префиксной нотации.

AST может быть либо вещественным числом, либо массивом, где первый элемент всегда строка, обозначающая арифметическую операцию, а все последующие элементы – её аргументы (тоже в виде AST):

AST = float | ['operation', operand1, operand2, ..., operandN], где operand1, operand2, … – AST.

Поддерживаются следующие операции:

  • унарный минус (-)
  • унарный плюс (+)
  • сложение (+)
  • вычитание (-)
  • умножение (*)
  • деление (/).

Можно считать, что входные данные всегда корректны.

Необходимо реализовать функцию astToCode, принимающую AST и возвращающую строку с эквивалентным кодом.

function astToCode(array|float $node): string
{
    // реализация преобразования
}

function test(array|float $node, string $expected): void
{
    $actual = astToCode($node);
    echo $actual === $expected ? 'OK' : "FAIL ";
    echo ": $expected" . PHP_EOL;
}

test(5, '5');
test(, , 3]]], '-(+3)');
test(, 1]], '+(-1)');
test(, ], '(1 * 2) * (3 - 1)');
test(]], '2 * 5 * 7 / (8 - (5 + 6))');
test(, , ], '1 + 2 - (3 - 4) - (5 + 6)');