pull/1/head
韩天峰 8 months ago
parent 26a6d19e1f
commit 1ab142406a
  1. 60
      src/Php/Translator.php

@ -20,27 +20,29 @@ class Translator extends \PhpAot\Core\Translator
const TYPE_OBJECT = 'php::Object'; const TYPE_OBJECT = 'php::Object';
const TYPE_ARRAY = 'php::Array'; const TYPE_ARRAY = 'php::Array';
protected string $phpxDir = '~/workspace/projects/phpx'; private string $phpxDir = '~/workspace/projects/phpx';
protected string $lang = 'PHP'; protected string $lang = 'PHP';
protected array $scope = []; private array $scope = [];
protected array $zendTypeMap = [ private array $zendTypeMap = [
'int' => self::TYPE_INT, 'int' => self::TYPE_INT,
'float' => self::TYPE_FLOAT, 'float' => self::TYPE_FLOAT,
'bool' => 'bool', 'bool' => 'bool',
]; ];
protected array $headers = [ private array $headers = [
'phpx.h', 'phpx.h',
]; ];
protected array $internalFunctions = []; private array $internalFunctions = [];
protected int $optimizeLevel = 5; private int $optimizeLevel = 5;
private bool $verbose = false;
protected string $namespace = ''; private string $file;
protected array $uses = []; private string $dir;
protected string $class = ''; private string $namespace = '';
protected string $returnType = ''; private array $uses = [];
private string $class = '';
private string $returnType = '';
const PREFIX = 'php_'; const PREFIX = 'php_';
@ -67,6 +69,8 @@ class Translator extends \PhpAot\Core\Translator
{ {
$parser = (new ParserFactory())->createForNewestSupportedVersion(); $parser = (new ParserFactory())->createForNewestSupportedVersion();
$phpCode = file_get_contents($file); $phpCode = file_get_contents($file);
$this->file = realpath($file);
$this->dir = dirname($this->file);
$ast = $parser->parse($phpCode); $ast = $parser->parse($phpCode);
$traverser = new NodeTraverser; $traverser = new NodeTraverser;
@ -112,7 +116,7 @@ class Translator extends \PhpAot\Core\Translator
return $node->getType(); return $node->getType();
} }
protected function getDetectedType($name) private function getDetectedType($name)
{ {
return $this->scope[$name] ?? 'php::Variant'; return $this->scope[$name] ?? 'php::Variant';
} }
@ -162,12 +166,14 @@ class Translator extends \PhpAot\Core\Translator
return $code; return $code;
} }
protected function writeLog($msg) private function writeLog($msg)
{ {
if ($this->verbose) {
echo $msg . PHP_EOL; echo $msg . PHP_EOL;
} }
}
protected function parseIdentifier(Node $expr) private function parseIdentifier(Node $expr)
{ {
$type = $expr->getType(); $type = $expr->getType();
switch ($type) { switch ($type) {
@ -302,10 +308,12 @@ class Translator extends \PhpAot\Core\Translator
return $this->parseAssignOpMul($expr); return $this->parseAssignOpMul($expr);
case 'Expr_AssignOp_Div': case 'Expr_AssignOp_Div':
return $this->parseAssignOpDiv($expr); return $this->parseAssignOpDiv($expr);
case 'Expr_BinaryOp_Mul':
return $this->parseBinaryOpMul($expr);
case 'Expr_AssignOp_Mod': case 'Expr_AssignOp_Mod':
return $this->parseAssignOpMod($expr); return $this->parseAssignOpMod($expr);
case 'Expr_AssignOp_ShiftRight':
return $this->parseAssignOpShiftRight($expr);
case 'Expr_BinaryOp_Mul':
return $this->parseBinaryOpMul($expr);
case 'Expr_BinaryOp_Concat': case 'Expr_BinaryOp_Concat':
return $this->parseBinaryOpConcat($expr); return $this->parseBinaryOpConcat($expr);
case 'Expr_BinaryOp_Greater': case 'Expr_BinaryOp_Greater':
@ -318,6 +326,7 @@ class Translator extends \PhpAot\Core\Translator
return $this->parseBinaryOpLogicalOr($expr); return $this->parseBinaryOpLogicalOr($expr);
case 'Expr_BinaryOp_LogicalXor': case 'Expr_BinaryOp_LogicalXor':
return $this->parseBinaryOpLogicalXor($expr); return $this->parseBinaryOpLogicalXor($expr);
// 减法
case 'Expr_BinaryOp_Minus': case 'Expr_BinaryOp_Minus':
return $this->parseBinaryOpMinus($expr); return $this->parseBinaryOpMinus($expr);
case 'Expr_Array': case 'Expr_Array':
@ -357,6 +366,8 @@ class Translator extends \PhpAot\Core\Translator
case 'Scalar_String': case 'Scalar_String':
case 'Expr_Variable': case 'Expr_Variable':
return $this->parseIdentifier($expr); return $this->parseIdentifier($expr);
case 'Scalar_MagicConst_File':
return $this->parseMagicConstFile($expr);
case 'Scalar_InterpolatedString': case 'Scalar_InterpolatedString':
return $this->parseInterpolatedString($expr); return $this->parseInterpolatedString($expr);
case 'Expr_Cast_Int': case 'Expr_Cast_Int':
@ -441,12 +452,12 @@ class Translator extends \PhpAot\Core\Translator
return '(' . $left . ') * (' . $right . ')'; return '(' . $left . ') * (' . $right . ')';
} }
protected function addVar(string $name, string $type): void private function addVar(string $name, string $type): void
{ {
$this->scope[$name] = $type; $this->scope[$name] = $type;
} }
protected function hasVar(string $name) private function hasVar(string $name)
{ {
return isset($this->scope[$name]); return isset($this->scope[$name]);
} }
@ -1135,8 +1146,19 @@ class Translator extends \PhpAot\Core\Translator
return implode(PHP_EOL . $this->getIndent(), $lines); return implode(PHP_EOL . $this->getIndent(), $lines);
} }
private function parsePropertyFetch(mixed $expr): string private function parsePropertyFetch(Node $expr): string
{ {
return $this->parseIdentifier($expr->var) . '.getProperty(' . $this->parseIdentifier($expr->name) . ')'; return $this->parseIdentifier($expr->var) . '.getProperty(' . $this->parseIdentifier($expr->name) . ')';
} }
private function parseAssignOpShiftRight(Node $node): string
{
$var = $this->parseIdentifier($node->var);
return $var . ' >> ' . $this->parseIdentifier($node->expr);
}
private function parseMagicConstFile(mixed $expr): string
{
return '"' . $this->escapeString($this->file) . '"';
}
} }

Loading…
Cancel
Save