+
95
-

回答

<?php
function convertToGoto($phpCode) {
    $lines = explode("\n", $phpCode);
    $result = [];
    $gotoLabels = [];
    $labelCounter = 1;
    $inFunction = false;

    foreach ($lines as $line) {
        $trimmedLine = trim($line);

        // 处理函数声明
        if (preg_match('/^function\s+\w+\s*\(.*\)\s*\{/', $trimmedLine)) {
            $inFunction = true;
            $result[] = $line;
            continue;
        }

        //处理函数体
        if ($inFunction) {
            // 递增函数体括号计数
            if (strpos($trimmedLine, '{') !== false) {
                $result[] = $line;
                continue;
            }
            if (strpos($trimmedLine, '}') !== false) {
                $result[] = $line;
                $inFunction = false;
                // 插入所有标签
                $result = array_merge($result, $gotoLabels);
                $gotoLabels = [];
                continue;
            }

            // 处理 if 语句
            if (preg_match('/if\s*\((.*)\)\s*\{/', $trimmedLine, $matches)) {
                $condition = $matches[1];
                $trueLabel = "label" . ($labelCounter++);
                $falseLabel = "label" . ($labelCounter++);
                $endIfLabel = "label" . ($labelCounter++);

                $result[] = "    if ({$condition}) goto {$trueLabel};";
                $result[] = "    else goto {$falseLabel};";
                $gotoLabels[] = "{$trueLabel}:";
                continue;
            }

            // 处理 else 代码块
            if (strpos($trimmedLine, '} else {') !== false) {
                continue;
            }

            // 处理其他代码行
            if (!empty($trimmedLine)) {
                $result[] = "    {$line}";

                // 如果是 if 代码块的结束,需要添加 goto 跳转到 endIfLabel
                if (strpos($trimmedLine, '}') !== false) {
                    $gotoLabels[] = "{$falseLabel}:";
                    $gotoLabels[] = "{$endIfLabel}:";
                }
            }
        } else {
            // 保留函数定义外的代码
            $result[] = $line;
        }
    }

    return implode("\n", $result);
}

// 示例使用
$originalCode = <<<CODE

exampleFunction(1,2);
function exampleFunction(\$x, \$y) {
    \$sum = \$x + \$y;
    if (\$sum > 10) {
        echo "Sum is greater than 10.";
    } else {
        echo "Sum is 10 or less.";
    }
}
CODE;

echo convertToGoto($originalCode);
?>

网友回复

我知道答案,我要回答