Esempio n. 1
0
 /**
  * @param mixed $value
  * @return BaseToken
  * @throws ParserException
  */
 public static function createFromPHPType($value)
 {
     switch ($type = gettype($value)) {
         case 'string':
             $current = new TokenString($value);
             break;
         case 'integer':
             $current = new TokenInteger($value);
             break;
         case 'boolean':
             $current = new TokenBool($value);
             break;
         case 'NULL':
             $current = new TokenNull($value);
             break;
         case 'double':
             $current = new TokenFloat($value);
             break;
         case 'array':
             $params = new TokenCollection();
             foreach ($value as $item) {
                 $params->attach(static::createFromPHPType($item));
             }
             $current = new TokenArray($params);
             break;
         default:
             throw new ParserException('Unsupported PHP type: "%s"', $type);
     }
     return $current;
 }
Esempio n. 2
0
 /**
  * @param TokenCollection $parameters
  * @return TokenInteger
  * @throws \Exception
  */
 public function call(TokenCollection $parameters)
 {
     if ($parameters->count() < 1) {
         $value = -1;
     } else {
         $value = strpos($this->token->getValue(), $parameters->current()->getValue());
         if ($value === \false) {
             $value = -1;
         }
     }
     return new TokenInteger($value, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 3
0
 /**
  * @param TokenCollection $parameters
  * @return TokenString
  */
 public function call(TokenCollection $parameters)
 {
     if ($parameters->count() < 1) {
         $offset = 0;
     } else {
         $offset = (int) $parameters->current()->getValue();
     }
     $tokenValue = $this->token->getValue();
     if (!isset($tokenValue[$offset])) {
         $char = '';
     } else {
         $char = $tokenValue[$offset];
     }
     return new TokenString($char, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 4
0
 /**
  * @param TokenCollection $parameters
  * @return Tokens\TokenString
  * @throws ParserException
  */
 public function call(TokenCollection $parameters)
 {
     if (!$this->token instanceof Tokens\TokenArray) {
         throw new ParserException(sprintf('%s.join is not a function at position %d on line %d', $this->token->getValue(), $this->token->getPosition(), $this->token->getLine()));
     }
     if ($firstParam = $parameters->current()) {
         $glue = $firstParam->getValue();
     } else {
         $glue = ',';
     }
     $array = $this->token->getValue();
     if ($array instanceof TokenCollection) {
         $array = $array->toArray();
     }
     return new Tokens\TokenString(implode($glue, $array), $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 5
0
 /**
  * @param TokenCollection $parameters
  * @return TokenString
  * @throws \Exception
  */
 public function call(TokenCollection $parameters)
 {
     $parameters->rewind();
     $numParams = $parameters->count();
     $isRegExpr = \false;
     if ($numParams < 1) {
         $search = '';
     } else {
         $search = $parameters->current()->getValue();
         $isRegExpr = $parameters->current() instanceof TokenRegex;
     }
     if ($numParams < 2) {
         $replace = 'undefined';
     } else {
         $parameters->next();
         $replace = $parameters->current()->getValue();
     }
     if ($isRegExpr) {
         list($expression, $modifiers) = $this->splitRegex($search);
         $modifiers = str_replace('g', '', $modifiers, $count);
         $limit = $count > 0 ? -1 : 1;
         $value = preg_replace($expression . $modifiers, $replace, $this->token->getValue(), $limit);
     } else {
         $value = str_replace($search, $replace, $this->token->getValue());
     }
     return new TokenString($value, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 6
0
 /**
  * @param TokenCollection $parameters
  * @return Tokens\TokenArray
  */
 public function call(TokenCollection $parameters)
 {
     $separator = $parameters->current();
     if (!$separator || !is_string($separator->getValue())) {
         $newValue = [$this->token->getValue()];
     } else {
         $params = [$separator->getValue(), $this->token->getValue()];
         if ($parameters->count() >= 2) {
             $parameters->next();
             $params[] = (int) $parameters->current()->getValue();
         }
         if ($separator instanceof Tokens\TokenRegex) {
             $func = 'preg_split';
         } else {
             $func = 'explode';
         }
         $newValue = call_user_func_array($func, $params);
     }
     return new Tokens\TokenArray($newValue, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 7
0
 /**
  * @param TokenCollection $parameters
  * @return TokenBool
  * @throws ParserException
  */
 public function call(TokenCollection $parameters)
 {
     if (!$this->token instanceof TokenRegex) {
         throw new ParserException(sprintf('undefined is not a function at position %d on line %d', $this->token->getPosition(), $this->token->getLine()));
     }
     if ($parameters->count() < 1) {
         $bool = \false;
     } else {
         // Remove "g" modifier as is does not exist in PHP
         // It's also irrelevant in .test() but allowed in JS here
         $pattern = preg_replace_callback('~/[igm]{0,3}$~', function (array $modifiers) {
             return str_replace('g', '', $modifiers[0]);
         }, $this->token->getValue());
         $subject = $parameters->current()->getValue();
         while ($subject instanceof TokenCollection) {
             $subject = current($subject->toArray());
         }
         $bool = (bool) preg_match($pattern, (string) $subject);
     }
     return new TokenBool($bool, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 8
0
 /**
  * @param TokenCollection $parameters
  * @return TokenString
  */
 public function call(TokenCollection $parameters)
 {
     $parameters->rewind();
     $params = [];
     if ($parameters->count() < 1) {
         $params[] = 0;
     } else {
         $params[] = (int) $parameters->current()->getValue();
     }
     if ($parameters->count() >= 2) {
         $parameters->next();
         $params[] = (int) $parameters->current()->getValue();
     }
     $value = call_user_func_array('substr', array_merge([$this->token->getValue()], $params));
     return new TokenString((string) $value, $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 9
0
 /**
  * @param TokenCollection $parameters
  * @return TokenFloat
  */
 public function call(TokenCollection $parameters)
 {
     $parameters->rewind();
     return new TokenFloat((double) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack());
 }
Esempio n. 10
0
 /**
  * @since 0.3.4
  * @param string $stopAt
  * @return AST\TokenCollection
  * @throws ParserException
  */
 protected function getCommaSeparatedValues($stopAt = ')')
 {
     $commaExpected = \false;
     $items = new AST\TokenCollection();
     do {
         $this->ast->next();
         if (!($current = $this->ast->current())) {
             throw new ParserException(sprintf('Unexpected end of string. Expected "%s"', $stopAt));
         }
         if ($current->getGroup() === Constants::GROUP_VALUE) {
             if ($commaExpected) {
                 throw new ParserException(sprintf('Unexpected value at position %d on line %d', $current->getPosition(), $current->getLine()));
             }
             $commaExpected = \true;
             $items->attach($current);
         } elseif ($current instanceof Tokens\TokenComma) {
             if (!$commaExpected) {
                 throw new ParserException(sprintf('Unexpected token "," at position %d on line %d', $current->getPosition(), $current->getLine()));
             }
             $commaExpected = \false;
         } elseif ($current->getValue() === $stopAt) {
             break;
         } elseif (!$this->isIgnoredToken($current)) {
             throw new ParserException(sprintf('Unexpected token "%s" at position %d on line %d', $current->getOriginalValue(), $current->getPosition(), $current->getLine()));
         }
     } while ($this->ast->valid());
     if (!$commaExpected && $items->count() > 0) {
         throw new ParserException(sprintf('Unexpected token "," at position %d on line %d', $current->getPosition(), $current->getLine()));
     }
     $items->rewind();
     return $items;
 }
Esempio n. 11
0
 /**
  * @param TokenCollection $parameters
  * @return TokenInteger
  */
 public function call(TokenCollection $parameters)
 {
     return new TokenInteger((int) $parameters->current()->getValue(), $this->token->getOffset(), $this->token->getStack());
 }