BlockList : Block BlockList | ; Block : simb N DList ; DList : | Deriv DList ; Deriv : id SimbList ; SimbList : | Simb SimbList ; Simb : simb T | simb NT ; /* --- BlockList ---*/ typedef struct sBlockList { int flag; union { struct { Block s1; BlockList s2; } d1; struct { } d2; } u; } *BlockList; /* --- Block ---*/ typedef struct sBlock { int flag; union { struct { simb s1; N s2; DList s3; } d1; } u; } *Block; /* --- DList ---*/ typedef struct sDList { int flag; union { struct { } d1; struct { Deriv s1; DList s2; } d2; } u; } *DList; /* --- Deriv ---*/ typedef struct sDeriv { int flag; union { struct { id s1; SimbList s2; } d1; } u; } *Deriv; /* --- SimbList ---*/ typedef struct sSimbList { int flag; union { struct { } d1; struct { Simb s1; SimbList s2; } d2; } u; } *SimbList; /* --- Simb ---*/ typedef struct sSimb { int flag; union { struct { simb s1; T s2; } d1; struct { simb s1; NT s2; } d2; } u; } *Simb;