enum op { String, Query, Star, Plus, Or, And, Class, Dot, Exc, Et, Id} ; typedef union Node Node; typedef struct Symbol Symbol; typedef struct SymbolTable SymbolTable; typedef struct NodeCount NodeCount; struct String { enum op type; char *string; int len; }; struct Query { enum op type; Node *children[1]; }; struct Star { enum op type; Node *children[1]; }; struct Plus { enum op type; Node *children[1]; }; struct Or { enum op type; Node *children[2]; }; struct And { enum op type; Node *children[2]; }; struct Class { enum op type; char *array; }; struct Dot { enum op type; }; struct Exc { enum op type; Node *children[1]; }; struct Et { enum op type; Node *children[1]; }; struct Id { enum op type; Symbol *symbol; }; union Node { enum op type; struct String String; struct Query Query; struct Star Star; struct Plus Plus; struct Or Or; struct And And; struct Class Class; struct Dot Dot; struct Exc Exc; struct Et Et; struct Id Id; }; struct Symbol{ char* name; Node *rule; int number; };