private function getValues()
    {
        $tokens = array();

        // check if a value list is given
        if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) {
            $this->match(DocLexer::T_OPEN_PARENTHESIS);

            $tokens[] = array(DocLexer::T_OPEN_PARENTHESIS);

            // skip if we are given an empty list: @example()
            if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) {
                $this->match(DocLexer::T_CLOSE_PARENTHESIS);

                $tokens[] = array(DocLexer::T_CLOSE_PARENTHESIS);

                return $tokens;
            }

            // skip if no list is given
        } else {
            return $tokens;
        }

        // collect the first value
        $tokens = array_merge($tokens, $this->getValue());

        // check for comma separated values and collect those too
        while ($this->lexer->isNextToken(DocLexer::T_COMMA)) {
            $this->match(DocLexer::T_COMMA);

            $tokens[] = array(DocLexer::T_COMMA);

            $token = $this->lexer->lookahead;
            $value = $this->getValue();

            // no multiple trailing commas
            if (empty($value)) {
                throw SyntaxException::expectedToken('Value', $token);
            }

            $tokens = array_merge($tokens, $value);
        }

        // end the list
        $this->match(DocLexer::T_CLOSE_PARENTHESIS);

        $tokens[] = array(DocLexer::T_CLOSE_PARENTHESIS);

        return $tokens;
    }