<?php

$operations = explode("\n", file_get_contents('input.txt'));

$results = [];
foreach ($operations as $i => $operation) {
    $operation = evaluateParentheses($operation);
    $operation = evaluateOperation($operation);
    $results[] = (int) $operation;
    echo sprintf('Line %u : %u%s', $i+1, $operation, "\n");
}

echo array_sum($results);
/**
 * @param string $operation
 *
 * @return false|float|int
 * @throws \Exception
 */
function evaluateOperation(string $operation)
{
    while (!is_numeric($operation)) {
        $operation = preg_replace_callback(
            '/^(\d+) (\+|\*) (\d+)/',
            static function ($matches) {
                switch ($matches[2]) {
                    case '+':
                        return (int)$matches[1] + (int)$matches[3];
                    case '*':
                        return (int)$matches[1] * (int)$matches[3];
                    default:
                        throw new \Exception('Unknown Operation ' . var_export($matches, true));
                }
            },
            $operation
        );
    }

    return $operation;
}

function evaluateParentheses($operation)
{
    $result = preg_replace_callback('/\(([^\)\(]+)\)/', static function ($matches) {
        return evaluateOperation($matches[1]);
    }, $operation);

    if ($result === $operation || $result === null) {
        return $operation;
    }

    return evaluateParentheses($result);
}