generators.ET0LTreeGrammar("advanced solution"):
(
  { S, D, L, C },
  { shrink1:1, shrink2:1, darkRing:0, lightRing:0, .:2, c:1, bg:2,
    subst:2, X1:0, -:0 },
  {
    {
      S -> bg[subst[D,-], subst[L,-]],
      D -> subst[D,subst[C,( darkRing . shrink1[X1])]],
      L -> subst[L,subst[C,( lightRing . shrink2[X1])]],
      C -> c[C]
    },
    {
      S -> bg[-,-],
      D -> ( darkRing . shrink1[X1]),
      L -> ( lightRing . shrink2[X1]),
      C -> c[X1]
    }
  },
  S
)
