private function assertChildrenCount(TreeNode $node, $count) { if ($node->getChildrenNumber() !== $count) { throw new Exception(sprintf('Node was expected to have only %s children.', $count)); } }
/** * Merge recursively. * Please, see self::mergeTree() to know the context. * * @param \Hoa\Compiler\Llk\TreeNode $node Node that receives. * @param \Hoa\Compiler\Llk\TreeNode $newNode Node to merge. * @return void */ protected function mergeTreeRecursive(TreeNode $node, TreeNode $newNode) { $nNId = $newNode->getId(); if ('token' === $nNId) { $node->appendChild($newNode); $newNode->setParent($node); return; } $children = $node->getChildren(); end($children); $last = current($children); if ($last->getId() !== $nNId) { $node->appendChild($newNode); $newNode->setParent($node); return; } foreach ($newNode->getChildren() as $child) { $this->mergeTreeRecursive($last, $child); } return; }
private function leftRotateTree(TreeNode &$root) { // Pivot = Root.Left $pivot = $root->getChild(1); // Root.Right = Pivot.Left $children = $root->getChildren(); $children[1] = $pivot->getChild(0); // Pivot, rotation side $root->setChildren($children); // Pivot.Left = Root $children = $pivot->getChildren(); $children[0] = $root; $pivot->setChildren($children); // Root = Pivot $root = $pivot; }