generators.ET0LTreeGrammar:
( { S, D, H, Da, Ha, Hb, Hab  },
  { inner:0, edge:0, edge2:0, edges:0, corner:0, corner2:0, q:4, d:4, h:2, rot90:1, rot180:1, rot270:1, empty:0 },
  {
    { % Plaiting table, neither inserting nor allowing breaks
      %
      S -> q[D, D, D, D],
      D -> d[inner, H, H, D],
      H -> h[inner, H],
      Da -> d[inner, Ha, Hb, D],
      Ha -> h[inner, Ha],
      Hb -> h[inner, Hb],
      Hab -> h[inner, Hab]
    },
    { % enable breaks (see rules for S resp. D)
      %
      S -> q[Da, Da, Da, Da],
      D -> d[inner, Hb, Ha, Da],
      H -> h[inner, H],
      Da -> d[inner, Hab, Hab, Da],
      Ha -> h[inner, Ha],
      Hb -> h[inner, Hb],
      Hab -> h[inner, Hab]
    },
    { % insert breaks (where enabled)
      %
      S -> q[D, D, D, D],
      D -> d[inner, H, H, D],
      H -> h[inner, H],
      Da -> d[rot180[corner2], Ha, Hb, D],
      Ha -> h[rot270[edge2], Ha],
      Hb -> h[rot90[edge2], Hb],
      Hab -> h[rot90[edges], Hab]
    },
    { % insert breaks (where enabled) and enable breaks
      %
      S -> q[Da, Da, Da, Da],
      D -> d[inner, Hb, Ha, Da],
      H -> h[inner, H],
      Da -> d[rot180[corner2], Hab, Hab, Da],
      Ha -> h[rot270[edge2], Ha],
      Hb -> h[rot90[edge2], Hb],
      Hab -> h[rot90[edges], Hab]
    },
    { % Terminating table
      %
      S -> q[corner, corner, corner, corner],
      D -> corner,
      H -> edge,
      Da -> corner,
      Ha -> edge,
      Hb -> edge,
      Hab -> edge
    },
    { % Alternative terminating table
      %
      S -> q[corner2, corner2, corner2, corner2],
      D -> corner2,
      H -> edge2,
      Da -> corner2,
      Ha -> edge2,
      Hb -> edge2,
      Hab -> edge2
    }
  },
  S,
  (2(1,2,3,4)*3 1*, 1+[2(1,2,3,4)*3 1*])*(5,6)
  )
