/* $Header$ */
/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
#define E_NODE	0
#define E_VAR	1	/* Variable *or* channel */
#define E_CONST	2
#define E_TABLE	3
#define E_BTAB	4
#define E_NOW	5
#define E_IO	6
#define E_CALL	7

struct table {
	struct table	*next;
	long	val;
};

struct expr;

struct expr_list {
	struct expr_list	*next;
	struct expr *arg;
};

struct expr {
	short kind;
	short type;
	int arr_siz;
	union {
		struct {
			int op;
			struct expr *left, *right;
		} node;

		struct symbol *var;

		long const;

		int tab;

		struct {
			int out;
			struct expr *chan;
			struct expr_list *args;
		} io;

		struct {
			struct expr *c_proc;
			struct expr_list *c_args;
		} call;
	} u;
};

struct expr *new_node(), *new_var(), *new_const(), *new_table(), *new_now();
struct expr *new_io(), *new_call(), *copy_const();
void table_add(), expr_list_add();
void check_param(), check_io(), check_wait();
void destroy(), used();

#define valueless(e)		(((e)->type&T_TYPE)==T_VOID)
#define valued(e)		(((e)->type&T_TYPE)==T_VALUE)
#define input_process(e)	((e)->kind==E_IO && !(e)->u.io.out)
#define constant(e)		((e)->kind==E_CONST)
#define arr_constant(e)		((e)->kind==E_TABLE || (e)->kind==E_BTAB)
