public function compile(Compiler $compiler, OperatorNode $node) { $left = $node->getChild(OperatorNode::OPERAND_LEFT); $compiler->add('('); if ($this->isPropertyAccessOperator($left)) { $root = $left; while ($this->isPropertyAccessOperator($root)) { $root = $root->getChild(OperatorNode::OPERAND_LEFT); } if ($root instanceof VariableNode) { $compiler->add('isset(')->compileNode($root)->add(') &&'); } $left->addData('mode', 'has'); $left->compile($compiler); $left->addData('mode', 'get'); $compiler->add(') ? (')->compileNode($left)->add(')'); } elseif ($left instanceof VariableNode) { $compiler->add('isset(')->compileNode($left)->add(')) ? (')->compileNode($left)->add(')'); } elseif ($left instanceof ArrayIndexNode) { $variable = $left->getChild('identifier'); $keys = [$left->getChild('key')]; while ($variable instanceof ArrayIndexNode) { /** @var $right OperatorNode */ $keys[] = $variable->getChild('key'); $variable = $variable->getChild('identifier'); } $arguments = [$variable, array_reverse($keys)]; $compiler->add('isset(')->compileNode($variable)->add(') && $context->hasProperty')->compileArgumentList($arguments)->add(') ? (')->compileNode($left)->add(')'); } else { $compiler->compileNode($left)->add(') ?'); } $compiler->add(' : (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')'); }
public function compile(Compiler $compiler, OperatorNode $node) { //if(sign($left) != sign($right)) $compiler->add('((')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' < 0 && ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' > 0) || (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' < 0 && ')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' > 0)'); //then $right + $left % right $compiler->add(' ? (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' + ')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')'); //else $left % $right $compiler->add(': (')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add('))'); }
public function compile(Compiler $compiler, OperatorNode $node) { $data = $node->getChild(OperatorNode::OPERAND_LEFT); $filter = $node->getChild(OperatorNode::OPERAND_RIGHT); if ($filter instanceof FunctionNode) { $arguments = $filter->getArguments(); array_unshift($arguments, $data); $filter->setArguments($arguments); } elseif ($filter instanceof IdentifierNode && !$filter instanceof VariableNode) { $filter = new FunctionNode($filter->getData('name'), [$data]); } else { throw new ParseException('Invalid filter node.'); } $filter->compile($compiler); }
public function compile(Compiler $compiler, OperatorNode $node) { $left = $node->getChild(OperatorNode::OPERAND_LEFT); $keys = [$node->getChild(OperatorNode::OPERAND_RIGHT)]; while ($this->isPropertyAccessOperator($left)) { /** @var $left OperatorNode */ $keys[] = $left->getChild(OperatorNode::OPERAND_RIGHT); $left = $left->getChild(OperatorNode::OPERAND_LEFT); } $arguments = [$left, array_reverse($keys)]; if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) { $arguments[] = $node->getChild(OperatorNode::OPERAND_MIDDLE); } $compiler->add('$context->' . $this->getMethodName($node))->compileArgumentList($arguments); }
public function compile(Compiler $compiler, OperatorNode $node) { $compiler->add('(--')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')'); }
public function compile(Compiler $compiler, OperatorNode $node) { $compiler->add('(')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % 2 == 0)'); }
/** * @param OperatorNode $node * * @return bool */ private function isFilterSafe(OperatorNode $node) { if ($this->functionLevel++ === 0) { return $this->isFunctionSafe($node->getChild(OperatorNode::OPERAND_RIGHT)); } return true; }
public function compile(Compiler $compiler, OperatorNode $node) { $compiler->add('range(')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(', ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' - 1)'); }