/*	$OpenBSD: llparse.h,v 1.2 1996/03/04 10:37:05 mickey Exp $	*/
/*	$NetBSD: llparse.h,v 1.4 1994/06/29 06:41:04 cgd Exp $	*/

	/************************************************************
		attributes stack garbage
	************************************************************/

#define LLMAXATTR	512
#define LLMAXDESC	256
#define	LLATTR		/* build an attribute stack */

	/*
	**	attribute stack
	**
	**	AttrStack =	stack of record
	**				values : array of values;
	**				ptr	: index;
	**	end;
	**
	*/

	typedef union llattrib LLattrib;

	extern LLattrib	llattributes[LLMAXATTR];
	extern int	llattrtop;

	extern struct	llattr {
		LLattrib	*llabase; /* ptr into the attr stack (llattributes) */
		int		llaindex;/* # attrs on the stack so far for this prod */
		int		llacnt;/* total # ever to go on for this prod */

		int		lloldtop;/* when popping this prod, restore stack to here ;
						 one attr will remain on the stack (for the lhs) */
	}	llattrdesc[LLMAXDESC];

	extern int	lldescindex;

	/************************************************************
		attributes stack garbage
	************************************************************/

	extern	struct	lltoken {
		short		llterm;		/* token number */
		short		llstate;	/* inserted deleted normal */
		LLattrib	llattrib; 
	} 	lltoken;
	typedef	struct lltoken	LLtoken;

/************************************************************
	constants used in llparse.c
************************************************************/

#define STACKSIZE	500
#define MAXCORR		16

#define	NORMAL		0
#define	DELETE		1
#define	INSERT		2

/************************************************************
	datatypes used to communicate with the parser
************************************************************/

struct	llinsert {
	short	llinscost;
	short	llinslength;
	short	llinsert[MAXCORR];
};
typedef	struct llinsert	LLinsert;

extern	short	llparsestack[];
extern	short	llstackptr;
extern	short	llinfinite;

/************************************************************
	variables used to pass information
	specific to each grammer
************************************************************/

extern	short	llnterms;
extern	short	llnsyms;
extern	short	llnprods;

extern	char	*llefile;

extern	struct	llparsetable {
	short	llterm;
	short	llprod;
}	llparsetable[];

extern	short	llparseindex[];

extern	short	llepsilon[];

extern	short	llproductions[];

extern	struct	llprodindex {
	short	llprodstart;
	short	llprodlength;
	short	llprodtlen;
}	llprodindex[];

extern	struct	llcosts {
	short	llinsert;
	short	lldelete;
}	llcosts[];

extern	struct	llstable {
	short	llsstart;
	short	llslength;
}	llstable[];

extern	short	llsspace[];

extern	struct	lletable {
	short	llecost;
	short	llelength;
	short	llestart;
}	lletable[];

extern	long	lleindex[];

extern	short	llespace[];

extern	char	*llstrings[];

/************************************************************
	routines defined in llparse.c
************************************************************/

extern llparse();
extern llcopye();
extern llcopys();
extern llcorrector();
extern llepsilonok();
extern llexpand();
extern short llfindaction();
extern llgetprefix();
extern llgettoken();
extern llinsert();
extern llinsertsym();
extern llinserttokens();
extern llparsererror();
extern llpushprod();
extern llreadetab();