protected function getTextAtCursor(): string
    {
        if (null === $this->textAtCursor) {
            $textAtCursor = substr($this->getText(), $this->cursor);
            if (strlen($textAtCursor) == 0) {
                throw new LengthException("No more text to match tokens");
            }
            $this->textAtCursor = $textAtCursor;
        }
        return $this->textAtCursor;
    }