

// OK
.comp A {


}

// also OK
.comp B<N> {

    .comp BB {}                     // ok
    .comp BC : A {}                 // ok
    .comp BC : A<symbol> {}         // not ok

    // those are fine
    .init X = A
    .init X = BB // TODO X already used, is that ok ?
}

// also Fine
.comp C<N,M> : B<N> {

    // this is fine
    .init X = B<N>
    .init Y = BB

    // this is not fine
    .init X = B
    .init X = B<N,N>

}

// 2. and 3. parent invalid
.comp D<M> : C<M,M>, B<M,M>, D, M {

}

// also invalid
.comp E : E {

}

// also invalid
.comp F : G { }
.comp G : F { }


// this should be fine
.init X = A

// this should fail
.init Y = B

// this is OK
.init Z = B<symbol>

// this is not
.init W = B<symbol,symbol>

// also this is not ok
.init U = M


