private function makeLexicalAnalyze(Aspect $aspect, $reflection, string $pointcutExpression): TokenStream
    {
        try {
            $resolvedThisPointcut = str_replace('$this', \get_class($aspect), $pointcutExpression);
            $stream = $this->pointcutLexer->lex($resolvedThisPointcut);
        } catch (RecognitionException $e) {
            $message = 'Can not recognize the lexical structure `%s` before %s, defined in %s:%d';
            $message = sprintf(
                $message,
                $pointcutExpression,
                (isset($reflection->class) ? $reflection->class . '->' : '') . $reflection->name,
                method_exists($reflection, 'getFileName')
                    ? $reflection->getFileName()
                    : $reflection->getDeclaringClass()->getFileName(),
                method_exists($reflection, 'getStartLine')
                    ? $reflection->getStartLine()
                    : 0
            );
            throw new UnexpectedValueException($message, 0, $e);
        }

        return $stream;
    }