/************************************************************************/
/*                                                                      */
/* Copyright (c) 1988 -                                                 */
/*     The Rector and Visitors of the University of Virginia            */
/*                                                                      */
/* This code may not be distributed further without permission          */
/*      from the University of Virginia.                                */
/* This code is distributed WITHOUT ANY WARRANTY.  No claims are        */
/*      made as to whether it serves any particular purpose or even     */
/*      works at all.                                                   */
/*                                                                      */
/************************************************************************/

#define SS_SHIFT 5
#define SS_MASK  0x1F
#define S0 ((STOPSET)0)

/*
 * set_in() returns non-zero if the input symbol is in the stopset
 */

#define set_in(member, set) \
	( (set)[(member) >> SS_SHIFT] & (1L << ((member) & SS_MASK)) )

	/* set[member/32] & (1L << (member % 32)) */

/*
 * p_check() generates error message if current symbol is not in
 * the stop set
 */

#define p_check(stop) \
	if (! set_in(symbol, stop)) p_error(0, stop); else;

STOPSET set_cons();

extern STOPBUF
	block_begin,
	const_begin,
	factor_begin,
	term_begin,
	expr_begin,
	type_begin,
	stmt_begin,
	select_begin,
	rel_op,
	add_op,
	mul_op,
	nolabel,
	real_op,
	char_op,
	int_op,
	boole_op,
	set_op,
	point_op
;
