From d17aed873f1acc80c5cac37eeee724a84235d8a9 Mon Sep 17 00:00:00 2001 From: matyhtf Date: Thu, 6 Mar 2025 17:34:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=20subscript=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=20PHP=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Python/Translator.php | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/Python/Translator.php b/src/Python/Translator.php index 6b27b734..b25f0725 100644 --- a/src/Python/Translator.php +++ b/src/Python/Translator.php @@ -245,10 +245,18 @@ class Translator extends \PhpAot\Core\Translator function parseSlice($slice): string { - $_args[] = $slice->lower ? $this->parseTarget($slice->lower) : 'null'; - $_args[] = $slice->upper ? $this->parseTarget($slice->upper) : 'null'; - $_args[] = $slice->step ? $this->parseTarget($slice->step) : 'null'; - return 'PyCore::slice(' . implode(', ', $_args) . ')'; + if ($slice->_type == 'Constant') { + return $this->parseConstant($slice); + } elseif ($slice->_type === 'Tuple') { + return $this->parseTuple($slice); + } elseif ($slice->_type === 'Slice') { + $_args[] = $slice->lower ? $this->parseTarget($slice->lower) : 'null'; + $_args[] = $slice->upper ? $this->parseTarget($slice->upper) : 'null'; + $_args[] = $slice->step ? $this->parseTarget($slice->step) : 'null'; + return 'PyCore::slice(' . implode(', ', $_args) . ')'; + } else { + debug($slice); + } } function parseImportFrom($node): string @@ -453,22 +461,19 @@ class Translator extends \PhpAot\Core\Translator function parseSubscript($node) { - $code = ''; - if ($node->value) { - $code .= $this->parseValue($node->value); - } if ($node->slice) { - $target = $this->parseTarget($node->slice); $op = $node->ctx->_type; + $value = $this->parseValue($node->value); if ($node->ctx->_type == 'Store') { - $code .= $node->slice->id . '->__setitem__(' . $target . ', $__value)'; + return $value. '[' . $this->parseSlice($node->slice) . '] = $__value'; } elseif ($op == 'Del') { - $code .= $node->slice->id . '->__delitem__(' . $target . ')'; + return 'unset(' . $value . '[' . $this->parseSlice($node->slice) . '])'; } else { - $code .= $node->slice->id . '[' . $target . ']'; + return $value . '[' . $this->parseSlice($node->slice) . ']'; } + } else { + debug($node); } - return $code; } function parseFor($node)