/** * Avalia a expressão e retorna o seu valor (resolve a expessão) * @param TreeNode|TreeLeaf $treeNode Arvore que será analizada * @return float|int|null Resultado da expressão */ public function evaluate($treeNode = null) { $result = null; if ($treeNode == null) { $result = $this->treeNode == null ? 0 : $this->evaluate($this->treeNode); } else { if ($treeNode instanceof TreeLeaf) { /** * SE é uma folha, então so tem o valor numérico */ $result = $treeNode->getValue(); } else { /** * Aqui é nó binário, então existe o lado esquerdo, direito e o operador */ $operator = $treeNode->getOperator(); /** * Chama recursivamente cada lado do nó (que podem ser outros nós) */ $valueLeft = $this->evaluate($treeNode->getLeft()); $valueRight = $this->evaluate($treeNode->getRight()); /** * Executa as operações */ switch ($operator) { case '+': $result = $valueLeft + $valueRight; break; case '-': $result = $valueLeft - $valueRight; break; case '*': $result = $valueLeft * $valueRight; break; case '/': $result = $valueLeft / $valueRight; break; case '^': $result = $valueLeft ^ $valueRight; break; } } } return $result; }
/** * Helper function to generate the code using a given * root node. * * @param TreeNode $root - the root node * @return string - the generated code * @author Karthik Viswanathan */ private function generateCode($root) { $node = $root->getValue(); if ($node instanceof Tag) { $str = $node->getTagHTML(); // open tag foreach ($root->getChildren() as $child) { $str .= $this->generateCode($child, $str); // everything inside tag } if (!$node->isSelfClosed()) { $str .= '</' . $node->getName() . '>'; } // end tag } else { $str = $node; } // node is just text return $str; }