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; }
/** * @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)); }