/**
  * 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;
 }
Esempio n. 2
0
 /**
  * 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;
 }