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;
}
} elseif ($type === self::TOKEN_LBRACKET) {
$result[] = $this->processArgs($iterator, $modifierName, true);
} else {
throw new InvalidModifierDefinitionException("Modifier {{$modifierName}} has invalid token, expected string, keyword, or array.");
}
$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;
}