private function doTransitionFromD() : self
    {
        if ($this->getToken() === Grammar::T_L) {
            $this
                ->setState(self::STATE_C)
                ->addPosition(1)
                ->addTokenValue(Grammar::T_L);
            return $this;
        }

        if ($this->getToken() === Grammar::T_X && $this->hasToken(1) && $this->getToken(1) === Grammar::T_L) {
            $this
                ->setState(self::STATE_B)
                ->addPosition(2)
                ->addTokenValue(Grammar::T_L, Grammar::T_X);
            return $this;
        }

        if ($this->getToken() === Grammar::T_X && $this->hasToken(1) && $this->getToken(1) === Grammar::T_C) {
            $this
                ->setState(self::STATE_B)
                ->addPosition(2)
                ->addTokenValue(Grammar::T_C, Grammar::T_X);
            return $this;
        }

        $this->setState(self::STATE_C);
        return $this;
    }