/** * 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; }
/** * 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']})"); }