Beispiel #1
0
 /**
  * Výsledný textový výstup
  *
  * @param string
  * @return string
  */
 protected function compile($input)
 {
     $locale = setlocale(LC_NUMERIC, 0);
     setlocale(LC_NUMERIC, "C");
     $tree = $this->parser->parse($input);
     $reduced = $this->analyzer->analyze($tree, $this->variables);
     $output = $this->generator->generate($reduced, $this->defaultUnit);
     setlocale(LC_NUMERIC, $locale);
     return $output;
 }
Beispiel #2
0
 /**
  * Vyhodnocení binární operace
  *
  * @param string
  * @param array
  * @param array
  * @return array
  */
 protected function evaluateBinaryOperation($operator, $value1, $value2)
 {
     if (in_array($operator, array('&&', '||', '^^', '=', '!='))) {
         switch ($operator) {
             case '&&':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] && $value2[1];
                 break;
             case '||':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] || $value2[1];
                 break;
             case '^^':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] xor $value2[1];
                 break;
             case '=':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] == $value2[1];
                 break;
             case '!=':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] != $value2[1];
                 break;
         }
         return $answer;
     } elseif ($operator == '.' && $value1[0] == 'string' && $value2[0] == 'raw') {
         return array('string', '\'' . substr($value1[1], 1, -1) . substr(Compiler::stringEncode($value2[1]), 1));
     } elseif ($operator == '.' && $value1[0] == 'raw' && $value2[0] == 'string') {
         return array('string', substr(Compiler::stringEncode($value1[1]), 0, -1) . substr($value2[1], 1, -1) . '\'');
     } elseif ($operator == '.' && $value1[0] == 'string' && $value2[0] == 'unit') {
         return array('string', '\'' . substr($value1[1], 1, -1) . $value2[1] . $this->generator->compileUnit($value2) . '\'');
     } elseif ($operator == '.' && $value1[0] == 'unit' && $value2[0] == 'string') {
         return array('string', '\'' . $value1[1] . $this->generator->compileUnit($value1) . substr($value2[1], 1, -1) . '\'');
     } elseif ($operator == '.' && $value1[0] == 'string' && $value2[0] == 'string') {
         return array('string', '\'' . substr($value1[1], 1, -1) . substr($value2[1], 1, -1) . '\'');
     } elseif (array_key_exists($operator, Compiler::$binaryOperators) && $value1[0] == 'unit' && $value2[0] == 'unit') {
         $answer = array();
         switch ($operator) {
             case '*':
                 $answer[] = 'unit';
                 $answer[] = $value1[1] * $value2[1];
                 $answer[] = $this->getUnit($value1, $value2);
                 break;
             case '/':
                 if ($value2[1] == 0) {
                     throw new CompileException("Dělení nulou");
                 }
                 $answer[] = 'unit';
                 $answer[] = $value1[1] / $value2[1];
                 $answer[] = $this->getUnit($value1, $value2);
                 break;
             case '%':
                 $answer[] = 'unit';
                 $answer[] = $value1[1] % $value2[1];
                 $answer[] = $this->getUnit($value1, $value2);
                 break;
             case '+':
                 $answer[] = 'unit';
                 $answer[] = $value1[1] + $value2[1];
                 $answer[] = $this->getUnit($value1, $value2);
                 break;
             case '-':
                 $answer[] = 'unit';
                 $answer[] = $value1[1] - $value2[1];
                 $answer[] = $this->getUnit($value1, $value2);
                 break;
             case '.':
                 $answer[] = 'string';
                 $answer[] = '\'' . $value1[1] . $this->generator->compileUnit($value1) . $value2[1] . $this->generator->compileUnit($value2) . '\'';
                 break;
             case '>':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] > $value2[1];
                 break;
             case '<':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] < $value2[1];
                 break;
             case '>=':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] >= $value2[1];
                 break;
             case '<=':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] <= $value2[1];
                 break;
             case '<>':
                 $answer[] = 'bool';
                 $answer[] = $value1[1] != $value2[1];
                 break;
             default:
                 throw new CompileException("Neznámý operátor");
                 break;
         }
         return $answer;
     }
     throw new CompileException("Nepovolená operace ({$value1['0']} {$operator} {$value2['0']})");
 }