/* @(#)19	1.1  src/agrep/re.h, aixlike.src, aixlike3  9/27/95  15:43:36 */
/*************************************************************
 *							     *
 * 	Macros defining special characters.		     *
 *							     *
 *************************************************************/

#define NUL	    '\0'
#define ASCII_MIN   '\001'
#define ASCII_MAX   '\177'

/*************************************************************
 *							     *
 * 	Macros defining lexical categories.		     *
 *							     *
 *************************************************************/

#define C_LIT	0   /* individual character literal */
#define C_SET	1   /* character set literal	    */

#define EOS		0	/* end-of-string */
#define LITERAL		1
#define OPSTAR		2
#define OPALT		3
#define OPOPT		4
#define OPCAT		5
#define LPAREN		6
#define RPAREN		7

/*************************************************************
 *							     *
 * 	Macros for manipulating syntax tree nodes.	     *
 *							     *
 *************************************************************/

#define lit_type(x)	(x->l_type)
#define lit_pos(x)	(x->pos)
#define lit_char(x)	((x->val).c)
#define lit_cset(x)	((x->val).cset)

#define tok_type(x)	(x->type)
#define tok_val(x)	(x->val)
#define tok_op(x)       (x->val->op)
#define tok_lit(x)	((x->val->refs).lit)

#define Op(x)		(x->op)
#define Lit(x)		((x->refs).lit)
#define Child(x)	((x->refs).child)
#define Lchild(x)	((x->refs).children.l_child)
#define Rchild(x)	((x->refs).children.r_child)
#define Nullable(x)	(x->nullable)
#define Firstpos(x)	(x->firstposn)
#define Lastpos(x)	(x->lastposn)

/*************************************************************
 *							     *
 *  Macros for manipulating DFA states and sets of states.   *
 *							     *
 *************************************************************/

#define Positions(x)	(x->posns)
#define Final_St(x)	(x->final)
#define Goto(x, c)	((x->trans)[c])
#define Next_State(x)	((x)->next_state)

/*************************************************************/

#define new_node(x)	malloc(sizeof(*x))

typedef struct {	/* character range literals */
	    char low_bd, hi_bd;
	} *Ch_Range;

typedef struct ch_set {	    /* character set literals */
	    Ch_Range elt;	/* rep. as list of ranges */
	    struct ch_set *rest;
	} *Ch_Set;

typedef struct {	/* regular expression literal */
	    int pos;	     /* position in syntax tree */
	    short l_type;    /* type of literal */
	    union {
		char c;     /* for character literals */
		Ch_Set cset; /* for character sets */
	    } val;
	} *Re_Lit, *(*Re_lit_array)[];

typedef struct pnode {
	    int posnum;
	    struct pnode *nextpos;
	} *Pset, *(*Pset_array)[];

typedef struct rnode {	/* regular expression node */
	    short op;     /* operator at that node */
	    union {
		Re_Lit lit;		/* child is a leaf node */
		struct rnode *child;	/* child of unary op */
		struct {
		    struct rnode *l_child; 
		    struct rnode *r_child;
		} children;		/* children of binary op */
	    } refs;
	    short nullable;
	    Pset firstposn, lastposn;
	} *Re_node;

typedef struct {			/* token node */
	    short type;
	    Re_node val;
	} *Tok_node;


typedef struct snode {
	    Re_node val;
	    int size;
	    struct snode *next;
	} *Stack;

typedef struct dfa_st {
	    Pset posns;
	    int final;	    /* 1 if the state is a final state, 0 o/w */
	    struct dfa_st *trans[128];
	} *Dfa_state;

typedef struct dfa_stset {
	    Dfa_state st;
	    struct dfa_stset *next_state;
	} *Dfa_state_set;


