#define NIL ((Node *) 0)
#define NULL 0
typedef void (*PF)(); // pointer to function type

class Node {
      char *datum;
      Node *next;
   public:
      Node(char *);
      ~Node();

      char *get_datum();
      char *set_datum(char *);
      Node *get_next();
      Node *set_next(Node *);
};

class List {
      Node *head;
      int list_length;
   public:
      List();
      List(char *);
      ~List();

      Node *get_head();
      Node *set_head(Node *);
      int get_length();
      int set_length(int);
      List *cons(char *);
      int length();
      int traverse();
      char *car();
      List *cdr();
      List *append(List *);
};

class Universal {
   public:
      char *father;
      char *attribute;
};

class Construction : public Universal {
};

class Repetition : public Universal {
   public:
      List child;

      List get_child();
      List set_child(List);
};

class Terminal : public Universal {
   public:
      char *val;
      char *get_val();
      char *set_val(char *);
};

/*
 * class Ident : public Terminal {
 *    public:
 *      Ident(char *);
 *      ~Ident();
 * };
 * 
 * class Number : public Terminal {
 *    public:
 *       Number(int);
 *       Number(char *);
 *       ~Number();
 * 
 *       int get_val();
 *       int set_val(int);
 *       int set_val(char *);
 * };
 */

