예제 #1
0
파일: ModifierParser.php 프로젝트: Vyki/orm
 private function processArgs(TokenIterator $iterator, $modifierName, $inArray)
 {
     $result = [];
     $iterator->position++;
     while (isset($iterator->tokens[$iterator->position])) {
         list($value, , $type) = $iterator->currentToken();
         if ($type === self::TOKEN_RBRACKET) {
             if ($inArray) {
                 return $result;
             } else {
                 throw new InvalidModifierDefinitionException("Modifier {" . "{$modifierName}} mismatches brackets.");
             }
         } elseif ($type === self::TOKEN_STRING || $type === self::TOKEN_KEYWORD) {
             $iterator->position++;
             list(, , $nextToken) = $iterator->currentToken();
             if ($nextToken === self::TOKEN_EQUAL) {
                 $iterator->position++;
                 list(, , $nextToken) = $iterator->currentToken();
                 $nextValue = $iterator->currentValue();
                 if ($nextToken === self::TOKEN_LBRACKET) {
                     $result[$value] = $this->processArgs($iterator, $modifierName, TRUE);
                 } elseif ($nextToken === self::TOKEN_STRING || $nextToken === self::TOKEN_KEYWORD) {
                     $result[$value] = $nextValue;
                 } elseif ($nextToken !== NULL) {
                     throw new InvalidModifierDefinitionException("Modifier {" . "{$modifierName}} has invalid token after =.");
                 }
             } elseif ($type !== NULL) {
                 $iterator->position--;
                 $result[] = $value;
             }
         } else {
             throw new InvalidModifierDefinitionException("Modifier {" . "{$modifierName}} has invalid token, expected string or keyword.");
         }
         $iterator->position++;
         list(, , $type) = $iterator->currentToken();
         if ($type === self::TOKEN_RBRACKET && $inArray) {
             return $result;
         } elseif ($type !== NULL && $type !== self::TOKEN_SEPARATOR) {
             throw new InvalidModifierDefinitionException("Modifier {" . "{$modifierName}} misses argument separator.");
         }
         $iterator->position++;
     }
     if ($inArray) {
         throw new InvalidModifierDefinitionException("Modifier {" . "{$modifierName}} has unclosed array argument.");
     }
     return $result;
 }
예제 #2
0
파일: Parser.php 프로젝트: kdyby/aop
 /**
  * @param TokenIterator $tokens
  * @param array|string $types
  * @param array|string $allowedToSkip
  * @throws \Kdyby\Aop\ParserException
  * @return NULL|string
  */
 protected static function nextValue(TokenIterator $tokens, $types, $allowedToSkip = [])
 {
     do {
         if (call_user_func_array([$tokens, 'isCurrent'], (array) $types)) {
             return $tokens->currentValue();
         }
         if (!$allowedToSkip || !call_user_func_array([$tokens, 'isCurrent'], (array) $allowedToSkip)) {
             $type = $tokens->currentToken();
             throw new Kdyby\Aop\ParserException('Unexpected token ' . $type[Tokenizer::TYPE] . ' at offset ' . $type[Tokenizer::OFFSET]);
         }
     } while ($token = $tokens->nextToken());
     throw new Kdyby\Aop\ParserException('Expected token ' . implode(', ', (array) $types));
 }