Plan 9 from Bell Labs’s /usr/web/sources/contrib/steve/root/sys/src/c++/cfront/gram.C

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.



# line 30 "gram.y"
#include "cfront.h"
#include "size.h"
#include "template.h"
#include <string.h>
#ifdef SVR42
#include <unistd.h>
#endif
// include tqueue.h after YYSTYPE is defined ...

int		in_friend = 0;
int		must_be_friend = 0;
int		dont_instantiate = 0;
static int explicit_template_definition = 0;
Pname righttname=0;


static struct parstate {
	Ptype intypedef;
	int   infriend;
	int   defercheck;
	Pname intag;
	int cid;
} pstate[BLMAX];
static int px;
extern int classid;
static void
SAVE_STATE()
{
//error('d',"save_state: in_typedef%t in_tag%n defer_check %d",in_typedef,in_tag,defer_check);
	if ( px >= BLMAX ) error('i',"parsing state stack overflow -- current table %s",Ctbl->whereami());
	pstate[px].intypedef = in_typedef;
	pstate[px].infriend = in_friend;
	in_typedef = 0;
	in_friend = 0;
	pstate[px].defercheck = defer_check;
	defer_check = 0;
	pstate[px].intag = in_tag;
	in_tag = 0;
	pstate[px].cid = classid;
	classid = 0;
	++px;
}
static void
RESTORE_STATE()
{
//error('d',"restore_state: in_typedef%t in_tag%n defer_check %d",in_typedef,in_tag,defer_check);
	if ( --px < 0 ) error('i',"parsing state stack underflow -- current table %s",Ctbl->whereami());
	in_typedef = pstate[px].intypedef;
	in_friend = pstate[px].infriend;
	defer_check = pstate[px].defercheck;
	in_tag = pstate[px].intag;
	classid = pstate[px].cid;
//error('d',"            -> in_typedef%t in_tag%n defer_check %d",in_typedef,in_tag,defer_check);
}


//SYM parsing symbol table management
inline void
PUSH_ARG_SCOPE()
{
DB(if(Kdebug>=1)error('d',"push arg table; %ctbl %s",'C',Ctbl->whereami()););
	Ctbl = new ktable( 0, Ctbl, 0 );
	Ctbl->k_id = ARG;
}
inline void
PUSH_CLASS_SCOPE( Pname n )
{
DB(if(Kdebug>=1)error('d',"pushC table%n; %ctbl %s",n,'C',Ctbl->whereami()););
	// table allocated in name::tname() to avoid problems with forward
	//     refs to class templates
	Pclass cl = n->tp->classtype();
	cl->k_tbl->k_next = Ctbl;
	Ctbl = cl->k_tbl;
	Ctbl->expand(CTBLSIZE);
}
inline void
PUSH_BLOCK_SCOPE()
{
DB(if(Kdebug>=1)error('d',"push block tbl; %ctbl %s in %s",'C',Ctbl->whereami(),Ctbl->k_next->whereami()););
	if ( Ctbl->k_id == ARG )
		Ctbl->expand(TBLSIZE);
	else {
		Ctbl = new ktable(TBLSIZE, Ctbl, Ctbl->k_name );
	}
	Ctbl->k_id = BLOCK;
	if ( Ctbl->k_next == Gtbl
	||   Ctbl->k_next->k_id == BLOCK
	||   Ctbl->k_next->k_id == CLASS )
		Ctbl->k_t->next = Ctbl->k_next->k_t;
}
inline void
PUSH_TEMPLATE_SCOPE()
{
DB(if(Kdebug>=1)error('d',"push template tbl; %ctbl %s",'C',Ctbl->whereami()););
	Ctbl = new ktable( 0, Ctbl, 0 );
	Ctbl->k_id = TEMPLATE;
}
inline void
POP_SCOPE( int deallocate = 0 )
{
DB(if(Kdebug>=1)error('d',"pop tbl %s",Ctbl->whereami()););
	if ( Ctbl == Gtbl ) error('i', "bad parsing table");
	Pktab b = Ctbl;
	Ctbl = Ctbl->k_next;
	if ( b->k_id == ARG || deallocate ) delete b;
}


/*SYM -- replaces set_scope()/curr_scope for switching between scopes
 *       in member defs
 * Temporarily reset scope in member defs:
 *     int X::f( T t = a ) { ... }
 *     int X::s[10] =        ... ,  i = 3;
 *            |----scope of X----|
 * ??? What about exprs "p->operator T()", etc ???
 */
// Although local member defs are illegal outside a local class, scopes
//    are stacked for error recovery / extensibility.
struct pcontext {
	Pktab ktbl;
	int   saved_template;
};
static pcontext scopestack[BLMAX];
static int scopex = 0;
Pname
SET_SCOPE( Pname n )
{
	Pktab ntb;
	if ( n == 0 ) ntb = 0;
	else if ( n == sta_name ) ntb = Gtbl;
	else if ( n->n_template_arg == template_type_formal ) {
		DB(if(Kdebug>=1)error('d',"set scope%n -- template formal -- currently in %s next %s",n,Ctbl->whereami(),Ctbl->k_next->whereami()););
		return n;
	}
	else if ( n->tp ) {
		Ptype t = n->tp->skiptypedefs();
		if ( t->base==COBJ ) ntb = t->classtype()->k_tbl;
		else ntb = 0;
	} else ntb = 0;
	DB(if(Kdebug>=1)error('d',"set scope%n ntb %s next %s, currently in %s",n,ntb->whereami(),ntb?ntb->k_next->whereami():"<nil>",Ctbl->whereami()););
	if (ntb == 0) return 0;//error('i',"scope set to null table(n==%n)!",n);
	if ( scopex >= BLMAX ) error('i',"set scope %s: parsing scope stack overflow -- current table %s",ntb->whereami(),Ctbl->whereami());
	Pktab tt = Ctbl;
	if ( Ctbl->k_id == TEMPLATE ) {
		// parsing template member function
		//    template<...> PT<...>::f() {}
		// be sure template params are in scope when parsing f
		// -- extract template scope from current scope and put it
		//    in new scope
		Ctbl = Ctbl->k_next;
		tt->k_next = ntb->k_next;
		ntb->k_next = tt;
		scopestack[scopex].saved_template = 1;
	}
	else if ( Ctbl->k_id == ARG && Ctbl->k_next->k_id == TEMPLATE ) {
		// parsing static data member template with declarator ()'s.
		//    template<...> T (PT<...>::d) = v;
		// interpose PT's table between ARG table and its parent
		Ctbl = Ctbl->k_next->k_next;
		tt->k_next->k_next = ntb->k_next;
		ntb->k_next = tt->k_next;
		tt->k_next = ntb;
		scopestack[scopex].saved_template = 1;
		ntb = tt;
	}
	scopestack[scopex++].ktbl = Ctbl;
	Ctbl = ntb;
	return n;
}
void
UNSET_SCOPE()
{
	// restore surrounding template scope, if appropriate
	Pktab tt = 0;
	if ( --scopex < 0 ) error('i',"parsing scope stack underflow -- current scope %s",Ctbl->whereami());
	if ( scopestack[scopex].saved_template ) {
		scopestack[scopex].saved_template = 0;
		if ( Ctbl->k_next==0 || Ctbl->k_next->k_id != TEMPLATE )
			error('i',"set scope failed restoring template table -- current table %s",Ctbl->whereami());
		tt = Ctbl->k_next;
		Ctbl->k_next = tt->k_next;
	}
	DB(if(Kdebug>=1)error('d',"unset scope %s -> %s tt %s",Ctbl->whereami(),scopestack[scopex].ktbl->whereami(),tt?tt->whereami():"<nil>"););
	Ctbl = scopestack[scopex].ktbl;
	if ( tt ) { tt->k_next = Ctbl; Ctbl = tt; }
}
inline Pktab
GET_XSCOPE()
{
	if ( scopex-1 < 0 ) error('i',"parsing scope stack underflow -- current table %s",Ctbl->whereami());
	return scopestack[scopex-1].ktbl;
}
inline void
SET_XSCOPE( Pktab tb )
{
	if ( scopex-1 < 0 ) error('i',"parsing scope stack underflow -- current table %s",Ctbl->whereami());
	scopestack[scopex-1].ktbl = tb;
}


// macros
#define copy_if_need_be(s)  ((templp->in_progress || templp->parameters_in_progress) ? strdup(s) : s) 
#define YYMAXDEPTH 600

#if 0
#define YYCLEAN {free(yys); free(yyv);}
#else
#define YYCLEAN
#endif

#ifdef DBG
#ifndef YYDEBUG
#define YYDEBUG 1
#endif
#endif

static int init_seen = 0;
static int cdi = 0;
static Pnlist cd = 0, cd_vec[BLMAX];
static char stmt_seen = 0, stmt_vec[BLMAX];
static Pnlist scd[BLMAX]; // keep track of cd list outside of switch
static int scdp = -1;

static Pname memptr_pn;
static TOK memptr_tok;

static Pname err_name = 0;

// support for template friend declarations within a class
static Pcons templ_friends;

// fcts put into norm2.c just to get them out of gram.y
void sig_name(Pname);	
Ptype tok_to_type(TOK);
void memptrdcl(Pname, Pname, Ptype, Pname);

static bit decl_with_init(Pnlist cd) 
/* do the declarations have an initializer
   or a class object with a constructor */
{
	for (Pname n=cd->head;n;n=n->n_list) {
		if (n->n_initializer) return 1;
		Pname cln=n->tp->is_cl_obj();
		if (cln && Pclass(cln->tp)->c_ctor)
			return 1;
	}
	return 0;
}


static char* 
get_classname(char* s)
{
// error('d',"get_classname(%s)",s);
	char* r = new char[strlen(s)+1];
	sprintf(r,s);
	s = r;

	char* s1 = s;
	while (*s) {
		for ( ; s[0] && (s[0] != '_' || s[1] && s[1] != '_'); s++) s1++;;
		if (*s) {
			if (strncmp(s,"___pt__",7)==0) {
				*s1 = 0;
				return r;
			}
			if (strncmp(s,"__pt__",6)==0) { // parameterized class
				*s1 = '\0';
				return r;
			}
		}
		return r;
	}
	return r;
}

static Pptr doptr(TOK p, TOK t)
{
	Pptr r = new ptr(p,0);
	switch (t) {
	case CONST:
		r->b_const = 1;
               // if (p == RPTR) error('w',"redundant `const' after &");
		break;
	case VOLATILE:
		error('w',"\"volatile\" not implemented (ignored)");
		break;
	default:
		error("syntax error: *%k",t);
	}
	return r;
}

static Pbcl dobase(TOK pr, Pname n, TOK v = 0)
{
// error('d',"dobase(%k %n %k)", pr,n,v);

	Pbcl b = new basecl(0,0);
	b->ppp = pr;	// save protection indicator

	if (n) {
		if (n->base != TNAME) {
			Pname nn = k_find_name(n->string,Ctbl,HIDDEN);
			if ( nn == 0 ) {
				error("BN%n not aTN",n);
				return 0;
			} else
				n = nn;
		}

		Pbase bt = Pbase(n->tp);
		while (bt->base == TYPE) bt = Pbase(bt->b_name->tp);

                if (bt->base != COBJ) {
                        // template <class B> class D : public B {};
                        if (templp->in_progress == true  && bt->base == ANY)
                            error('s',"formalTZ%n used asBC ofY",n);
                        else error("BN%n not aCN",n);
                        return 0;
                }

		if (v) {
			if (v != VIRTUAL) error("syntax error:%k inBCD",v);
			b->base = VIRTUAL;
		}
		else
			b->base = NAME;

		b->bclass = Pclass(bt->b_name->tp);
	}

	return b;
}


#define Ndata(a,b)	b->normalize(Pbase(a),0,0)
#define Ncast(a,b)	b->normalize(Pbase(a),0,1)
#define Nfct(a,b,c)	b->normalize(Pbase(a),Pblock(c),0)
//#define Ncopy(n)	(n->base==TNAME)?new name(n->string):n
inline Pname Ncopy(Pname n)
{
	Pname nn;
	if (n->base!=TNAME) {
		nn = n;
	} else {
		nn = new name(n->string);
		nn->n_template_arg = n->n_template_arg;
	}
	return nn;
}

#define Finit(p)	Pfct(p)->f_init
#define Fargdcl(p,q,r)	Pfct(p)->argdcl(q,r)
#define Freturns(p)	Pfct(p)->returns
#define Fbody(p)	Pfct(p)->body /*SYM*/
#define Vtype(v)	Pvec(v)->typ
#define Ptyp(p)		Pptr(p)->typ

		/* avoid redefinitions */
#undef EOFTOK
#undef ASM
#undef BREAK
#undef CASE
#undef CONTINUE
#undef DEFAULT
#undef DELETE
#undef DO
#undef ELSE
#undef ENUM
#undef FOR
#undef FORTRAN
#undef FRIEND
#undef GOTO
#undef IF
#undef NEW
#undef OPERATOR
#undef RETURN
#undef SIZEOF
#undef SWITCH
#undef THIS
#undef WHILE
#undef LP
#undef RP
#undef LB
#undef RB
#undef REF
#undef DOT
#undef NOT
#undef COMPL
#undef MUL
#undef AND
#undef PLUS
#undef MINUS
#undef ER
#undef OR
#undef ANDAND
#undef OROR
#undef QUEST
#undef COLON
#undef ASSIGN
#undef CM
#undef SM
#undef LC
#undef RC
#undef ID
#undef STRING
#undef ICON
#undef FCON
#undef CCON
#undef ZERO
#undef ASOP
#undef RELOP
#undef EQUOP
#undef DIVOP
#undef SHIFTOP
#undef ICOP
#undef TYPE

#undef CATCH
#undef THROW
#undef TRY

#undef TNAME
#undef EMPTY
#undef NO_ID
#undef NO_EXPR
#undef FDEF
#undef ELLIPSIS
#undef AGGR
#undef MEM
#undef MEMPTR
#undef PR
#undef MEMQ
#undef TSCOPE
#undef DECL_MARKER
#undef REFMUL
#undef LDOUBLE
#undef LINKAGE
#undef TEMPLATE

#undef XVIRT
#undef XNLIST
#undef XILINE
#undef XIA
#undef SM_PARAM
#undef PTNAME
#undef NEW_INIT_KLUDGE

# line 479 "gram.y"
typedef union  {
	char*	s;
	TOK	t;
	int	i;
	loc	l;
	Pname	pn;
	Ptype	pt;
	Pexpr	pe;
	Pstmt	ps;
	Pbase	pb;
	Pnlist	nl;
	Pslist	sl;
	Pelist	el;
	Pbcl	pbc;
	Pptr	pp;
	PP	p;	// fudge: pointer to all class node objects
	Plist	pl;
	toknode* q;	// token queue
} YYSTYPE;

# line 499 "gram.y"
#include "tqueue.h"
extern YYSTYPE yylval, yyval;
extern int yyparse();

// in_typedef should allow for nested in_typedef
extern int	declTag;	 // !1: inline, virtual mod permitted
int		in_sizeof = 0;
int		in_new = 0;
Ptype 		in_typedef = 0;  // catch redefinition of TNAME
Pname		in_tag = 0;      // handle complex typedefs: int (*)()
extern int	defer_check;	 // redefinition typedef check delay

extern 	int must_be_id;	 // !0, TNAME => ID, i.e., int X
int	DECL_TYPE = 0; 	 // lalex() wants this set for global x(*fp)()
int	in_arg_list=0; 	 // !0 when parsing argument list, 1: in (), 2: in <>
static  int in_binit_list=0;
int	in_class_decl=0; // !0 when processing class definition
int	parsing_class_members=0; // !0 when parsing class def but not member function body
int	in_mem_fct=0;    // !0 when parsing member function definition
Ptempl_inst pti = 0; // explicit template class: class X<int> {};

#define yylex lalex
#define NEXTTOK() ( (yychar==-1) ? (yychar=yylex(),yychar) : yychar )
#define EXPECT_ID() must_be_id = 1
#define NOT_EXPECT_ID() must_be_id = 0

Pname syn()
{
ll:
	switch (yyparse()) {
	case 0:		return 0;	// EOF
	case 1:		goto ll;	// no action needed
	default:	return yyval.pn;
	}
}

# define EOFTOK 0
# define ASM 1
# define AUTO 2
# define BREAK 3
# define CASE 4
# define CONTINUE 7
# define DEFAULT 8
# define DELETE 9
# define DO 10
# define ELSE 12
# define ENUM 13
# define FOR 16
# define FORTRAN 17
# define FRIEND 18
# define GOTO 19
# define IF 20
# define NEW 23
# define OPERATOR 24
# define RETURN 28
# define SIZEOF 30
# define SWITCH 33
# define THIS 34
# define WHILE 39
# define LP 40
# define RP 41
# define LB 42
# define RB 43
# define REF 44
# define DOT 45
# define NOT 46
# define COMPL 47
# define MUL 50
# define AND 52
# define PLUS 54
# define MINUS 55
# define LT 58
# define GT 60
# define ER 64
# define OR 65
# define ANDAND 66
# define OROR 67
# define QUEST 68
# define COLON 69
# define ASSIGN 70
# define CM 71
# define SM 72
# define LC 73
# define RC 74
# define ID 80
# define STRING 81
# define ICON 82
# define FCON 83
# define CCON 84
# define NAME 85
# define ZERO 86
# define ASOP 90
# define RELOP 91
# define EQUOP 92
# define DIVOP 93
# define SHIFTOP 94
# define ICOP 95
# define TYPE 97
# define CATCH 98
# define THROW 99
# define TRY 100
# define TNAME 123
# define EMPTY 124
# define NO_ID 125
# define NO_EXPR 126
# define FDEF 127
# define ELLIPSIS 155
# define AGGR 156
# define MEM 160
# define MEMPTR 173
# define PR 175
# define MEMQ 176
# define TSCOPE 178
# define DECL_MARKER 179
# define REFMUL 180
# define LDOUBLE 181
# define LINKAGE 182
# define TEMPLATE 185
# define XVIRT 200
# define XNLIST 201
# define XILINE 202
# define XIA 203
# define SM_PARAM 207
# define PTNAME 209
# define NEW_INIT_KLUDGE 210
# define XDELETED_NODE 211
# define DUMMY_LAST_NODE 212
#define yyclearin yychar = -1
#define yyerrok yyerrflag = 0
extern int yychar;
extern short yyerrflag;
#ifndef YYMAXDEPTH
#define YYMAXDEPTH 150
#endif
YYSTYPE yylval, yyval;
# define YYERRCODE 256

# line 3021 "gram.y"


static Pname
enumcheck( Pname n )
{
	Ptype tx = n->tp;
	if ( tx->base == TYPE ) {
		Pname bn = Pbase(tx)->b_name;
		tx = bn->tp;
		if ( tx->base != EOBJ
		||   strcmp(bn->string,n->string)
		)
			error("%n ofT%t redeclared as enum.",n,tx);
		n = bn;
	} else if ( tx->base != EOBJ )
		error("%n ofT%t redeclared as enum",n,tx);

// error('d',"enumtag: ccl %t tag: %n", ccl, n);
	return n;
}

static void
check_tag()
/*
        Allow the case of inline/virtual/overload as 
        modifiers of return type of form struct/class/union x foo() 
        SM, COLON, LC ==> real class declaration, not return type
*/
{
	switch ( NEXTTOK() ) {
	case SM: case COLON: case LC:
    		declTag = 1;
    		break;
	default:
    		declTag = 0;
    		break;
        }
}

static void
hoist_al()
/*SYM hoist names in arg table to next outer scope and pop scope
 * called upon discovering that an arg list isn't really being parsed
 *    -- i.e., 'arg_lp decl RP ...' -- arg_lp pushed an arg table
 */
{
	if ( Ctbl->k_id != ARG ) {
		// saw something like '( X::y )' while probably reduced
		//    as 'arg_lp decl RP' and pushed scope of X
		// no names should have been entered; discard table
		Pktab otbl = Ctbl;
		Ctbl = GET_XSCOPE();
		if ( Ctbl->k_id != ARG ) error('i',"hoist_al: noA table");
		POP_SCOPE();
		SET_XSCOPE(Ctbl);
		Ctbl = otbl;
		return;
	}
	if ( !in_typedef && !in_friend ) Ctbl->hoist();
	POP_SCOPE();
}
static void
arg_redec( Pname fn )
/* parsing restored member inline at end of class
 * redeclare args before entering function
 */
{
	if ( fn==0 || fn->tp->base != FCT )
		error('i',"bad inline rewrite! --%n %t",fn,fn?fn->tp:0);
	if ( Ctbl->k_id != ARG )
		error('i',"arg_redec(%n ) -- noA table",fn);
	//SYM -- reenter in arg table
	//SYM -- probably more efficient to keep arg table around...
	Pname al = Pfct(fn->tp)->argtype;
	Pname n = 0;
	for ( ;  al;  al = al->n_list ) {
		DB( if(Ydebug>=1)error('d',"arg_redec:  %n  %d",al,al->lex_level); );
		n = new name(al->string);
		insert_name(n,Ctbl);
		DB( if(Ydebug>=1)error('d',"   %n",n); );
	}
}

static Pname
dummy_dtor( TOK q, TOK d )
{
	if ( q != d ) {
		error("syntax error: inconsistent destructor notation");
		q = d;
	}
	Pname dt = new name("type destructor");
	dt->base = DTOR;
	dt->tp = new fct(void_type,0,1);
	dt->n_dcl_printed = 1; // suppress any code generation
	switch ( d ) {
	default:
		error("syntax error: illegal destructor notation");
		dt->tp2 = any_type;
		break;
	case CHAR:
		dt->tp2 = dt->tpdef = char_type;
		break;
	case SHORT:
		dt->tp2 = dt->tpdef = short_type;
		break;
	case SIGNED:
	case INT:
		dt->tp2 = dt->tpdef = int_type;
		break;
	case UNSIGNED:
		dt->tp2 = dt->tpdef = uint_type;
		break;
	case LONG:
		dt->tp2 = dt->tpdef = long_type;
		break;
	case VLONG:
		dt->tp2 = dt->tpdef = vlong_type;
		break;
	case FLOAT:
		dt->tp2 = dt->tpdef = float_type;
		break;
	case DOUBLE:
		dt->tp2 = dt->tpdef = double_type;
		break;
	case VOID:
		dt->tp2 = dt->tpdef = void_type;
		break;
	}
	return dt;
}
static Pname
dummy_dtor()
{
	Pname dt = new name("type destructor");
	dt->base = DTOR;
	dt->tp = new fct(void_type,0,1);
	dt->n_dcl_printed = 1; // suppress any code generation
	dt->tp2 = 0;
	dt->tpdef = 0;
	return dt;
}

static bit
check_if_base( Pclass c1, Pclass c2 )
{
	if ( same_class(c1,c2) ) return 1;
	for (Pbcl b = c1->baselist; b; b=b->next) {
		if ( same_class(b->bclass,c2) ) return 1;
		if (check_if_base(b->bclass,c2)) return 1;
	}
	return 0;
}
short yyexca[] ={
-1, 1,
	0, -1,
	-2, 0,
-1, 48,
	71, 45,
	72, 45,
	-2, 44,
-1, 65,
	155, 398,
	-2, 319,
-1, 70,
	13, 393,
	97, 393,
	123, 393,
	155, 393,
	156, 393,
	160, 393,
	178, 393,
	179, 393,
	182, 393,
	-2, 319,
-1, 127,
	73, 116,
	-2, 110,
-1, 344,
	70, 105,
	-2, 104,
-1, 436,
	73, 116,
	-2, 111,
-1, 444,
	60, 17,
	71, 17,
	-2, 128,
-1, 445,
	60, 16,
	71, 16,
	-2, 127,
-1, 480,
	1, 223,
	3, 223,
	4, 223,
	7, 223,
	8, 223,
	9, 223,
	10, 223,
	13, 223,
	16, 223,
	19, 223,
	20, 223,
	23, 223,
	24, 223,
	28, 223,
	30, 223,
	33, 223,
	34, 223,
	39, 223,
	40, 223,
	46, 223,
	47, 223,
	50, 223,
	52, 223,
	54, 223,
	55, 223,
	72, 223,
	73, 223,
	80, 223,
	81, 223,
	82, 223,
	83, 223,
	84, 223,
	85, 223,
	86, 223,
	95, 223,
	97, 223,
	99, 223,
	100, 223,
	123, 223,
	156, 223,
	160, 223,
	178, 223,
	179, 223,
	182, 223,
	185, 223,
	209, 223,
	-2, 0,
	};
# define YYNPROD 413
# define YYLAST 3598
short yyact[]={

 163,  24, 596, 407, 479, 523, 343, 152,  10,  11,
 335, 181,   8, 229, 446,  58, 300, 165, 401,   9,
 396, 187,  58,  58, 307, 161, 349, 342, 208, 385,
 318, 520, 120, 322, 609, 217, 557, 207, 190,  18,
 120, 136, 624, 261,  40, 123, 124, 191,  89, 124,
 274, 123,  66, 463,  90,  31, 336, 697, 491, 303,
  74,  88,  83, 185,  57, 180, 194,  83, 464, 678,
  71,  36,  36, 185, 219, 162,  20, 615,  30,   7,
 288,  32,  32,  33,  33, 293, 194, 665, 194, 125,
  20, 609, 200, 122, 246, 607, 608,  20,  20,  44,
  59, 121, 288,  50,  44,  71, 353, 354, 177, 175,
  17,  56, 447, 203, 298, 299,  29,  43, 120, 409,
 139, 410,  43,  81,  52, 212, 595,  24,  51, 556,
  71,  77,  80,  71, 615, 225, 226, 252, 223, 194,
 625, 119, 185, 304,  58,  63, 224, 555,  42,  32,
  26,  33, 185,  42,  41, 344,  83, 438, 173, 273,
 498, 173, 547,  69, 624,  54, 194, 438, 286, 275,
 437, 149, 184, 480, 120, 196, 235, 406,  83, 530,
  36,  44, 184,  58, 458,  25, 333,  39, 287, 233,
  32,  44,  33,  44, 120, 196,  78, 196,  69,  43,
  53, 296, 228,  58,  35,  35, 222, 238, 240,  43,
  55,  43, 120, 521, 172,  44,  45, 172, 315,  20,
 447, 624, 291,  69, 261, 632,  69, 216, 292, 173,
  42, 120, 194,  43,  81, 554,  17,  78, 185, 430,
  42,  42,  42, 325, 347, 317, 330, 403, 196, 551,
  31, 184, 387,  80, 326, 143, 144,  32,  20,  33,
 466, 184, 173, 329,  42, 295, 346, 185, 332, 341,
 389, 389,  35,  30, 379, 196, 194, 120,  20, 552,
 548, 431, 305, 119, 381, 172, 497, 355, 604, 120,
 441, 120,  52, 394, 339, 383, 390, 395, 602,  29,
 392, 442, 388, 306, 185, 601,  75,  86,  42, 408,
 120, 338,  80,  35, 230, 404, 405, 380, 172, 262,
 194, 306, 272, 331, 277, 278, 279, 280, 281, 282,
 283, 284, 285,  54, 419, 420, 140,  41, 120, 120,
 340, 196, 412,  31,  54, 386, 393, 184, 424,  42,
  67, 120, 120, 414,  68, 205, 450, 427, 428,  62,
 415, 468,  54,  73, 214,  44,  30, 320,  53, 512,
 278, 279, 436, 440,  44, 426, 184, 131, 321,  53,
  35, 391, 194,  43,  73, 196, 306, 145, 120, 337,
 701, 681,  43, 591, 432, 434,  36,  53,  67, 204,
 306, 246,  68, 454, 173, 244, 245, 560, 141,  64,
 456,  67, 459, 184,  42,  68,  42, 465, 472, 467,
  41, 475, 476,  42, 509, 478, 417,  54, 483, 196,
 518,  67, 120, 477, 120,  68, 120, 377, 470, 142,
  83,  54, 492, 185, 252, 496, 127, 340, 340, 471,
 495, 173, 469, 416, 473, 505, 178,  44, 277, 120,
 172, 306,  53, 503, 504, 120, 173, 422, 425, 500,
 421, 185, 415, 415, 458,  43,  53,  44, 515, 411,
 426, 426, 120, 120, 581, 314, 301, 134, 517, 387,
 493, 196, 494, 474,  67,  43, 234, 236,  68, 501,
  24, 213,  54, 460, 186, 597,  42, 172, 535, 536,
 185, 533, 689, 120, 627, 599, 146, 540, 185, 534,
 550, 516, 172,  36, 197, 471,  42, 517, 473, 473,
 482, 261, 528, 553,  36, 703,  67,  53, 525, 388,
  68, 340, 210, 340, 210, 340, 549, 294,  21, 120,
 457, 293, 184, 120, 559,  46, 501, 501, 563, 194,
 541, 680, 266, 571, 131, 416, 416, 486, 487, 488,
 569, 545, 561, 425, 425,  20, 598, 669, 570, 484,
 184, 542,  36, 538,  67, 605, 403,  36,  68,  67,
 643, 340, 502,  68, 630, 210,  32, 603,  33, 641,
 634, 640,  44, 639, 600, 525,  28,  41, 266,  17,
  64,  70,  67,  67,  72,  22,  68,  68, 384, 184,
  43, 271, 289, 268, 507, 269, 270, 184, 638,  22,
  65, 593,  36, 489,  67, 592,  22,  22,  68,  64,
  60,  67,  61,  78,  44,  68, 128, 137, 626, 502,
 502,  42, 519, 265,  36, 485,  67, 429, 340,  15,
  68, 328,  43,  65, 544, 439, 218, 266, 196,  64,
 423,  67, 345, 232,  48,  68, 267, 211,  14, 239,
 539,  76,  79, 691, 242, 537, 481, 529, 210, 185,
 297,  65, 695,  42,  65, 352, 499, 120, 348, 356,
 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
 367, 368, 369, 370, 371, 372, 373, 374, 375,  35,
 376, 700, 237,  84,  34, 382, 635,  36, 637,  47,
 589, 526, 334, 687, 443, 398, 490,  32,  34,  33,
 182,  22, 309, 193, 302,  34,  34, 677, 644, 532,
 193, 319, 209, 415,  36,  42, 664, 131,  22, 628,
 324, 188, 631, 192,  32, 130,  33, 218, 671, 672,
 673, 674, 445, 676, 514,  32, 210,  33, 589, 589,
 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
 589, 589, 589, 589, 589, 589, 589,  22, 184, 684,
  41, 117, 667, 241,  14, 686, 306, 132, 310, 164,
  29,  78, 189, 565, 131,  41, 564,  22, 558, 182,
 546,  49, 215, 221,  37, 397, 323, 126,  38, 276,
 133,  16, 704,   1, 461, 453, 522,  44,   2, 402,
   0,  34, 241, 290, 524,   0, 416,  54,  41,  82,
  34, 589,  44,   0, 692,  43,  65,  41, 309, 309,
  35,   0, 316,   0,   0, 698,   0,  34,   0,   0,
  43, 129, 324, 324,   0, 339,  31,   0,   0,   0,
  29,   0,  53,  82, 339,  44,  42,  35,   0,  29,
 231,   0,  36,   0,  44, 137,  42, 131,  35,  30,
 448,  42,  32,  43,  33, 510,  34,   0, 506,   0,
   0, 513,  43, 135, 511, 351, 418,  34,  41,  85,
  87,  59,   0,  42, 310, 310,  34,  41,   0, 527,
   0,  65,  56, 138,  42,  34,   0,  29, 323, 323,
  41,   0, 327,  42, 276,  82, 397,   0, 131,   0,
   0, 402, 402, 290, 531,  44,   0, 444,   0, 543,
   0,  82,   0,   0,  44, 462, 449,   0,   0,   0,
 435,   0,   0,  43,   0,  41,   0,  44,   0, 151,
 173, 193,  43,   0,   0,   0, 160,   0,  82, 131,
 171,  41,   0,   0, 137,  43, 176, 448, 448, 562,
  34,   0, 157, 158,  42,  36, 399,   0,   0,   0,
  82,   0,  44,  42,  34,  32,   0,  33,   0,  82,
   0,  64, 206,  67, 594,  35,  42,  68,  44,   0,
  43,   0,  41,  34, 327,   0, 172, 169, 167, 168,
 170,  29, 166,   0,   0, 308,  43, 327, 327,   0,
   0, 159,   0, 174, 636,   0,   0,   0,   0, 290,
 642,  42,   0, 449, 449, 137,   0,   0,   0,  44,
   0, 137,   0, 130,   0,  34,   0,  42,   0,  41,
 131,   0,   0,   0,   0,   0, 666,  43,   0, 137,
   0, 645, 646, 647, 648, 649, 650, 651, 652, 653,
 654, 655, 656, 657, 658, 659, 660, 661, 662, 663,
   0,   0,   0,   0,  22,   0, 264,   0,  42, 137,
 351, 327,   0,  41,   0, 683, 327, 327, 685,   0,
   0,   0, 339,   0,  43,   0,   0,  29,  35, 151,
 173,   0,   0,   0,   0,   0, 160,   0, 276, 433,
 171, 699,   0,   0,   0,   0, 176,   0, 668, 137,
  44,   0, 157, 158, 690,  42, 153,   0, 154,   0,
 156, 155, 327, 327,  42,  41,   0,  14,  43, 129,
   0,   0,   0,   0,   0,   0,   0, 276,   0, 609,
   0,   0,   0, 607, 608, 290, 172, 169, 167, 168,
 170,  29, 166,   0,   0,   0,   0,   0,   0,  42,
   0, 159,  44, 174,  82,   0,   0,   0,   0, 586,
   0, 582, 578,  34,   0, 583, 579, 587, 585,   0,
  43,  40, 615, 613, 574,   0,  14, 584, 572,  41,
   0, 151, 173,   0,   0, 309, 567,   0, 160,   0,
   0, 575, 171,   0,   0,   0,   0, 573, 176,   0,
   0,  42,   0,   0, 157, 158,   0,   0, 153,   0,
 154,   0, 156, 155,   0,   0, 264,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 566, 480, 246, 688,  43,  40, 244, 245, 576, 169,
 167, 168, 170,  29, 166,   0,   0, 113,   0,   0,
   0, 310,   0, 159,   0, 568,   0, 590, 580, 624,
   0, 112, 403,   0,   0,  42,   0,   0, 339,   0,
   0,   0,  32,  29,  33, 252, 250,   0, 105,   0,
 106, 577, 114,   0, 107, 108,   0,  36,  93,   0,
  94,   0,  91,  92,   0,   0, 101,  32, 102,  33,
   0,   0,  96,  95, 103, 104, 696,  29, 111, 115,
   0,  41,   0,   0,  39,   0,   0,   0, 588,  51,
   0,   0,   0,  29,   0,   0,   0, 308, 110, 100,
  98,  99,  97, 109,   0, 118,  43,  27, 147,   0,
 183,   0,  40,   0,  78,  41, 609,   0,  44,   0,
 607, 608, 151, 173, 618,   0, 617,   0,   0, 160,
  34,  41, 261, 171,   0,   0,  43,  42,   0, 176,
  41,   0,   0,   0,   0, 157, 158,   0,  39, 153,
   0, 154,  44, 156, 155,   0,   0, 616, 614, 615,
 613,   0,   0,   0,   0,  35,   0,  42,  44,   0,
  43,  55, 179,   0,   0,   0,   0,  44,   0, 172,
 169, 167, 168, 170,  29, 166,  43,   0, 116,   0,
  35,   0,   0,   0, 159,  43, 195,   0, 150, 147,
   0,  42,   0,  40,   0,   0,   0,   0,   0,   0,
   0,   0,   0, 151, 173,   0,   0,  42,   0,   0,
 160,   0,  41,   0, 171,   0,  42,   0,   0,   0,
 176,   0,   0,   0,   0,  31, 157, 158,   0,   0,
 153,  31, 154,   0, 156, 155, 624,   0,   0,   0,
   0,  36,   0,   0,   0,  39,   0,  36,  30, 148,
   0,  32,   0,  33,  30,   0,   0,  32,   0,  33,
 172, 169, 167, 168, 170,  29, 166,  43,  27,   0,
   0, 183,   0,   0,   0, 159,   0, 195,   0, 150,
 147,  19,   0,   0,   0,   0,  29,  19,   0,   0,
   0,   0,  29,   0, 151, 173,   0,   0,  42,   0,
   0, 160, 609,  41,  78, 171, 607, 608,   0,   0,
 618, 176, 617,   0,   0,   0,   0, 157, 158,   0,
   0, 153,   0, 154,  41, 156, 155,  40,   0,   0,
  41,   0,   0,   0,   0,   0,  39,   0,   0,   0,
 148,   0,   0, 616, 179, 615, 613,   0,   0,   0,
 147, 172, 169, 167, 168, 170,  29, 166,  43,  27,
   0,  44, 183,   0, 151, 173, 159,  44, 174,   0,
 150, 160,   0,   0,  35, 171,   0,   0,   0,  43,
  35, 176,   0,   0,   0,  43,   0, 157, 158,  42,
   0, 153,   0, 154,  41, 156, 155,   0,   0,  29,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  42,  23,   0,   0, 587,   0,  42,   0,   0,   0,
   0, 172, 169, 167, 168, 170,  29, 166, 151, 173,
   0, 148, 624,   0,   0, 160, 159,  41, 174, 171,
 150,   0,   0,   0,   0, 176,   0,   0,   0,  43,
   0, 157, 158,   0,   0, 153,   0, 154,   0, 156,
 155,  40,   0,   0,  41,   0,   0, 246,   0, 413,
  39, 244, 245,   0,  44, 254,   0, 255,   0,   0,
  42,   0,   0,   0,   0, 172, 169, 167, 168, 170,
  29, 166,  43,  27,   0,   0, 183,   0, 151, 173,
 159, 148, 174,   0, 590, 160,   0,   0, 253, 171,
 252, 250,   0,   0,   0, 176,   0, 629,   0,  43,
   0, 157, 158,  42,   0, 153,   0, 154,  41, 156,
 155,   0,   0,  29,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,  23,   0,   0,   0,   0,
  42,   0,   0,   0,   0, 172, 169, 167, 168, 170,
  29, 166, 151, 173,   0, 588,   0,   0,  40, 160,
 159,  41, 174, 171,   0,   0,   0,   0,   0, 176,
   0, 378,   0,  43,   0, 157, 158,   0,   0, 153,
   0, 154,   0, 156, 155, 176,   0, 261,  41,   0,
   0,   0,   0,   0,  39,   0,   0,   0,  44,   0,
   0,   0,   0,   0,  42,   0,   0,   0,   0, 172,
 169, 167, 168, 170,  29, 166,  43,  27,   0,   0,
 183,   0, 151, 173, 159, 264, 174,  40,   0, 160,
  29,   0,   0, 171,   0,   0,   0,   0,   0, 176,
   0, 263,  23,  43,   0, 157, 158,  42,   0, 153,
   0, 154,  41, 156, 155,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,  41,   0,
   0,   0, 147,   0,  42,   0,   0,   0,   0, 172,
 169, 167, 168, 170,  29, 166, 151, 173,   0, 264,
   0,   0,   0, 160, 159,   0, 174, 171,   0,  29,
   0,  39,   0, 176, 201,  44,   0,  43,   0, 157,
 158,  23,   0, 198,   0, 199,   0, 156, 155,   0,
   0,   0,  41,  43,  27,   0,   0, 183,   0,   0,
   0,   0,   0,   0,   0,   0, 179,  41,  42,   0,
   0,   0,   0, 172, 169, 167, 168, 170,  29, 166,
   0,   0,   0,   0,  42,   0, 151, 173, 159, 264,
   0,   0, 150, 160,   0,   0,   0, 171,   0,   0,
 350,   0,   0, 176,  44,   0,   0,  43,   0, 157,
 158,   0,   0, 153,   0, 154,   0, 156, 155,   0,
   0,   0,  43,  27,   0,   0, 183, 609,   0, 610,
   0, 607, 608,   0,   0, 618,   0, 617,  42,   0,
   0, 612, 611, 172, 169, 167, 168, 170,  29, 166,
 151, 173,   0,  42,   0,   0,   0, 160, 159,   0,
 174, 171,   0,   0,   0,   0, 202, 176, 616, 614,
 615, 613,   0, 157, 158,   0,   0, 153,   0, 154,
   0, 156, 155,   0,   0,   0,  41,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,  42,   0,   0,   0,   0, 313, 169, 167,
 168, 170,  29, 166,   0,   0,   4,  12,   0,   0,
 151, 173, 159, 264, 174,   0,   0, 160,   0,  40,
   0, 171,   0,   0,   0,   0,   0, 176,   0,   0,
  31,  43,   0, 157, 158,   0,   0, 153,   0, 154,
  41, 156, 155,   0,   0,   0,  36, 624,   0,   0,
   0,   0,   0,  30,   0,   0,  32,   0,  33,   0,
   0,   0,  42,   0,   0,  40,   0, 312, 169, 167,
 168, 170,  29, 166,   0,   0,  31, 264,   3,  40,
   6,   0, 159,   0, 174,   0,  19,   0,   0,   0,
  31,  29,  36,   0,   0,  43,   0,   0,   0,  30,
   0,   0,  32,  23,  33,   0,  36,   0,   0,   0,
  41,  40,   0,  30,   0,   0,  32,   0,  33,   0,
   0,   0,  40,   0,   0,   0,  42,   0,   0,  41,
   0,   0,  19,   0,   0,   0,   0,  29,  36,   0,
 220,   0,   0,   0,   0,   0,  19, 264,  32,  23,
  33,  29,   0,   0,   0,   0,   0,   0,   0,  32,
   0,  33,  39,  23,   0,  43,  44,   0,   0,   0,
   0,   0,   0,   0,   0,  41,   0,   0, 308,  35,
  40,   0,   0,  29,  43,  27,   0,   0,   5,  41,
   0,  13,   0,   0,  29,  51,  42,   0,   0,   0,
   0,  40,   0,   0,   0,   0,  51,  36,  39,   0,
   0,   0,  44,   0,   0,  42,   0,  32,   0,  33,
   0,  41,  39,   0,   0,  35,  44,   0,  36,   0,
  43,  27,  41,   0, 183,   0,   0,   0,  32,  35,
  33, 227,   0,   0,  43,  27,   0, 447, 183,   0,
   0,  13,  29,   0,  39,   0,   0,   0,  44,   0,
   0,  42,   0,   0,  51,  39,   0,   0,   0,  44,
   0,  35,   0,  29,   0,  42,  43,  55,   0,   0,
   0,   0,  35,   0,   0,  51,   0,  43,  55,   0,
  41, 246,   0, 247,   0, 244, 245,   0,   0, 254,
   0, 255,   0,   0,   0, 249, 248,  42,   0,   0,
   0,  41, 609,   0, 610,   0, 607, 608,  42,   0,
 618,   0, 617,  39,   0,   0, 612,  44,   0,   0,
   0,   0, 253, 251, 252, 250,   0,   0,   0,   0,
  35,   0,   0,   0,  39,  43,  55,   0,  44,   0,
   0,   0,   0, 616, 614, 615, 613,   0,   0,   0,
 702,  35,   0,   0,   0,   0,  43,  55,   0, 246,
   0, 247,   0, 244, 245,   0,  42, 254,   0, 255,
   0,   0,   0, 249, 248, 256, 257, 260,   0, 243,
 259,   0,   0,   0,   0,   0,   0,  42,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 258,
 253, 251, 252, 250, 246,   0, 247,   0, 244, 245,
   0, 261, 254,   0, 255,   0,   0,   0, 249, 248,
 256, 257, 260,   0, 243, 259, 694,   0,   0,   0,
   0,   0, 624,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0, 693, 258, 253, 251, 252, 250,   0,
 246,   0, 247,   0, 244, 245,   0,   0, 254,   0,
 255,   0,   0,   0, 249, 248, 256, 257, 260,   0,
 243, 259,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0, 682, 261,
 258, 253, 251, 252, 250, 246,   0, 247,   0, 244,
 245,   0,   0, 254,   0, 255,   0,   0,   0, 249,
 248, 256, 257, 260,   0, 243, 259,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 261, 258, 253, 251, 252, 250,
   0, 609,   0, 610,   0, 607, 608,   0,   0, 618,
   0, 617,   0,   0,   0, 612, 611, 619, 620, 623,
 679, 606, 622,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
 261, 621, 616, 614, 615, 613, 246,   0, 247,   0,
 244, 245,   0,   0, 254,   0, 255,   0,   0,   0,
 249, 248, 256, 257, 260, 675, 243, 259,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0, 670,   0, 261, 258, 253, 251, 252,
 250,   0, 246,   0, 247,   0, 244, 245,   0,   0,
 254,   0, 255,   0,   0,   0, 249, 248, 256, 257,
 260,   0, 243, 259,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0, 624, 258, 253, 251, 252, 250, 246,   0, 247,
   0, 244, 245,   0,   0, 254,   0, 255,   0,   0,
   0, 249, 248, 256, 257, 260,   0, 243, 259, 633,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0, 261, 258, 253, 251,
 252, 250, 508,   0,   0,   0,   0,   0,   0, 246,
   0, 247,   0, 244, 245,   0,   0, 254,   0, 255,
   0,   0,   0, 249, 248, 256, 257, 260,   0, 243,
 259,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 261,   0,   0,   0,   0, 455,   0, 258,
 253, 251, 252, 250, 246,   0, 247,   0, 244, 245,
   0,   0, 254,   0, 255,   0,   0,   0, 249, 248,
 256, 257, 260,   0, 243, 259,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0, 261,   0,   0,
   0,   0,   0, 452, 258, 253, 251, 252, 250,   0,
 246,   0, 247,   0, 244, 245,   0,   0, 254,   0,
 255,   0,   0,   0, 249, 248, 256, 257, 260,   0,
 243, 259,   0,   0,   0,   0,   0,   0, 609,   0,
 610,   0, 607, 608,   0,   0, 618,   0, 617, 261,
 258, 253, 251, 252, 250, 246,   0, 247,   0, 244,
 245,   0,   0, 254,   0, 255,   0,   0,   0, 249,
 248, 256, 257, 260, 451, 243, 259,   0,   0, 616,
 614, 615, 613,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 400,   0, 261, 258, 253, 251, 252, 250,
   0, 246,   0, 247,   0, 244, 245,   0,   0, 254,
   0, 255,   0,   0,   0, 249, 248, 256, 257, 260,
   0, 243, 259,   0,   0,   0,   0,   0, 246,   0,
 247,   0, 244, 245,   0,   0, 254,   0, 255, 311,
 261, 258, 253, 251, 252, 250, 246,   0, 247,   0,
 244, 245,   0,   0, 254,   0, 255,   0,   0,   0,
 249, 248, 256, 257, 260,   0, 243, 259, 624, 253,
 251, 252, 250,   0, 246,   0,   0,   0, 244, 245,
   0,   0, 254,   0, 255, 261, 258, 253, 251, 252,
 250,   0, 609,   0, 610,   0, 607, 608,   0,   0,
 618,   0, 617,   0,   0,   0, 612, 611, 619, 620,
 623,   0, 606, 622,   0, 253, 251, 252, 250,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0, 261, 621, 616, 614, 615, 613, 609,   0, 610,
   0, 607, 608,   0,   0, 618,   0, 617,   0,   0,
   0, 612, 611, 619, 620, 623,   0, 606, 261,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0, 261, 621, 616, 614,
 615, 613,   0, 246,   0, 247,   0, 244, 245,   0,
   0, 254,   0, 255,   0,   0,   0, 249, 248, 256,
 257, 260,   0, 243, 261,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 624, 258, 253, 251, 252, 250, 246,   0,
 247,   0, 244, 245,   0,   0, 254,   0,   0,   0,
   0,   0, 249, 248, 256, 257, 260, 609, 243, 610,
   0, 607, 608,   0,   0, 618,   0, 617,   0,   0,
   0, 612, 611, 619, 620, 623,   0, 624, 258, 253,
 251, 252, 250,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0, 616, 614,
 615, 613, 246,   0, 247,   0, 244, 245,   0,   0,
 254,   0, 255,   0,   0,   0, 249, 248, 256, 257,
 260,   0, 609, 261, 610,   0, 607, 608,   0,   0,
 618,   0, 617,   0,   0,   0, 612, 611, 619,   0,
   0,   0,   0, 253, 251, 252, 250, 246,   0, 247,
   0, 244, 245,   0,   0, 254,   0, 255,   0,   0,
   0, 249,   0, 616, 614, 615, 613, 246, 261, 247,
   0, 244, 245,   0,   0, 254,   0, 255,   0,   0,
   0, 249, 248, 256,   0,   0,   0, 624, 253, 251,
 252, 250,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0, 253, 251,
 252, 250,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 261,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 624,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0, 261,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0, 261 };
short yypact[]={

2196,-1000,-1000,-1000,-1000, 143,-1000,-1000,-1000,-1000,
-1000,-1000, 515,-1000,  31, 570,-1000, 571,-1000, 339,
 226,1507,1501,-1000, -56,-1000,-1000,-1000, 249, 249,
 -62,1298,   4,  -4,-127,  -8,-1000,-1000,-1000,1000,
 734,-1000, 249,-1000,-1000,-1000,  39, 278, 369, 184,
-1000,-1000, 571,-1000,-1000,-1000, 318,-1000, -61,1641,
1571,-1000,1748,-1000, 463,1389,-1000,1641,-1000,-1000,
1973,-1000,1748, 319,-1000, 310, 599, 571,-1000, 981,
 571,-1000,-1000,-1000,-133,1480,-1000,1480,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000, 460, 321,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000, 725,-1000,-1000,
 -61,-1000,-1000,-1000, -23,-1000,2256, 245, 249,-1000,
-1000,-1000,-1000, 116,-1000,-1000, 317,-1000,1480, 456,
-1000,1748,-1000, 852,-1000,-1000,3243,1909, 644, 581,
2043,1855,2043,2043,2043,2043,2043,2043,2043,2043,
2043,-1000, 134,  33,-1000,1480,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,1298, 511, 507,-1000, 193,3243,1571,
 -10,-1000,  31,-1000,-1000, -56,-1000, 445, -12, 211,
-1000,-1000,-1000,2288,  55, 511, 507,3106,2177,2107,
 444,-1000,1501,-1000,-1000, 319,-1000, 307,-1000,-1000,
3288,2378, 307,-1000,-1000,-1000,-1000,-1000,  99,-1000,
-1000,-1000,-1000,-1000, 191, 174,-1000, 254, 226, 113,
 214,1480,  75,-1000,-1000, 307, 172,1924, -18,1571,
-1000, 369,1641,1641,1641,1641,1641,1641,1641,1641,
1641,1641,1641,1641,1641,1641,1641,1641,1641,1641,
1641,1641, 581,1641, 539,1839,1855,-1000,1641, 442,
 205,1571, 581,-1000,-1000,1389,2299, 581, 581, 581,
 581, 581, 581, 581, 581, 581, 956,-1000, 909,3061,
1282,-1000,-1000,1571,1571,-1000, 103, 240,-1000,-1000,
  22,-1000, 438,1614,-1000,1571,-1000, 356,-1000,1307,
 965,-1000, 429, 426,-1000,  22, 629,-1000,-1000,1480,
-1000,-1000, 547, 687, 714,-1000,-1000,-124,-1000,-1000,
-1000,-1000, 167,-1000, 210,-1000,-1000,1052, 795,-1000,
-1000, 307,  96,-1000,-1000,  75,-1000,-1000, 230,-1000,
 692,2357, 240,-1000,-1000,-1000,3243,3243,  44,  44,
-137,3134,3397,3088, 351,1717,-137,1242,1242,1242,
2431,3417,3243,3243,3015,-1000,2970, 581,1641,-1000,
-1000,1389,2924,-1000, 427,-1000, 380, 868,-107,  21,
-1000, 137,-1000, 238, 411, 397, 308,  99,-1000,-1000,
-1000, 452, 546, 207, 392, 384,-1000, 100,-1000,-1000,
 490,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 547,
 614, 483, 483, 483,-1000,-1000,-1000, 592, 547, -69,
-1000, 214,-1000,1248,-1000,1248, 245,-1000,  75, 216,
  86,-1000,1924,-1000, 249,-1000, 547,-1000, 140,  32,
 100,1641,2043,2879, 383,-1000,-1000,-1000, 817,-1000,
-1000,-1000,-1000, 322, 677,-1000,-1000,-1000,-1000,-1000,
1855,-1000, 308,-1000,-1000, 308, 389,-1000,-1000,-1000,
 -43, 804, 297,  22,1571,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000, 106,-1000,1641,-1000,2242,
-1000,-1000,-1000, 547, 542,-1000,3352, 581,2043,1855,
-1000,-1000, 484,-1000,-1000,-1000,-1000,1748, 547,-1000,
-1000,  88, 209,-1000,1571, 480, 208,-1000,-1000, 240,
-1000,3243,-1000,-1000,-1000,-1000,-1000, 163,-1000, 581,
-1000,-1000,-1000,-1000,-1000,-1000, -38,-1000, 804, 366,
1571,-1000, 297, 100,-1000,-1000,-1000,-1000,1218,-1000,
-1000, 352,-1000,-1000,-1000,-1000,-1000,1641,  45,-1000,
-1000,-1000, 465, 465, 475,-1000, 236, 229,-1000, 219,
 100,3152,-1000,-1000,  60,-1000, 474,1775, 585, 581,
2043,-1000,-1000, 153,2827, 100,-1000,1641,-1000,-1000,
 465,-1000,-1000,1641,-1000,-1000,1705,1705,1705,1705,
1705,1705,1705,1705,1705,1705,1705,1705,1705,1705,
1705,1705,1705,1705,1705,-1000,-1000,   6, 581,1641,
1116, 581,-1000,-1000,-1000, 565,2782,-1000,-1000,-1000,
-1000,-1000,2736,-1000, -29,3197, -16, -16,-138,1356,
2452,2998,  41,1552,-138,1139,1139,1139,2057,3372,
3197,3197,2691,-1000, 522, 350,2645, 581,1641,-1000,
-1000,1641,-1000,-1000,-1000,-1000,-1000,-1000, 472,1705,
 465,-1000,2043,2600,-1000,2554,-1000, 100,1748, -98,
3307,-1000, 581,2043,1641,-1000,2288, 349, 581,2509,
 494,-1000,-1000,-1000,-1000 };
short yypgo[]={

   0, 838,   9,   8,  19, 359,   3, 836,   5,  11,
 833,  52, 548, 677, 831, 150,  27,   6, 446,  56,
 830, 828, 185, 827, 823,  64, 821,  39, 659,  47,
 820, 129, 818,   4, 816, 813, 812,  21, 456, 484,
 171,  25, 809,  18,   7,  35,  54, 801,  24,  14,
  38, 763, 145, 761,  20,  50, 752,  33, 751,   2,
 824,   0,  29,  75, 606, 109, 723, 749, 748, 747,
  48, 744, 736, 734, 733,  13, 732,  10,  16, 614,
 731,  28,  37,  79, 729, 722, 698, 696,  65, 695,
 690, 687, 686, 684, 679, 890,  30, 673, 672,  26,
 665, 661, 657, 652, 648, 635, 631, 628, 604, 601,
 599, 597, 590,  17, 579 };
short yyr1[]={

   0,  10,  10,  10,  10,  10,  10,  84,  85,  87,
  83,  67,  67,  67,  67,  67,  73,  73,   1,   1,
   1,   1,   1,   2,   2,  89,   4,   4,   4,  90,
   3,   3,   3,  91,  72,  88,  92,   6,   6,   7,
   7,   8,   8,   5,   5,  25,  93,  25,  25,  94,
  25,  26,  26,   9,   9,  95,  96,  65,  65,  65,
  14,  14,  14,  14,  14,  14,  14,  13,  13,  13,
  13,  13,  13,  58,  82,  82,  57,  57,  57,  57,
  57,  56,  81,  81,  20,  20,  20,  97,  15,  98,
  15,  15,  16,  16,  86,  86,  86,  99,  99,  49,
  49,  49,  49,  49,  17, 100,  17,  17, 101,  22,
  22,  22,  22, 102, 102,  75,  75,  76,  76,  77,
  77,  77,  77,  77,  21,  21,  21,  18,  18,  19,
  19,  23,  23,  23,  24,  24,  24,  24,  24,  24,
  24,  24,  27,  27,  27,  27,  70,  70,  70,  70,
  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
  70,  70,  70,  70,  70,  70,  70,  70,  70,  70,
  70,  70,  63,  61,  61,  64,  64,  78,  78,  78,
  80,  80,  28,  28,  28,  28,  28,  28,  28,  28,
  28,  28,  28,  28,  28,  28,  28,  28,  28,  28,
  48,  48,  48,  48,  48,  48,  48,  54,  54,  54,
  43,  43,  43,  43,  43,  45,  45,  30,  30,  30,
  31,  32,  59, 103,  33,  33,  33,  35,  35,  35,
  35, 104,  35,  35, 106, 105,  34,  34,  34,  34,
  34,  34,  34,  34,  34,  34, 107,  34, 108,  34,
 109,  34, 110,  34, 111,  34, 112,  34,  34,  68,
  68,  69,  74,  74,  37,  36,  36,  29,  29,  39,
  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
  39,  39,  39,  39,  38,  38,  38,  38,  38,  38,
  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
  38,  38,  38,  38,  38,  38,  38,  38,  38,  38,
  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
  40,  40,  40,  40,  40,  40,  40,  40,  40,  40,
  62,  62,  62,  62,  62,  62,  62,  62,  42,  42,
  42,  42,  42,  42,  42,  66,  60,  60,  60,  41,
  41,  41,  44, 113,  47,  47,  47,  47,  46,  55,
  51, 114,  51,  79,  52,  53,  53,  50,  50,  71,
  71,  71,  12,  12,  12,  12,  12,  12,  12,  12,
  12,  11,  11 };
short yyr2[]={

   0,   1,   1,   1,   2,   1,   1,   0,   0,   0,
   8,   1,   1,   1,   1,   2,   1,   1,   1,   1,
   1,   1,   5,   4,   2,   0,   7,   5,   5,   0,
   6,   4,   4,   0,   4,   0,   0,   3,   0,   1,
   3,   3,   4,   2,   0,   1,   0,   4,   2,   0,
   4,   1,   3,   3,   2,   1,   1,   1,   4,   4,
   1,   1,   1,   2,   1,   1,   1,   1,   2,   2,
   2,   2,   2,   1,   3,   1,   0,   3,   2,   2,
   2,   2,   1,   1,   1,   1,   2,   0,   5,   0,
   6,   2,   1,   3,   3,   1,   0,   2,   2,   1,
   2,   2,   2,   3,   1,   0,   4,   0,   0,   5,
   2,   5,   2,   0,   2,   2,   0,   1,   3,   1,
   2,   2,   3,   3,   2,   4,   7,   1,   1,   1,
   1,   2,   0,   2,   1,   2,   2,   1,   1,   1,
   2,   3,   1,   2,   2,   2,   1,   1,   1,   1,
   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   2,   2,   1,   1,   1,   1,   1,   1,   1,   1,
   1,   1,   1,   1,   2,   2,   1,   0,   2,   5,
   1,   3,   2,   4,   2,   4,   6,   6,   4,   4,
   6,   1,   3,   2,   4,   2,   2,   2,   2,   3,
   1,   2,   0,   2,   2,   2,   3,   0,   2,   2,
   0,   2,   2,   4,   4,   0,   2,   0,   2,   2,
   2,   0,   3,   0,   4,   2,   3,   1,   1,   1,
   2,   0,   5,   4,   0,   2,   2,   1,   3,   3,
   1,   1,   1,   3,   5,   3,   0,   9,   0,   4,
   0,   4,   0,   4,   0,   5,   0,   4,   3,   0,
   2,   3,   4,   3,   1,   1,   3,   1,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   5,   3,   2,   5,
   3,   6,   1,   2,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   5,   3,   2,   5,   3,   6,   1,   2,   0,
   2,   2,   3,   3,   2,   2,   2,   2,   2,   2,
   2,   2,   2,   2,   2,   4,   3,   4,   4,   3,
   4,   4,   3,   4,   4,   3,   4,   4,   1,   2,
   3,   3,   1,   3,   1,   1,   1,   1,   1,   1,
   2,   3,   4,   2,   4,   3,   3,   3,   4,   4,
   5,   5,   6,   6,   4,   4,   1,   1,   2,   1,
   2,   2,   4,   1,   1,   1,   2,   2,   2,   2,
   2,   0,   5,   1,   5,   3,   1,   1,   0,   0,
   1,   2,   1,   1,   2,   2,   2,   2,   1,   3,
   2,   3,   1 };
short yychk[]={

-1000, -10,  -1,  72,   0, 182,  74, -83,  -9,  -4,
  -3,  -2,   1, 185, -13, -28, -14, -65, -27,  80,
 -63, -12, -79,  97, -61, -22, -15, 179, -64,  85,
  47,  24,  50,  52, -66, 173,  40, -60, -21, 156,
  13, 123, 209, 178, 160,  73,  40, -84, -28, -26,
  72,  97, -65, -22, -15, 179,  80, -25, -61,  69,
  70,  72,  -5, -52,  40, -79, -11,  42,  46, -52,
  40, -11, -79,  45, -27,  80, -28, -65,  97, -28,
 -65, 179, -60, 123, -66, -95,  58, -95, 123, -70,
 -46,  54,  55,  50,  52,  65,  64,  94,  92,  93,
  91,  58,  60,  66,  67,  40,  42,  46,  47,  95,
  90,  70,  23,   9,  44,  71, 180, -47,  97, -65,
 -61,  97,  97, 178, 173,  97, -23, -18, -64, 179,
  73,  80,  73, -20, -18, 179, -61, -64, -95,  81,
  58,  -5,  70,  71,  72,  69, -38,   9, 160, -40,
  99,  23, -44,  50,  52,  55,  54,  46,  47,  95,
  30, -41, -63, -61, -42,-113,  86,  82,  83,  81,
  84,  34,  80,  24,  97, -65,  40, -29, -38,  73,
 -88,  -9, -13, 182, -65, -61,  41, -37, -53, -36,
 -50, -29, -51, -13, -61,  97, -65, -38,  50,  52,
 -37,  41, 173, -27,  80,  45,  41, -82, -81, -56,
 -38, -13, -82,  41,  43,  97, -65, -45, -12,  97,
  74, -24, -83,  -9,  -4,  -3,  -2, 175, -63, -75,
  69, -95, -97,  73, 179, -82,  41, -85, -88, -94,
 -25, -28, -93,  70,  54,  55,  50,  52,  65,  64,
  94,  92,  93,  91,  58,  60,  66,  67,  90,  71,
  68, 180, -40,  42, 160,   9,  23,  95,  42,  44,
  45,  40, -40, -44, -55,-113, -13, -40, -40, -40,
 -40, -40, -40, -40, -40, -40, -44, -41,  47, -38,
 -13, -70, -46,  40,  40,  72, -37, -90, 124, 125,
 -78,  41, -71,  71, 155,  71, -65, -48,  80, -12,
 -79,  43,  80,  80,  41, -78, -28, -27, -96, -58,
  60,  71, -57, -79, -12, -96, -45, -66,-101,  72,
  72,  69, -27,  73, -76, -77, -19, 175,  97,  80,
 -65, -82, -16, -17,  80, -98, -96,  72, -86, -99,
 156, -13, -89, 124, 125, -29, -38, -38, -38, -38,
 -38, -38, -38, -38, -38, -38, -38, -38, -38, -38,
 -38, -38, -38, -38, -38, -38, -38, -40,  42, -44,
 -55,-113, -38, -41, 176, -62, -63,  47,  97, -61,
 -41, 176, -62, -63, -37, -37, -54, -12, -18,  97,
  41, -43, -12,  40, -37, -37,  74,  -6,  69,  97,
  99,  41, -50, 155, -29, -11, -52,  70, -64, -48,
 -48,  41,  41,  41, -81, -52, -11, -57, -57,-102,
  72,  71, -19,  97, -19, 175, -96,  74,  71,-100,
 -16,  60,  71, -73, -64,  80, -49,  80, -12, -79,
  -6,  69,  43, -38, -37,  43, -41, 123,  47, -41,
 123, -18,  97, 160,  47, -41, 123, -41, 123,  41,
  41, -11, -54, -11,  41, -43, -43,  41,  41, -33,
  73, -92,  40, -78,-114,  41, -52, -52, -52,  41,
 -72, 127, -77, -19, -19, -75, -17,  70,  74, -87,
 -99, -11, -52, -49, -49, -33, -38, -40,  43,  41,
 -18,  97,  47, -18,  97, -44, -55,-113,  41,-103,
  74, 256,  -7,  -8,  40, -19, -80, -18, -29, -91,
  73, -38, -67,  -9,  -4,  -3,  -2, -22,  41, -40,
 -44, -55,  97, -18, -52, -11, -30,  74,  71, -37,
  40,  41,  71,  -6,  72, 185, -31,  74, -32,  -8,
  41, -37, -18, -33, -34, -35,  72,  28,  97,  -9,
  -4, -33,  20,  39,  16,  33,  80, 123,   4,   8,
 100, -39,   3,   7,  19,  10,   1,   9, 160, -40,
  99,  41,-105,-106, -38,  81, -59,  40, -59,  40,
-108,  69,  69,-111,  69, -33,  70,  54,  55,  50,
  52,  65,  64,  94,  92,  93,  91,  60,  58,  66,
  67,  90,  71,  68, 180,  80,-104,  40, -40,  42,
   9, -40,  72,  72, -33, -31, -38, -31,-107, -59,
-109,-110, -38,-112, -68, -39, -39, -39, -39, -39,
 -39, -39, -39, -39, -39, -39, -39, -39, -39, -39,
 -39, -39, -39, -39, -31,  81, -38, -40,  42,  12,
  41, -31, -31, -31, -31,  69, -31, -69,  98,  69,
  39,  41,  43, -38, -31, -38, -31, -74, -79,  40,
 -39, -59, -40,  43,  72, -33, -13, 155, -40, -38,
 -48,  41,  41,  41, -31 };
short yydef[]={

   0,  -2,   1,   2,   3,  61,   5,   6,  18,  19,
  20,  21,   0,   7,   0,  44,  67,  62, 191, 142,
   0,   0,   0,  60, 172,  64,  65,  66,  57,   0,
   0,   0, 402, 403,   0, 408, 393, 173, 132,   0,
   0, 176,   0, 376, 377,   4,   0,   0,  -2,   0,
  54,  68,  69,  70,  71,  72, 142,  51, 172, 319,
 319,  24,  35, 182, 393,  -2, 198, 319, 412, 184,
  -2, 197, 398,   0, 193, 142, 195, 196, 405,   0,
   0,  63, 174, 175,   0, 319,  55, 319, 143, 144,
 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
 155, 156, 157, 158, 159,   0,   0, 162, 163, 164,
 165, 166, 167, 168, 169, 170, 171, 215, 384, 385,
   0, 404, 406, 378, 407, 410,   0,  -2, 128, 112,
 124, 127,  87,  91,  84,  85,   0, 128, 319,   0,
   8,  35,  49,   0,  53,  46,  48,   0, 377, 317,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0, 348,   0, 172, 352, 319, 354, 355, 356, 357,
 358, 359, 379,   0,   0,   0, 383,   0, 267, 319,
  29,  43,   0,  61,  62,   0, 177,   0, 399, 264,
 396, 265, 397, 202, 172,  60,  62,   0,   0,   0,
   0, 177,   0, 192, 142,   0, 199,   0,  75,  82,
  83,  76,   0, 160, 161, 386, 387, 388, 215, 409,
 108, 131, 133, 134, 138, 137, 139,   0,   0,   0,
   0, 319, 107,  89,  86,   0,   0,  96,  25, 319,
  52,  45, 319, 319, 319, 319, 319, 319, 319, 319,
 319, 319, 319, 319, 319, 319, 319, 319, 319, 319,
 319, 319, 313, 319, 377,   0,   0, 324, 319,   0,
   0, 319, 318, 320, 321, 319, 207, 325, 326, 327,
 328, 329, 330, 331, 332, 333, 334, 349,   0,   0,
 210, 380, 381, 319, 319,  23,   0,  38,  31,  32,
 183, 185,   0, 398, 400, 319,  69, 390, 200, 202,
 202, 411, 379, 379, 188, 189,   0, 194,  58, 319,
  56,  73,  81,  76,  76,  59, 216,   0, 113, 135,
 136, 140, 193, 125, 115, 117, 119,   0,   0, 129,
 130,   0,   0,  92,  -2, 107, 375,  22,   0,  95,
   0,   0,  38,  27,  28,  50,  47, 294, 295, 296,
 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
 307, 308, 309, 310,   0, 312,   0, 315, 319, 322,
 323, 319,   0, 336,   0, 339,   0,   0,   0, 172,
 342,   0, 345,   0,   0,   0, 389, 207, 350, 351,
 353,   0, 210, 210,   0,   0, 268,   0,  36, 178,
   0, 177, 395, 401, 266, 204, 205, 391, 201, 203,
   0,   0,   0,   0,  74,  79,  80,   0,  78, 109,
 141,   0, 120,   0, 121,   0,  -2,  88, 107,   0,
   0,   9,   0,  97,  -2,  -2,  98,  99,   0,   0,
   0, 319,   0,   0,   0, 335, 337, 338,   0, 340,
 341, 360, 363,   0,   0, 343, 344, 346, 347, 374,
   0, 209, 208, 212, 382, 211,   0, 368, 369,  30,
  -2,   0,   0, 394, 319, 206, 186, 187, 190,  77,
 114,  33, 118, 122, 123,   0,  93, 319,  90,   0,
  94, 101, 102, 100,   0,  26, 311, 314,   0,   0,
 361, 365,   0, 366, 367, 370, 371,   0,   0, 217,
 225,   0,  37,  39, 319,   0,   0, 180, 392,  38,
 126, 106,  10,  11,  12,  13,  14,  64, 103, 316,
 372, 373, 362, 364, 213, 214, 221, 226,   0,   0,
 319, 179,   0,   0,  15, 218, 219, 224,   0,  40,
  41,   0, 181,  34, 220, 234, 237, 319,  60, 240,
 241, 242,   0,   0,   0, 248, 379, 176, 254,   0,
   0, 227, 228, 229,   0, 231,   0,   0, 377, 292,
   0,  42, 236,   0,   0,   0, 221, 319, 221, 246,
   0, 250, 252, 319, 256, 259,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0, 230, 221,   0, 288, 319,
   0, 293, 235, 238, 239, 243,   0, 245, 221, 221,
 221, 221,   0, 221, 258, 269, 270, 271, 272, 273,
 274, 275, 276, 277, 278, 279, 280, 281, 282, 283,
 284, 285,   0, 287,   0,   0,   0, 290, 319, 221,
 222, 319, 249, 251, 253, 221, 257, 260,   0,   0,
   0, 233,   0,   0, 244,   0, 255,   0,   0, 393,
 286, 232, 289,   0, 319, 261, 202,   0, 291,   0,
   0, 263, 221, 262, 247 };
#define YYFLAG 		-1000
#define YYERROR		goto yyerrlab
#define YYACCEPT	return(0)
#define YYABORT		return(1)
#define	yydebug		0

/*	parser for yacc output	*/

YYSTYPE yyv[YYMAXDEPTH]; 	/* where the values are stored */
int	yychar = -1; 		/* current input token number */
int	yynerrs = 0;		/* number of errors */
short	yyerrflag = 0;		/* error recovery flag */

char	*yytoknames[1];		/* for debugging */
char	*yystates[1];		/* for debugging */

int
yyparse(void)
{
	short yys[YYMAXDEPTH], *yyps, *yyxi;
	int yyj, yym, yystate, yyn;
	YYSTYPE *yypvt, *yypv;

	yystate = 0;
	yychar = -1;
	yynerrs = 0;
	yyerrflag = 0;
	yyps = &yys[-1];
	yypv = &yyv[-1];

yystack:
	/* put a state and value onto the stack */
	if(yydebug >= 3)
		if(yychar < 0 || yytoknames[yychar] == 0)
			printf("char %d in %s", yychar, yystates[yystate]);
		else
			printf("%s in %s", yytoknames[yychar], yystates[yystate]);
	if(++yyps >= &yys[YYMAXDEPTH]) { 
		yyerror("yacc stack overflow"); 
		return 1; 
	}
	*yyps = yystate;
	++yypv;
	*yypv = yyval;

yynewstate:
	yyn = yypact[yystate];
	if(yyn <= YYFLAG)
		goto yydefault; /* simple state */
	if(yychar < 0) {
		yychar = yylex();
		if(yydebug >= 2) {
			if(yychar <= 0)
				printf("lex EOF\n");
			else
			if(yytoknames[yychar])
				printf("lex %s\n", yytoknames[yychar]);
			else
				printf("lex (%c)\n", yychar);
		}
		if(yychar < 0)
			yychar = 0;
	}
	if((yyn += yychar) < 0 || yyn >= YYLAST)
		goto yydefault;
	if(yychk[yyn=yyact[yyn]] == yychar) { /* valid shift */
		yychar = -1;
		yyval = yylval;
		yystate = yyn;
		if(yyerrflag > 0)
			--yyerrflag;
		goto yystack;
	}

yydefault:
	/* default state action */
	if((yyn=yydef[yystate]) == -2) {
		if(yychar < 0) {
			yychar = yylex();
			if(yydebug >= 2)
				if(yychar < 0)
					printf("lex EOF\n");
				else
					printf("lex %s\n", yytoknames[yychar]);
			if(yychar < 0)
				yychar = 0;
		}
		/* look through exception table */
		for(yyxi = yyexca; *yyxi != -1 || yyxi[1] != yystate; yyxi += 2)
			;
		while(*(yyxi+=2) >= 0)
			if(*yyxi == yychar)
				break;
		if((yyn = yyxi[1]) < 0)
			return 0;   /* accept */
	}
	if(yyn == 0) {
		/* error ... attempt to resume parsing */
		switch(yyerrflag) {
		case 0:   /* brand new error */
			yyerror("syntax error");
			if(yydebug) {
				printf("%s", yystates[yystate]);
				if(yytoknames[yychar])
					printf("saw %s\n", yytoknames[yychar]);
				else
				if(yychar >= ' ' && yychar < 0177)
					printf("saw `%c'\n", yychar);
				else
				if(yychar == 0)
					printf("saw EOF\n");
				else
					printf("saw char 0%o\n", yychar);
			}
			++yynerrs;

		case 1:
		case 2: /* incompletely recovered error ... try again */
			yyerrflag = 3;
			/* find a state where "error" is a legal shift action */
			while(yyps >= yys) {
				yyn = yypact[*yyps] + YYERRCODE;
				if(yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE) {
					yystate = yyact[yyn];  /* simulate a shift of "error" */
					goto yystack;
				}
				/* the current yyps has no shift onn "error", pop stack */
				if(yydebug)
					printf("error recovery pops state %d, uncovers %d\n",
						*yyps, yyps[-1] );
				--yyps;
				--yypv;
			}
			/* there is no state on the stack with an error shift ... abort */
			return 1;

		case 3:  /* no shift yet; clobber input char */
			if(yydebug) {
				printf("error recovery discards ");
				if(yytoknames[yychar])
					printf("%s\n", yytoknames[yychar]);
				else
				if(yychar >= ' ' && yychar < 0177)
					printf("`%c'\n", yychar);
				else
				if(yychar == 0)
					printf("EOF\n");
				else
					printf("char 0%o\n", yychar);
			}
			if(yychar == 0)
				return 1; /* don't discard EOF, quit */
			yychar = -1;
			goto yynewstate;   /* try again in the same state */
		}
	}
	/* reduction by production yyn */
	if(yydebug) {
		char *s;

		printf("reduce %d in:\n\t", yyn);
		for(s = yystates[yystate]; *s; s++) {
			printf("%c", *s);
			if(*s == '\n' && *(s+1))
				printf("\t");
		}
	}
	yyps -= yyr2[yyn];
	yypvt = yypv;
	yypv -= yyr2[yyn];
	yyval = yypv[1];
	yym = yyn;

	/* consult goto table to find next state */
	yyn = yyr1[yyn];
	yyj = yypgo[yyn] + *yyps + 1;
	if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
		yystate = yyact[yypgo[yyn]];
	switch(yym) {
		
case 1:
# line 718 "gram.y"
{	YYCLEAN;return 2; } break;
case 2:
# line 719 "gram.y"
{	YYCLEAN;return 1; } break;
case 3:
# line 720 "gram.y"
{	YYCLEAN;return 0; } break;
case 4:
# line 722 "gram.y"
{
				set_linkage(yypvt[-1].s);
				bl_level--;
				YYCLEAN;return 1;
			} break;
case 5:
# line 728 "gram.y"
{
				set_linkage(0);
				bl_level++;
				YYCLEAN;return 1;
			} break;
case 6:
# line 733 "gram.y"
{  YYCLEAN;return 1; } break;
case 7:
# line 737 "gram.y"
{	
			PUSH_TEMPLATE_SCOPE();//SYM
// error('d',"template seen: in_class_decl %d", in_class_decl);
			if (in_class_decl) {
				must_be_friend = 1;
				if (templp->in_progress == true) // inside template
					templp->save_templ = new templ_state;
			}
			else must_be_friend = 0;
			templp->start() ;
			templp->formals_in_progress = true;
		 } break;
case 8:
# line 749 "gram.y"
{ in_arg_list = 2; } break;
case 9:
# line 750 "gram.y"
{
			templp->enter_parameters(); 
			templp->formals_in_progress = false;
			in_arg_list = 0;
		 } break;
case 10:
# line 756 "gram.y"
{
			templp->end(yypvt[-0].pn);
			POP_SCOPE(); //SYM
			if (in_class_decl && templp->save_templ) {
				delete templp->save_templ;
				templp->save_templ = 0;
			}
			else { 
				templp->in_progress = false;
				bound_expr_tbl->reinit();
			}
                  //SYM -- goto mod removed
                 } break;
case 12:
# line 772 "gram.y"
{ goto mod; } break;
case 13:
# line 773 "gram.y"
{ goto mod; } break;
case 15:
# line 776 "gram.y"
{ 
			Pname pn = yypvt[-1].pb->aggr();
			/* basetype:aggr() does not return the name for a forward 
		    	 * declaration, so extract it directly */
                    	yyval.p = (pn ? pn : yypvt[-1].pb->b_name);
                    	DECL_TYPE = 0;
		  } break;
case 17:
# line 787 "gram.y"
{ yyval.pn = Ncopy(yypvt[-0].pn) ;} break;
case 18:
# line 791 "gram.y"
{	
				//SYM -- tn stuff removed
				if (yypvt[-0].pn==0) yyval.i = 1; 
			} break;
case 19:
# line 795 "gram.y"
{ goto mod; } break;
case 20:
# line 797 "gram.y"
{ mod: //SYM -- tn stuff removed
				Pname n = yypvt[-0].pn;
				if ( n && n->n_qualifier ) {//SYM
					if ( n->n_qualifier->n_template_arg != template_type_formal )
						UNSET_SCOPE();
					if ( n->n_qualifier == sta_name )
						n->n_qualifier = 0;
				}
			} break;
case 22:
# line 808 "gram.y"
{	Pname n = new name(make_name('A'));
				n->tp = new basetype(ASM,0);
				Pbase(n->tp)->b_name = Pname(yypvt[-2].s);
				yyval.p = n;
			} break;
case 23:
# line 816 "gram.y"
{
				err_name = yypvt[-3].pn;
				if(err_name) err_name->n_initializer = yypvt[-1].pe;
				goto fix;
			} break;
case 24:
# line 822 "gram.y"
{
				Ptype t;
				err_name = yypvt[-1].pn;
			fix:
				if (err_name == 0) {
					error("syntax error:TX");
					yyval.p = Ndata(defa_type,err_name);
				}
				else if ((t=err_name->tp) == 0) {
					error("TX for%n",err_name);
					yyval.p = Ndata(defa_type,err_name);
				}
				else if (t->base==FCT) {
					if (Pfct(t)->returns==0)
						yyval.p = Nfct(defa_type,err_name,0);
					else
						yyval.p = Ndata(0,err_name);
				}
				else {
					error("syntax error:TX for%k%n",t->base,err_name);
					yyval.p = Ndata(defa_type,err_name);
				}
				if ( err_name && err_name->n_qualifier ) {
					if ( err_name->n_qualifier->n_template_arg != template_type_formal )
						UNSET_SCOPE();
					if ( err_name->n_qualifier == sta_name )
						err_name->n_qualifier = 0;
				}
			} break;
case 25:
# line 854 "gram.y"
{	if ( yychar == LC ) --bl_level;
				Pname n = Nfct(yypvt[-3].p,yypvt[-2].pn,dummy);
				Fargdcl(n->tp,name_unlist(yypvt[-1].nl),n);
				arg_redec( yypvt[-2].pn );
				yyval.pn = n;
			 	if ( yychar == LC ) ++bl_level;
				Ctbl->k_name = n;
			} break;
case 26:
# line 863 "gram.y"
{	Pname n = yypvt[-2].pn;//SYM
				if ( !in_typedef ) {
					Fbody(n->tp) = Pblock(yypvt[-0].p);//SYM
					Finit(n->tp) = yypvt[-1].pn;
				}
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 27:
# line 872 "gram.y"
{
				Pname n = Nfct(yypvt[-4].p,yypvt[-3].pn,dummy);
				Fargdcl(n->tp,name_unlist(yypvt[-2].nl),n);
				yypvt[-0].q->retval.pn = n;
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 28:
# line 880 "gram.y"
{
				if (!templp->in_progress)
					error(&yypvt[-3].pn->where,"syntax error -- did you forget a ';'?");
				Pname n = Nfct(yypvt[-4].p,yypvt[-3].pn,0);
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 29:
# line 890 "gram.y"
{	if ( yychar == LC ) --bl_level;
			 	Pname n = Nfct(defa_type,yypvt[-2].pn,dummy);
				Fargdcl(n->tp,name_unlist(yypvt[-1].nl),n);
				arg_redec( yypvt[-2].pn );
				yyval.pn = n;
			 	if ( yychar == LC ) ++bl_level;
				Ctbl->k_name = n;
			} break;
case 30:
# line 899 "gram.y"
{	Pname n = yypvt[-2].pn;//SYM
				Fbody(n->tp) = Pblock(yypvt[-0].p);//SYM
				if ( yypvt[-1].pn && yypvt[-1].pn->n_list && 
     					ccl && ccl->csu == UNION )  
						error( "multiple initializers in unionK %s::%n", yypvt[-5].pn->string, yypvt[-5].pn );
				Finit(n->tp) = yypvt[-1].pn;
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 31:
# line 909 "gram.y"
{
				Pname n = Nfct(defa_type,yypvt[-3].pn,dummy);
				Fargdcl(n->tp,name_unlist(yypvt[-2].nl),n);
				yypvt[-0].q->retval.pn = n;
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 32:
# line 917 "gram.y"
{
				if (explicit_template_definition  == 0 )
					error(&yypvt[-3].pn->where,"badD of%n -- did you forget a ';'?",yypvt[-3].pn);
				else {
			             Pname n = pti->get_tname();
				     if (yypvt[-3].pn->n_oper == DTOR)
					error('s',"explicitYZL for destructor of specializedYC%n -- please drop the parameter list",n);
				     else
					error('i',"specialializedYC%n: declaration problem: %s",n,yypvt[-3].pn->string);
				     error('i', "cannot recover from previous error" );
				}
				Pname n = Nfct(defa_type,yypvt[-3].pn,0);
				yyval.p = n;
				NOT_EXPECT_ID();
			} break;
case 33:
# line 935 "gram.y"
{	PUSH_ARG_SCOPE();//SYM
                        	arg_redec(yypvt[-0].pn);
                        	Ctbl->k_name = yypvt[-0].pn;
                   	} break;
case 34:
# line 940 "gram.y"
{
				Finit(yypvt[-3].pn->tp) = yypvt[-1].pn;
				Pfct(yypvt[-3].pn->tp)->body = Pblock(yypvt[-0].p);
				yyval.pn = yypvt[-3].pn;
				NOT_EXPECT_ID();
			} break;
case 35:
# line 950 "gram.y"
{
			// if parsing implicit inline def, save body
			//   of function for parsing after class def
			if ( Ctbl->k_id != ARG )
				error('i',"expectingA table in check_inline!");
			switch ( NEXTTOK() ) {
			case LC: case COLON:
				if ( in_class_decl ) {
					// mem or friend inline def
					// save text of mem_init & ftn
					la_backup(yychar,yylval);
					// yylval used as dummy...
					la_backup(FDEF, yylval);
					if ( yylval.q = save_text() ) {
						yychar = EMPTY;
						POP_SCOPE();//SYM
					} else { // syntax error
						// just parse in place
						yylex(); // FDEF
						yylex();
						yychar = NO_ID;
						hoist_al();//SYM
					}
				} // if in_class_decl
				//SYM -- else non-nested ftn def
				//SYM -- arg table will become block table
				break;
			default:
				la_backup(yychar,yylval);
				yychar = NO_ID; // 'graceful' recovery
				hoist_al();//SYM
				break;
			}
		   } break;
case 36:
# line 986 "gram.y"
{ ++in_binit_list; } break;
case 37:
# line 987 "gram.y"
{	
				yyval.p = yypvt[-0].p; 
				in_arg_list = 0;
				--in_binit_list;
			} break;
case 38:
# line 993 "gram.y"
{	yyval.p = 0; } break;
case 39:
# line 997 "gram.y"
{ yyval.p = yypvt[-0].p; } break;
case 40:
# line 999 "gram.y"
{ yyval.pn = yypvt[-0].pn;  yyval.pn->n_list = yypvt[-2].pn; } break;
case 41:
# line 1003 "gram.y"
{
				yyval.pn = new name;
				yyval.pn->n_initializer = yypvt[-1].pe;
			} break;
case 42:
# line 1008 "gram.y"
{
				Pname n = Ncopy(yypvt[-3].pn);
				n->base = yypvt[-3].pn->base;
				n->tp = yypvt[-3].pn->tp;
				n->n_initializer = yypvt[-1].pe;
				yyval.pn = n;
			} break;
case 43:
# line 1023 "gram.y"
{	if (yypvt[-0].pn == 0)
					error("badAD");
				else if (yypvt[-0].pn->tp->base == FCT)
					error("FD inAL (%n)",yypvt[-0].pn);
				else if (yypvt[-1].p)
                                        yypvt[-1].nl->add_list(yypvt[-0].pn);
				else
					yyval.nl = new nlist(yypvt[-0].pn);
			} break;
case 44:
# line 1033 "gram.y"
{
				PUSH_ARG_SCOPE();//SYM
                                yyval.p = 0; 
			} break;
case 46:
# line 1041 "gram.y"
{
                                if ( in_typedef ) {
                                        error("Tdef field");
                                        in_typedef = 0;
                                }
                        //      ENTER_NAME(yypvt[-1].pn);
                        } break;
case 47:
# line 1049 "gram.y"
{	yyval.p = yypvt[-3].pn;
				yyval.pn->tp = new basetype(FIELD,yypvt[-0].pn);
		 	} break;
case 48:
# line 1053 "gram.y"
{	yyval.p = new name;
				yyval.pn->tp = new basetype(FIELD,yypvt[-0].pn);
                                if ( in_typedef ) {
                                        error("Tdef field");
                                        in_typedef = 0;
                                }
			} break;
case 49:
# line 1061 "gram.y"
{
                        //      ENTER_NAME(yypvt[-1].pn);
                        } break;
case 50:
# line 1065 "gram.y"
{       Pexpr e = yypvt[-0].pe;
                                if (e == dummy) error("emptyIr");
                                yypvt[-3].pn->n_initializer = e;
                                init_seen = 0;
                        } break;
case 51:
# line 1073 "gram.y"
{	Pname n = yypvt[-0].pn;
				if (n) {
				    yyval.nl = new nlist(n);
				    if ( n->n_qualifier ) {//SYM
					if ( n->n_qualifier->n_template_arg != template_type_formal )
						UNSET_SCOPE();
					if ( n->n_qualifier == sta_name )
					    n->n_qualifier = 0;
				    }
				}
				if ( NEXTTOK() == CM && la_look() == TNAME ) 
					EXPECT_ID();
			} break;
case 52:
# line 1087 "gram.y"
{	Pname n = yypvt[-0].pn;
				if (yypvt[-2].p)
					if (n)
						yypvt[-2].nl->add(n);
					else
						error("DL syntax");
				else {
					if (n) yyval.nl = new nlist(n);
					error("DL syntax");
				}
				if ( n ) {
				    if ( n->n_qualifier ) {//SYM
					if ( n->n_qualifier->n_template_arg != template_type_formal )
						UNSET_SCOPE();
					if ( n->n_qualifier == sta_name )
					    n->n_qualifier = 0;
				    }
				}
				if ( NEXTTOK() == CM && la_look() == TNAME ) 
					EXPECT_ID();
			} break;
case 53:
# line 1111 "gram.y"
{ 
				extern int co_hack;
				co_hack = 1;
				/*$$ = Ndata($1,name_unlist($<nl>2));*/
				Pname n = Ndata(yypvt[-2].p,name_unlist(yypvt[-1].nl)); 
//error('d',"data_dcl:type decl_list sm: %n%t in_typedef%t in_tag%n",n,n->tp,in_typedef,in_tag);
				//SYM redef check removed
				in_typedef = 0;
				in_friend = 0;
				in_tag = 0;
				co_hack = 0;
				DECL_TYPE = 0; 
				yyval.p = n;
			} break;
case 54:
# line 1126 "gram.y"
{
				yyval.p = yypvt[-1].pb->aggr(); 
				in_typedef = 0;
				in_friend = 0;
				in_tag = 0;
				DECL_TYPE = 0; 
			} break;
case 55:
# line 1138 "gram.y"
{
			templp->parameters_in_progress++;
			in_arg_list = 2;
			check_decl();
		  } break;
case 56:
# line 1144 "gram.y"
{
			templp->parameters_in_progress--;
			if (!templp->parameters_in_progress)
				in_arg_list = 0;
		  } break;
case 57:
# line 1150 "gram.y"
{ yyval.pn = templp->check_tname(yypvt[-0].pn) ; } break;
case 58:
# line 1152 "gram.y"
{ 
			int sm = NEXTTOK()==SM;
			if (in_friend) in_friend += sm;
			bit flag=0;
			if (dtpt_opt && in_typedef &&  
				!templp->parameters_in_progress &&
				curloc.file == first_file)
				flag=1;
		    	yyval.pn = parametrized_typename(yypvt[-3].pn,
						  (expr_unlist(yypvt[-1].el)),in_friend) ; 
			if (flag)
				righttname=yyval.pn;
		  } break;
case 59:
# line 1166 "gram.y"
{ extern Pbase any_type;
		    error("%n was not aZizedT.", yyval.pn) ;
                    yyval.pn= yypvt[-3].pn->tdef() ;
                    yyval.pn->tp = any_type ; } break;
case 60:
# line 1175 "gram.y"
{ 
				yyval.p = new basetype(yypvt[-0].t,0); 
				if ( yypvt[-0].t == TYPEDEF ) {
					in_typedef = yyval.pt;
// error('d',"typedef: ccl %t ", ccl, yypvt[-0].pn);
				}
				else if ( yypvt[-0].t == FRIEND ) {
					in_friend = 1;
					must_be_friend = 0;
				}
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 61:
# line 1188 "gram.y"
{	yyval.p = new basetype(EXTERN,0);
				yyval.pb->b_linkage = yypvt[-0].s;
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 62:
# line 1193 "gram.y"
{
				yyval.p = new basetype(TYPE,yypvt[-0].pn); 
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 63:
# line 1198 "gram.y"
{ // modified tn_list TNAME
				yyval.p = new basetype(TYPE,yypvt[-0].pn);
				//xxx qualifier currently ignored...
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 66:
# line 1206 "gram.y"
{ 
				if (DECL_TYPE == TNAME)
					yyval.p = new basetype(TYPE,yypvt[-0].pn); 
		//	else if (DECL_TYPE == TSCOPE)
		//	yyval.p = 0;
				else
				if (DECL_TYPE == 0 &&
					yypvt[-0].p->base == TNAME)
						yyval.p = new basetype(TYPE,yypvt[-0].pn); 
				else
					yyval.p = new basetype(yypvt[-0].t,0); 
				DECL_TYPE = -1;
			} break;
case 68:
# line 1223 "gram.y"
{ 
				if ( DECL_TYPE != -1 ) {
					switch (yypvt[-1].pb->base) { 
					case COBJ: case EOBJ:
						Pbase bt;	
						bt = new basetype(0,0);
						*bt = *yypvt[-1].pb;
						DEL(yypvt[-1].pb);
						yypvt[-1].pb = bt;
					}
					yyval.p = yypvt[-1].pb->type_adj(yypvt[-0].t); 
				}
				DECL_TYPE = 0;
			} break;
case 69:
# line 1238 "gram.y"
{
//error('d',"decl_type: %d  $1: %t  $2: %n",DECL_TYPE,yypvt[-1].pb,yypvt[-0].pn);
				if ( DECL_TYPE != -1 ) 
			 		yyval.p = yypvt[-1].pb->name_adj(yypvt[-0].pn);
			/*XXX*/	else if(yypvt[-1].pb==0) yyval.p=new basetype(TYPE,yypvt[-0].pn);
				DECL_TYPE = 0;
			} break;
case 70:
# line 1245 "gram.y"
{ yyval.p = yypvt[-1].pb->base_adj(yypvt[-0].pb); } break;
case 71:
# line 1246 "gram.y"
{ yyval.p = yypvt[-1].pb->base_adj(yypvt[-0].pb); } break;
case 72:
# line 1248 "gram.y"
{ 
				if (DECL_TYPE == TYPE) {
					switch (yypvt[-1].pb->base) { 
					case COBJ: case EOBJ: 
						{
						Pbase bt;
						bt = new basetype(0,0);
						*bt = *yypvt[-1].pb;
						DEL(yypvt[-1].pb);
						yypvt[-1].pb = bt;
						}
					}
					yyval.p = yypvt[-1].pb->type_adj(yypvt[-0].t);  
				}
			/*XXX*/	else if (DECL_TYPE == TSCOPE) {
			/*XXX*/		error('i',"T decl_marker(tscope)");
			/*XXX*/	//	yyval.p = yypvt[-1].p;//ignore(?)
			/*XXX*/	}
				else
					yyval.p = yypvt[-1].pb->name_adj(yypvt[-0].pn); 
				DECL_TYPE = -1;
			} break;
case 73:
# line 1272 "gram.y"
{in_arg_list = 2; check_decl();} break;
case 74:
# line 1275 "gram.y"
{yypvt[-2].el->add(new expr(ELIST,yypvt[-0].pe,NULL)) ; } break;
case 75:
# line 1277 "gram.y"
{ in_arg_list=0; yyval.el = new elist(new expr(ELIST,yypvt[-0].pe,NULL)); } break;
case 76:
# line 1281 "gram.y"
{
				yyval.p = new name;
			} break;
case 77:
# line 1285 "gram.y"
{
				yyval.p = yypvt[-1].p;
				in_arg_list = 0;
				hoist_al();
			} break;
case 78:
# line 1291 "gram.y"
{
				Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
				NOT_EXPECT_ID();
			} break;
case 79:
# line 1298 "gram.y"
{
				Freturns(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 80:
# line 1303 "gram.y"
{
				Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 81:
# line 1309 "gram.y"
{ yyval.p = Ncast(yypvt[-1].p,yypvt[-0].pn); } break;
case 82:
# line 1312 "gram.y"
{
				yypvt[-0].pn->n_template_arg = template_actual_arg_dummy;
				yyval.pe = yypvt[-0].pn; /* keep yacc happy */ 
			} break;
case 83:
# line 1317 "gram.y"
{ 
				if (yypvt[-0].pe == dummy) error("emptyYZL");
				yyval.pe = yypvt[-0].pe; 
			} break;
case 84:
# line 1325 "gram.y"
{ yyval.p = enumcheck( yypvt[-0].pn); } break;
case 85:
# line 1327 "gram.y"
{
			if ( DECL_TYPE != TNAME ) {
				error("syntax error -- enum%k",yypvt[-0].t);
				yyval.p = 0;
			} else 
				yyval.p = enumcheck( yypvt[-0].pn);
		} break;
case 86:
# line 1335 "gram.y"
{
			if ( DECL_TYPE != TNAME ) {
				error("enum declaration syntax");
				yyval.p = 0;
			} else 
				yyval.pn = enumcheck(yypvt[-0].pn);
			if (in_typedef && in_typedef->base == 0)
				in_typedef->defined = TNAME_SEEN;
			//xxx qualifier currently ignored...
		} break;
case 87:
# line 1347 "gram.y"
{ ++in_class_decl; } break;
case 88:
# line 1348 "gram.y"
{ --in_class_decl; yyval.p = end_enum(0,yypvt[-1].nl); } break;
case 89:
# line 1349 "gram.y"
{ ++in_class_decl; } break;
case 90:
# line 1350 "gram.y"
{ --in_class_decl; yyval.p = end_enum(yypvt[-4].pn,yypvt[-1].nl); } break;
case 91:
# line 1351 "gram.y"
{ yyval.pb = (Pbase)yypvt[-0].pn->tp; } break;
case 92:
# line 1355 "gram.y"
{	if (yypvt[-0].p) yyval.nl = new nlist(yypvt[-0].pn); } break;
case 93:
# line 1357 "gram.y"
{	if( yypvt[-0].p)
					if (yypvt[-2].p)
						yypvt[-2].nl->add(yypvt[-0].pn);
					else
						yyval.nl = new nlist(yypvt[-0].pn);
			} break;
case 96:
# line 1368 "gram.y"
{ 
				yyval.pn = NULL;
				error("emptyYZL");
			} break;
case 97:
# line 1377 "gram.y"
{ templp->collect(yypvt[-1].t, yypvt[-0].pn) ; } break;
case 98:
# line 1379 "gram.y"
{templp->collect(Ndata(yypvt[-1].p,yypvt[-0].pn)); } break;
case 99:
# line 1386 "gram.y"
{	yyval.p = yypvt[-0].pn; } break;
case 100:
# line 1388 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
			} break;
case 101:
# line 1393 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 102:
# line 1397 "gram.y"
{	Freturns(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 103:
# line 1401 "gram.y"
{
				yyval.p = yypvt[-1].p;
				in_arg_list = 0;
				hoist_al();
			} break;
case 104:
# line 1410 "gram.y"
{
				if ( yypvt[-0].pn->n_oper != TNAME )
					insert_name(yypvt[-0].pn,Ctbl);
				yyval.p = yypvt[-0].pn;
				yyval.pn->tp = moe_type;
			} break;
case 105:
# line 1417 "gram.y"
{
				if ( yypvt[-0].pn->n_oper != TNAME )
					insert_name(yypvt[-0].pn,Ctbl);
			} break;
case 106:
# line 1422 "gram.y"
{	yyval.p = yypvt[-3].pn;
				yyval.pn->tp = moe_type;
				yyval.pn->n_initializer = yypvt[-0].pe;
			} break;
case 107:
# line 1427 "gram.y"
{	yyval.p = 0; } break;
case 108:
# line 1431 "gram.y"
{	parsing_class_members = 0;
				RESTORE_STATE();
				switch ( NEXTTOK() ) {
				case TYPE: case AGGR: case ENUM: case EOFTOK:
					error("`;' or declaratorX afterCD");
					la_backup(yychar,yylval);
					yychar = SM;
					break;
				}
				la_backup(yychar,yylval);
				yychar = -1;
				restore_text();
				++bl_level; // scope weirdness!
				++in_mem_fct;
			} break;
case 109:
# line 1447 "gram.y"
{
				--in_mem_fct;
				--bl_level; // scope weirdness!
				if ( yychar == ID ) {
					// (yuk!) adjust lex level
					--yylval.pn->lex_level;
				}
				ccl->mem_list = name_unlist(yypvt[-3].nl);
// error('d',"ccl: %t templ_friends: %d", ccl, templ_friends);
				ccl->templ_friends = templ_friends; templ_friends = 0;
				if ( --in_class_decl )  // nested class
					// continue to parse enclosing class
					parsing_class_members = 1;
				//SYM -- tn stuff removed
                        	POP_SCOPE();//SYM
				if ( Ctbl->k_id == TEMPLATE ) {
					// remove intermediate template table
					//    from scope of class
					ccl->k_tbl->k_next = Ctbl->k_next;
				}

				if (pti) {
					pti->explicit_inst();
					Pname nnn = yyval.pt->bname();
// error('d',"ccl: %s nnn: %s", ccl->string, nnn->string);
					nnn->string = ccl->string;
					explicit_template_definition = 0;
					pti = 0;
				}

				end_cl();
				declTag = 1;
			} break;
case 110:
# line 1481 "gram.y"
{ aggrcheck:
				yyval.pb = (Pbase)yypvt[-0].pn->tp; 
				if ( yyval.p == 0 ) {
					if (templp->parameters_in_progress)
						error("TX for%n -- did you misdeclare aY?",yypvt[-0].pn);
					else error("TX for %n",yypvt[-0].pn);
					error('i', "cannot recover from previous error" );
				}

				if ( yyval.p->base == TYPE ) {
					Pname nx = yyval.pb->b_name;
					yyval.pb = (Pbase)nx->tp;
					if ( yyval.p->base != COBJ
					||   strcmp(nx->string,yypvt[-0].pn->string)
					)
						error("%n of type%t redeclared as%k.",yypvt[-0].pn,yyval.pb,yypvt[-1].t);
				} else if ( yyval.p->base != COBJ )
					error("%n of type%t redeclared as%k",yypvt[-0].pn,yyval.pb,yypvt[-1].t);
				check_tag();
			} break;
case 111:
# line 1502 "gram.y"
{ 
                    /* don't place the template on the instantiation list if it is
                     * a friend declaration or a foward declaration of a specialization
                     * friend class x<int> and struct x<int>; */

                    dont_instantiate = NEXTTOK()==SM;
		    Pexpr e=0;
		    if (dont_instantiate && in_friend == 0) {
			// *** this code could be used for forward declaration
			Ptempl t = templp->is_template(yypvt[-3].pn);

			// must have seen a definition of template class
			if (t == 0) {
				error("explicitC instance of a nonYC%n",yypvt[-3].pn);
				error('i', "cannot recover from previous error" );
			}

			// make sure the explicit arguments are ok
			e = expr_unlist(yypvt[-1].el);
			t->check_actual_args(e);

			// watch out for redefinition -- if exists,
			// use forward declaration or create instance
			pti = t->get_match(e,0,false);
			if ( pti ) { 
				if (pti->get_class()->class_base == INSTANTIATED)
					error("ZC%n multiply instantiated",yypvt[-3].pn);
			}
			else pti = new templ_inst(e,t,yypvt[-4].t);
			pti->inst_formals = t->get_formals();

			error('s',"forwardD of a specialized version ofY%n",yypvt[-3].pn);
			error('C',"\tclass %n",pti->get_tname()); 
			error('c'," -- did you mean a general forward declaration of theY?\n");
			error('C',"\tif so, use:  template <formal-parameters> class %n;\n",yypvt[-3].pn);
	            }

		    if (!e)
		    {
		        e = expr_unlist(yypvt[-1].el);
                    }
                    Pname p = parametrized_typename(yypvt[-3].pn, e, in_friend);
                    dont_instantiate = 0;
                    yyval.pb = (Pbase)p->tp;
                    check_tag();
                  } break;
case 112:
# line 1549 "gram.y"
{
				goto aggrcheck;
			} break;
case 115:
# line 1559 "gram.y"
{ yyval.pbc = yypvt[-0].pbc; } break;
case 116:
# line 1560 "gram.y"
{ yyval.pbc = 0; } break;
case 118:
# line 1565 "gram.y"
{	if (yypvt[-0].pbc) { yyval.pbc = yypvt[-0].pbc; yyval.pbc->next = yypvt[-2].pbc; } } break;
case 119:
# line 1568 "gram.y"
{ yyval.pbc = dobase(0,yypvt[-0].pn); } break;
case 120:
# line 1569 "gram.y"
{ yyval.pbc = dobase(yypvt[-1].t,yypvt[-0].pn); } break;
case 121:
# line 1570 "gram.y"
{ yyval.pbc = dobase(0,yypvt[-0].pn,yypvt[-1].t); } break;
case 122:
# line 1571 "gram.y"
{ yyval.pbc = dobase(yypvt[-2].t,yypvt[-0].pn,yypvt[-1].t); } break;
case 123:
# line 1572 "gram.y"
{ yyval.pbc = dobase(yypvt[-1].t,yypvt[-0].pn,yypvt[-2].t); } break;
case 124:
# line 1576 "gram.y"
{
				Pname n = start_cl(yypvt[-1].t,0,0);
				PUSH_CLASS_SCOPE(n);//SYM
				ccl->k_tbl = Ctbl;//SYM
				yyval.p = Pbase(n->tp);
				parsing_class_members = 1;
				//SYM -- tn stuff removed
				in_class_decl++;
				SAVE_STATE();
			} break;
case 125:
# line 1588 "gram.y"
{
				Pname n = start_cl(yypvt[-3].t,yypvt[-2].pn,yypvt[-1].pbc);
				PUSH_CLASS_SCOPE(n);//SYM
				ccl->k_tbl = Ctbl;//SYM
				yyval.p = Pbase(n->tp);
				parsing_class_members = 1;
				//SYM -- tn stuff removed
				in_class_decl++;
				SAVE_STATE();
			} break;
case 126:
# line 1599 "gram.y"
{
			// LC increments bl_level by 1
			if ( bl_level > 1 )
			     error('s', "specializedY%n not at global scope",yypvt[-5].pn);
			explicit_template_definition = 1;
			Ptempl t = templp->is_template(yypvt[-5].pn);

			// must have seen a definition of template class
			if (t == 0 || !t->defined) {
				error("YC%n must be defined prior to an explicitC instance",yypvt[-5].pn);
				error('i', "cannot recover from previous error" );
			}

			// make sure the explicit arguments are ok
			Pexpr e = expr_unlist(yypvt[-3].el);
			t->check_actual_args(e);

			// watch out for redefinition -- if exists,
			// use forward declaration or create instance
			pti = t->get_match(e,0,false);
			if ( pti ) { 
				if (pti->get_class()->class_base == INSTANTIATED)
					error("ZC%n multiply instantiated",yypvt[-5].pn);
			}
			else pti = new templ_inst(e,t,yypvt[-6].t);

			Pname n = start_cl(yypvt[-6].t,pti->get_tname(),yypvt[-1].pbc);
                        Pbase(n->tp)->b_name->n_redefined = 1;
			PUSH_CLASS_SCOPE(n);//SYM
			ccl->k_tbl = Ctbl;//SYM
			yyval.p = Pbase(n->tp);
			parsing_class_members = 1;
			in_class_decl++;
			SAVE_STATE();
			} break;
case 127:
# line 1636 "gram.y"
{ yyval.p = yypvt[-0].pn; } break;
case 128:
# line 1637 "gram.y"
{ yyval.p=yypvt[-0].p; } break;
case 129:
# line 1640 "gram.y"
{ yyval.p = yypvt[-0].pn; } break;
case 130:
# line 1641 "gram.y"
{ yyval.p=yypvt[-0].p; } break;
case 131:
# line 1645 "gram.y"
{
				if (yypvt[-0].p) {
					if (yypvt[-1].p)
						yypvt[-1].nl->add_list(yypvt[-0].pn);
					else
						yyval.nl = new nlist(yypvt[-0].pn);
				}
				in_friend = 0;
			} break;
case 132:
# line 1654 "gram.y"
{ yyval.p = 0; } break;
case 133:
# line 1656 "gram.y"
{
// error('d', "ZizedTD must be atG, notC scope" );
				if (must_be_friend) {
					error("non-friend ZizedTD must be atG, notC scope" );
					error('i', "cannot recover from previous error" );
				}
  				templ_friends = new cons(templp->parsed_template,templ_friends);
				templp->parsed_template = 0;
			} break;
case 135:
# line 1669 "gram.y"
{
				fct_friend1:
				if (in_friend &&
				    yypvt[-1].pn &&
				    yypvt[-1].pn->n_qualifier &&
				    yypvt[-1].pn->n_qualifier->n_template_arg != template_type_formal)
					UNSET_SCOPE();
			} break;
case 136:
# line 1678 "gram.y"
{
				goto fct_friend1;
			} break;
case 137:
# line 1682 "gram.y"
{
				fct_friend2:
				if (in_friend &&
				    yypvt[-0].pn &&
				    yypvt[-0].pn->n_qualifier &&
				    yypvt[-0].pn->n_qualifier->n_template_arg != template_type_formal)
					UNSET_SCOPE();
			} break;
case 138:
# line 1691 "gram.y"
{
				goto fct_friend2;
			} break;
case 140:
# line 1696 "gram.y"
{	yyval.p = new name;
				yyval.pn->base = yypvt[-1].t;
			} break;
case 141:
# line 1700 "gram.y"
{	Pname n = Ncopy(yypvt[-1].pn);
				if (n->n_oper == TYPE) {
					error('s',"visibilityD for conversion operator");
					// n->tp = Ptype(n->n_initializer);
					n->tp = Ptype(n->cond);
					n->cond = 0;
					// n->n_initializer = 0;
					n->n_oper = 0;
					sig_name(n);
				}
				n->n_qualifier = yypvt[-2].pn;
				n->base = PR;
				yyval.p = n;
				if ( yypvt[-2].pn && yypvt[-2].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();//SYM
			} break;
case 142:
# line 1730 "gram.y"
{ yyval.p = yypvt[-0].pn; } break;
case 143:
# line 1732 "gram.y"
{	yyval.p = Ncopy(yypvt[-0].pn);
				yyval.pn->n_oper = DTOR;
			} break;
case 144:
# line 1736 "gram.y"
{	yyval.p = new name(oper_name(yypvt[-0].t));
				yyval.pn->n_oper = yypvt[-0].t;
			} break;
case 145:
# line 1740 "gram.y"
{	Pname n = yypvt[-0].pn;
				n->string = "_type";
				n->n_oper = TYPE;
				n->cond = Pexpr(n->tp);
				// n->n_initializer = Pexpr(n->tp);
				n->tp = 0;
				yyval.p = n;
			} break;
case 160:
# line 1764 "gram.y"
{	yyval.t = CALL; } break;
case 161:
# line 1765 "gram.y"
{	yyval.t = DEREF; } break;
case 167:
# line 1771 "gram.y"
{	yyval.t = NEW; --in_new; } break;
case 168:
# line 1772 "gram.y"
{	yyval.t = DELETE; } break;
case 169:
# line 1773 "gram.y"
{	yyval.t = REF; } break;
case 170:
# line 1774 "gram.y"
{	yyval.t = CM; } break;
case 171:
# line 1775 "gram.y"
{	yyval.t = REFMUL;
					if (yypvt[-0].t == DOT) error(".* cannot be overloaded");
				} break;
case 172:
# line 1780 "gram.y"
{ yyval.pn = SET_SCOPE(yypvt[-0].pn); } break;
case 173:
# line 1784 "gram.y"
{   if ( yypvt[-0].pn != sta_name ) {
				Pname n = yypvt[-0].pn;
				char *str = 0, *str2 = 0, *s = n->string;
				if (n->n_template_arg != template_type_formal) {
				    n = n->tp->is_cl_obj();
				    if ( n ) str = s = get_classname(n->string);
				}
				if ( n && NEXTTOK() == TNAME
				&& strcmp(s,str2=get_classname(yylval.pn->string))==0){
					// ctor -- change to ID to avoid
					//    parsing as type spec
					yychar = ID;
					yylval.pn = Ncopy(yylval.pn);
					yylval.pn->n_oper = TNAME;
				}
				if ( str ) delete [] str;
				if ( str2 ) delete [] str2;
			    }
			    yyval.pn = yypvt[-0].pn;
			} break;
case 174:
# line 1805 "gram.y"
{//SYM
			   yyval.pn = yypvt[-0].pn;
			   if ( yypvt[-0].pn == sta_name ) {
			   	error("scope qualifier syntax");
			   } else {
// error('d',"tn_list: tn_list tscope: pn2: %s", yypvt[-0].pn->string);
				Pname cn = yypvt[-0].pn;
				char *str = 0, *str2 = 0, *s = cn->string;
				if (cn->n_template_arg != template_type_formal){
				    cn = yypvt[-0].pn->tp->is_cl_obj();
				    if (cn) str = s = get_classname(cn->string);
				}
				if ( cn && NEXTTOK() == TNAME
				&& strcmp(s,str2=get_classname(yylval.pn->string))==0){
					// ctor -- change to ID to avoid
					//    parsing as type spec
					yychar = ID;
					yylval.pn = Ncopy(yylval.pn);
					yylval.pn->n_oper = TNAME;
				}
				if ( str ) delete [] str;
				if ( str2 ) delete [] str2;
				if ( yypvt[-1].pn != sta_name
				&&   yypvt[-1].pn->n_template_arg != template_type_formal){
				    Pname cx = yypvt[-1].pn->tp->is_cl_obj();
				    if ( cx ) // cx::cn::
					if ( check_if_base(Pclass(cx->tp),Pclass(cn->tp)) )
						error("%n ::%n :: --%n not aM of%n",cx,cn,cn,cx);
				}
			    }
			} break;
case 175:
# line 1839 "gram.y"
{	
				yyval.pn = yypvt[-0].pn;
				if (in_typedef && in_typedef->base == 0)
					in_typedef->defined = TNAME_SEEN;
				//xxx qualifier currently ignored...
				// yyval.pn = Ncopy( yypvt[-0].pn );
				// yyval.pn->n_oper = TNAME;
				// yyval.pn->n_qualifier = yypvt[-1].pn;
			} break;
case 176:
# line 1849 "gram.y"
{	
				yyval.pn = yypvt[-0].pn;
				if (in_typedef && in_typedef->base == 0)
					in_typedef->defined = TNAME_SEEN;
			//	yyval.pn = Ncopy( yypvt[-0].pn );
			//	yyval.pn->n_oper = TNAME;
			} break;
case 177:
# line 1859 "gram.y"
{ yyval.i = 0; } break;
case 178:
# line 1861 "gram.y"
{ /* const/volatile function */
				switch ( yypvt[-0].t ) {
				case VOLATILE:
					error('s',"volatile functions");
					break;
				case CONST:
					yyval.i = (yypvt[-1].i | 1);
					break;
				default:
					if ( NEXTTOK() != SM
					&&   yychar != COLON
					&&   yychar != LC ) {
						la_backup(yychar,yylval);
						yylval.t = yypvt[-0].t;
						la_backup(TYPE,yylval);
						yylval.t = SM;
						yychar = SM;
						error("syntax error: unexpected%k (did you forget a `;'?)",yypvt[-0].t);
					} else error("FD syntax: unexpected%k",yypvt[-0].t);
					break;
				}
 			} break;
case 179:
# line 1884 "gram.y"
{ yyval.i = yypvt[-4].i; } break;
case 180:
# line 1887 "gram.y"
{ yyval.pl = 0; } break;
case 181:
# line 1889 "gram.y"
{ yyval.pl = 0; } break;
case 182:
# line 1893 "gram.y"
{	Freturns(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = yypvt[-0].pt;
			} break;
case 183:
# line 1897 "gram.y"
{ /* function with no argument */
 				yypvt[-3].pn->tp = new fct(yypvt[-3].pn->tp,0,1);
 				Pfct(yypvt[-3].pn->tp)->f_const = (yypvt[-0].i & 1);
 			} break;
case 184:
# line 1902 "gram.y"
{	Pname n = yypvt[-1].pn;
				yyval.p = Ncopy(n);
				//??? what if tname is qualified ???
				//SYM -- change -- do not if ctor def...
				if ( !in_typedef
				&&  (ccl==0 || strcmp(n->string,ccl->string)) )
					n->hide();
				yyval.pn->n_oper = TNAME;
				Freturns(yypvt[-0].p) = yyval.pn->tp;
				yyval.pn->tp = yypvt[-0].pt;
			} break;
case 185:
# line 1918 "gram.y"
{	
				yypvt[-3].pn->tp = new fct(yypvt[-3].pn->tp,yypvt[-1].pn,1); 
 				in_arg_list = 0;
 				//SYM end_al(yypvt[-2].pl,0);
 				POP_SCOPE();//SYM
				//RESTORE_STATE();
			} break;
case 186:
# line 1926 "gram.y"
{
				Pptr p = new ptr( PTR, 0 );
				Ptyp(p) = new basetype(TYPE,yypvt[-5].pn);
				Freturns( yypvt[-0].p ) = Ptype(p);
				yypvt[-2].pn->tp = yypvt[-0].pt;
			//SYM -- insert in table if not done elsewhere...
				if ( yypvt[-2].pn->n_oper != TNAME && !in_typedef ) {
					insert_name(yypvt[-2].pn,Ctbl);
				}
				yyval.p = yypvt[-2].pn;
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 187:
# line 1939 "gram.y"
{
				Pptr p = new ptr( RPTR, 0 );
				Ptyp(p) = new basetype(TYPE,yypvt[-5].pn);
				Freturns( yypvt[-0].p ) = Ptype(p);
				yypvt[-2].pn->tp = yypvt[-0].pt;
			//SYM -- insert in table if not done elsewhere...
				if ( yypvt[-2].pn->n_oper != TNAME && !in_typedef ) {
					insert_name(yypvt[-2].pn,Ctbl);
				}
				yyval.p = yypvt[-2].pn;
				if (DECL_TYPE == -1) DECL_TYPE = 0;
			} break;
case 188:
# line 1952 "gram.y"
{	Pname n = yypvt[-3].pn;
				yyval.p = Ncopy(yypvt[-3].pn);
				//??? what about qualified tname?
				//SYM -- change -- do not if ctor def...
			//XXXXX defer until name::normalize()?
				if ( !in_typedef
				&&  (ccl==0 || strcmp(n->string,ccl->string)) )
					n->hide();
				yyval.pn->n_oper = TNAME;
				yyval.pn->tp = new fct(0,yypvt[-1].pn,1);
			} break;
case 189:
# line 1964 "gram.y"
{ /* function with no argument */
				Pname n = yypvt[-3].pn;
				yyval.p = Ncopy(yypvt[-3].pn);
				//SYM -- change -- do not if ctor def...
				if ( !in_typedef
				&&  (ccl==0 || strcmp(n->string,ccl->string)) )
					n->hide();
 				yyval.pn->n_oper = TNAME;
 				yyval.pn->tp = new fct(0,0,1);
 				Pfct(yyval.pn->tp)->f_const = (yypvt[-0].i & 1);
			} break;
case 190:
# line 1976 "gram.y"
{	memptrdcl(yypvt[-3].pn,yypvt[-5].pn,yypvt[-0].pt,yypvt[-2].pn);
				yyval.p = yypvt[-2].p;
			} break;
case 191:
# line 1980 "gram.y"
{//SYM -- insert in table if appropriate...
			 //SYM    n_oper == TNAME => tname already hidden
			 //SYM    other !=0 values of n_oper => op or dtor
			 //SYM -- enter non-oper names as well as TNAMEs
			 //SYM    in parsing table to handle "1.5 namespace"
			 //SYM    in all scopes, since dcl does not build
			 //SYM    the complete table until after functions
			 //SYM    / classdefs are parsed.
			 //SYM friends are processed in norm.c
			 //SYM    to handle 'friend x;' etc
				if ( yypvt[-0].pn->n_oper == 0
				&&  !in_typedef && !in_friend ) {
				    //SYM do not hide ctor name...
				    if ( ccl==0 || parsing_class_members==0
				    ||   strcmp(ccl->string,yypvt[-0].pn->string)) {
					Pname n = new name; *n = *yypvt[-0].pn;
					insert_name(n,Ctbl);
				    }
				}
			} break;
case 192:
# line 2001 "gram.y"
{	yyval.p = Ncopy(yypvt[-0].pn);
				//yyval.pn->n_qualifier = yypvt[-2].pn;
				error("`.' used for qualification; please use `::'");
			} break;
case 193:
# line 2006 "gram.y"
{	yyval.p = yypvt[-0].p;
				//SYM if ( yypvt[-1].pn != sta_name ) {
    				//SYM	set_scope(yypvt[-1].pn); 
					if ( yypvt[-1].pn == sta_name 
    					&&   yyval.pn->n_oper==DTOR )
						error("bad syntax for destructor ::%n",yyval.pn);
    					yyval.pn->n_qualifier = yypvt[-1].pn;
				//SYM }
			} break;
case 194:
# line 2016 "gram.y"
{	yyval.p = Ncopy(yypvt[-0].pn);
				//yyval.pn->n_qualifier = yypvt[-3].pn;//SYM yypvt[-2].pn;
				error("`.' used for qualification; please use `::'");
				error("non-type qualifier%n",yypvt[-2].pn);
				//if ( yypvt[-3].pn != sta_name ) {
    				//SYM	set_scope(yypvt[-3].pn); 
    				//	yypvt[-2].pn->n_qualifier = yypvt[-3].pn;
				//}
			} break;
case 195:
# line 2026 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = yypvt[-1].pt;
				yyval.p = yypvt[-0].p;
			} break;
case 196:
# line 2031 "gram.y"
{	yyval.p = Ncopy(yypvt[-0].pn);
				//??? what about qualified tnames?
				yyval.pn->n_oper = TNAME;
				// cannot evaluate at this point: defer until data_dcl
				if ( !in_typedef ) yypvt[-0].pn->hide();//SYM
				else in_tag = yypvt[-0].pn;//SYM???
				yyval.pn->tp = yypvt[-1].pt;
			} break;
case 197:
# line 2040 "gram.y"
{	yyval.p = Ncopy(yypvt[-1].pn);
				//??? what about qualified tnames?
				yyval.pn->n_oper = TNAME;
				if ( !in_typedef ) yypvt[-1].pn->hide();//SYM
				else in_tag = yypvt[-1].pn;//SYM???
				yyval.pn->tp = yypvt[-0].pt;
			} break;
case 198:
# line 2048 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = yypvt[-0].pt;
			} break;
case 199:
# line 2065 "gram.y"
{ 
				yyval.p = yypvt[-1].p; 
				in_arg_list = 0;
				hoist_al();//SYM end_al(yypvt[-2].pl,0);
				//RESTORE_STATE();
			} break;
case 200:
# line 2074 "gram.y"
{//SYM -- insert in table if not done elsewhere...
				if ( yypvt[-0].pn->n_oper != TNAME ) {
					Pname n = new name; *n = *yypvt[-0].pn;
					insert_name(n,Ctbl);
				}
				yyval.p = yypvt[-0].pn;
			} break;
case 201:
# line 2082 "gram.y"
{	yyval.p = Ncopy(yypvt[-0].pn);
				yyval.pn->n_oper = TNAME;
				yypvt[-0].pn->hide();
				yyval.pn->tp = yypvt[-1].pt;
			} break;
case 202:
# line 2088 "gram.y"
{	
				yyval.p = new name; 
				NOT_EXPECT_ID();
			} break;
case 203:
# line 2093 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
			} break;
case 204:
# line 2098 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 205:
# line 2102 "gram.y"
{	Freturns(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 206:
# line 2118 "gram.y"
{ 
// error('d', "arg_lp arg_decl rp in_arg_list: %d", in_arg_list );
				yyval.p = yypvt[-1].p; 
				in_arg_list = 0;
				hoist_al();//SYM end_al(yypvt[-2].pl,0);
				//RESTORE_STATE();
			} break;
case 207:
# line 2128 "gram.y"
{	yyval.p = new name; } break;
case 208:
# line 2130 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
                                NOT_EXPECT_ID();
			} break;
case 209:
# line 2136 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 210:
# line 2141 "gram.y"
{ yyval.p = new name; } break;
case 211:
# line 2143 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
				NOT_EXPECT_ID();
			} break;
case 212:
# line 2149 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-1].pn->tp;
				yypvt[-1].pn->tp = (Ptype)yypvt[-0].p;
			} break;
case 213:
# line 2153 "gram.y"
{	Freturns(yypvt[-0].p) = yypvt[-2].pn->tp;
				yypvt[-2].pn->tp = yypvt[-0].pt;
				yyval.p = yypvt[-2].p;
			} break;
case 214:
# line 2158 "gram.y"
{	Vtype(yypvt[-0].p) = yypvt[-2].pn->tp;
				yypvt[-2].pn->tp = yypvt[-0].pt;
				yyval.p = yypvt[-2].p;
			} break;
case 215:
# line 2165 "gram.y"
{	yyval.p = new name; } break;
case 216:
# line 2167 "gram.y"
{	Ptyp(yypvt[-1].p) = yypvt[-0].pn->tp;
				yypvt[-0].pn->tp = (Ptype)yypvt[-1].p;
				yyval.p = yypvt[-0].p;
			} break;
case 217:
# line 2177 "gram.y"
{
				yyval.p = 0; 
			} break;
case 218:
# line 2181 "gram.y"
{
				error( "ZizedTD must be atG, not local scope" );
				error('i', "cannot recover from previous error" );
			} break;
case 219:
# line 2186 "gram.y"
{	
				if (yypvt[-0].p)
					if (yypvt[-1].p)
						yypvt[-1].sl->add(yypvt[-0].ps);
					else {
						yyval.sl =  new slist(yypvt[-0].ps);
						stmt_seen = 1;
					}
			} break;
case 220:
# line 2197 "gram.y"
{
				yyval.p = yypvt[-0].p;
				if (yypvt[-0].p)	stmt_seen = 1;
			} break;
case 221:
# line 2204 "gram.y"
{
				yyval.p = 0;
				check_decl();
			} break;
case 222:
# line 2211 "gram.y"
{	yyval.p = yypvt[-1].p;
			/*	if ($<pe>$ == dummy) error("empty condition");*/
				stmt_seen = 1;
			} break;
case 223:
# line 2218 "gram.y"
{	PUSH_BLOCK_SCOPE();//SYM
				cd_vec[cdi] = cd;
				stmt_vec[cdi] = stmt_seen;
				++cdi;
				cd = 0;
				stmt_seen = 0;
				//SYM -- tn stuff removed
			} break;
case 224:
# line 2227 "gram.y"
{	Pname n = name_unlist(cd);
				Pstmt ss = stmt_unlist(yypvt[-1].sl);
				yyval.p = new block(yypvt[-3].l,n,ss,yypvt[-0].l);
				//SYM -- tn stuff removed
				cd = cd_vec[--cdi];
				stmt_seen = stmt_vec[cdi];
				if (cdi < 0) error('i',"block level(%d)",cdi);
				NOT_EXPECT_ID();
				yyval.ps->k_tbl = Ctbl;//SYM
                        	POP_SCOPE();//SYM
			} break;
case 225:
# line 2239 "gram.y"
{ yyval.p = new block(yypvt[-1].l,0,0,yypvt[-0].l); NOT_EXPECT_ID();
			  if ( Ctbl->k_id == ARG ) POP_SCOPE();//SYM
			} break;
case 226:
# line 2243 "gram.y"
{ yyval.p = new block(yypvt[-2].l,0,0,yypvt[-0].l); NOT_EXPECT_ID();
			  if ( Ctbl->k_id == ARG ) POP_SCOPE();//SYM
			} break;
case 227:
# line 2249 "gram.y"
{	yyval.p = new estmt(SM,curloc,yypvt[-0].pe,0);	} break;
case 228:
# line 2251 "gram.y"
{	yyval.p = new stmt(BREAK,yypvt[-0].l,0); } break;
case 229:
# line 2253 "gram.y"
{	yyval.p = new stmt(CONTINUE,yypvt[-0].l,0); } break;
case 230:
# line 2255 "gram.y"
{	yyval.p = new lstmt(GOTO,yypvt[-1].l,yypvt[-0].pn,0); } break;
case 231:
# line 2256 "gram.y"
{ stmt_seen=1; } break;
case 232:
# line 2257 "gram.y"
{	yyval.p = new estmt(DO,yypvt[-4].l,yypvt[-0].pe,yypvt[-2].ps); } break;
case 233:
# line 2259 "gram.y"
{	
				if (stmt_seen)
					yyval.p = new estmt(ASM,curloc,(Pexpr)yypvt[-1].s,0);
				else {
					Pname n = new name(make_name('A'));
					n->tp = new basetype(ASM,(Pname)yypvt[-1].s);
					if (cd)
						cd->add_list(n);
					else
						cd = new nlist(n);
					yyval.p = 0;
				}
			} break;
case 234:
# line 2274 "gram.y"
{
			if ( NEXTTOK() != SM ) {
				error("`;' missing afterS");
				la_backup(yychar,yylval);
				yychar = SM;
			}
		  } break;
case 237:
# line 2285 "gram.y"
{	yyval.p = new estmt(SM,curloc,dummy,0); } break;
case 238:
# line 2287 "gram.y"
{	yyval.p = new estmt(RETURN,yypvt[-2].l,yypvt[-1].pe,0); } break;
case 239:
# line 2289 "gram.y"
{
				error("local linkage specification");
				yyval.p = yypvt[-0].pn;
			} break;
case 240:
# line 2294 "gram.y"
{	Pname n = yypvt[-0].pn;
				if (n) {
//error('d',"adding local dcl of%n%t ll %d in_typedef%t",n,n->tp,n->lex_level,in_typedef);
					if (stmt_seen) {
						yyval.p = new block(n->where,n,0);
						yyval.ps->base = DCL;
						yyval.ps->k_tbl = Ctbl;//SYM
					}
					else {
						if (cd)
							cd->add_list(n);
						else
							cd = new nlist(n);
						yyval.p = 0;
					}
				} // if n
				else if (stmt_seen) {
					yyval.p = new block(curloc,0,0);
					yyval.ps->base = FDCL;
				}
			} break;
case 241:
# line 2316 "gram.y"
{
				Pname n = yypvt[-0].pn;
				if (!templp->in_progress)
					error(&n->where,"%n's definition is nested (did you forget a ``}''?)",n);
				if (cd)
					cd->add_list(n);
				else
					cd = new nlist(n);
				yyval.p = 0;
			} break;
case 243:
# line 2328 "gram.y"
{	yyval.p = new ifstmt(yypvt[-2].l,yypvt[-1].pe,yypvt[-0].ps,0); } break;
case 244:
# line 2330 "gram.y"
{	yyval.p = new ifstmt(yypvt[-4].l,yypvt[-3].pe,yypvt[-2].ps,yypvt[-0].ps); } break;
case 245:
# line 2332 "gram.y"
{	yyval.p = new estmt(WHILE,yypvt[-2].l,yypvt[-1].pe,yypvt[-0].ps); } break;
case 246:
# line 2333 "gram.y"
{ stmt_seen=1; } break;
case 247:
# line 2334 "gram.y"
{	yyval.p = new forstmt(yypvt[-8].l,yypvt[-5].ps,yypvt[-4].pe,yypvt[-2].pe,yypvt[-0].ps); } break;
case 248:
# line 2335 "gram.y"
{ scd[++scdp] = cd;} break;
case 249:
# line 2336 "gram.y"
{	
				--scdp;
				yyval.p = new estmt(SWITCH,yypvt[-3].l,yypvt[-1].pe,yypvt[-0].ps); 
			} break;
case 250:
# line 2340 "gram.y"
{ yyval.p = yypvt[-1].pn; stmt_seen=1; } break;
case 251:
# line 2341 "gram.y"
{	Pname n = yypvt[-1].pn;
				yyval.p = new lstmt(LABEL,n->where,n,yypvt[-0].ps);
			} break;
case 252:
# line 2344 "gram.y"
{ yyval.p = new name(yypvt[-1].pn->string); stmt_seen=1; } break;
case 253:
# line 2345 "gram.y"
{	Pname n = yypvt[-1].pn;
				yyval.p = new lstmt(LABEL,n->where,n,yypvt[-0].ps);
			} break;
case 254:
# line 2348 "gram.y"
{ stmt_seen=1; } break;
case 255:
# line 2349 "gram.y"
{	
				if (scdp>=0 && scd[scdp]!=cd && cd && decl_with_init(cd)) error("jump past initializer (did you forget a '{ }'?)");
				if (yypvt[-2].pe == dummy) error("empty case label");
				yyval.p = new estmt(CASE,yypvt[-4].l,yypvt[-2].pe,yypvt[-0].ps);
			} break;
case 256:
# line 2354 "gram.y"
{ stmt_seen=1; } break;
case 257:
# line 2355 "gram.y"
{	
				if (scdp>=0 && scd[scdp]!=cd && cd && yypvt[-1].pe && decl_with_init(cd)) error("jump past initializer (did you forget a '{ }'?)");
				yyval.p = new stmt(DEFAULT,yypvt[-3].l,yypvt[-0].ps); 
			} break;
case 258:
# line 2360 "gram.y"
{ yyval.p = new handler( yypvt[-1].ps, stmt_unlist(yypvt[-0].sl) ); } break;
case 259:
# line 2365 "gram.y"
{ yyval.sl = 0; } break;
case 260:
# line 2367 "gram.y"
{	
				if (yypvt[-0].ps)
					if (yypvt[-1].sl)
						yypvt[-1].sl->add(yypvt[-0].ps);
					else {
						yyval.sl =  new slist(yypvt[-0].ps);
						stmt_seen = 1;
					}
			} break;
case 261:
# line 2379 "gram.y"
{
			    if ( yypvt[-1].pn ) {
				yypvt[-1].pn->n_list = yypvt[-0].ps->d;
				yypvt[-0].ps->d = yypvt[-1].pn;
			    }
			    yyval.ps = yypvt[-0].ps;
			} break;
case 262:
# line 2390 "gram.y"
{	in_arg_list = 0;
				yyval.pn = Ndata(yypvt[-2].p,yypvt[-1].pn);
				if ( yyval.pn->string == 0 )
					yyval.pn = 0;
				else
					yyval.pn->base = CATCH;
			} break;
case 263:
# line 2398 "gram.y"
{ yyval.pn = 0; } break;
case 264:
# line 2405 "gram.y"
{	Pexpr e = expr_unlist(yypvt[-0].el);
				while (e && e->e1==dummy) {
					register Pexpr ee2 = e->e2;
					if (ee2) error("EX inEL");
					delete e;
					e = ee2;
				}
				yyval.p = e;
			} break;
case 265:
# line 2417 "gram.y"
{	yyval.el = new elist(new expr(ELIST,yypvt[-0].pe,0)); } break;
case 266:
# line 2419 "gram.y"
{	yypvt[-2].el->add(new expr(ELIST,yypvt[-0].pe,0)); } break;
case 268:
# line 2424 "gram.y"
{
  			  	if ( in_arg_list ) 
       			  		error( "syntax error: IrL not permitted in AL" );
				else if ( in_binit_list )
					error( "syntax error: IrL not permitted inMIr" );
  			  	else 
					init_seen = 1;
				Pexpr e;
				if (yypvt[-1].p)
					e = yypvt[-1].pe;
				else
					e = new expr(ELIST,dummy,0);
				yyval.p = new expr(ILIST,e,0);
			} break;
case 269:
# line 2441 "gram.y"
{	bbinop:	yyval.p = new expr(yypvt[-1].t,yypvt[-2].pe,yypvt[-0].pe); } break;
case 270:
# line 2442 "gram.y"
{	goto bbinop; } break;
case 271:
# line 2443 "gram.y"
{	goto bbinop; } break;
case 272:
# line 2444 "gram.y"
{	goto bbinop; } break;
case 273:
# line 2445 "gram.y"
{	goto bbinop; } break;
case 274:
# line 2446 "gram.y"
{	goto bbinop; } break;
case 275:
# line 2447 "gram.y"
{	goto bbinop; } break;
case 276:
# line 2448 "gram.y"
{ 	goto bbinop; } break;
case 277:
# line 2449 "gram.y"
{	goto bbinop; } break;
case 278:
# line 2450 "gram.y"
{	goto bbinop; } break;
case 279:
# line 2451 "gram.y"
{	goto bbinop; } break;
case 280:
# line 2452 "gram.y"
{	goto bbinop; } break;
case 281:
# line 2453 "gram.y"
{	goto bbinop; } break;
case 282:
# line 2454 "gram.y"
{	goto bbinop; } break;
case 283:
# line 2455 "gram.y"
{	goto bbinop; } break;
case 284:
# line 2456 "gram.y"
{	goto bbinop; } break;
case 285:
# line 2457 "gram.y"
{	goto bbinop; } break;
case 286:
# line 2459 "gram.y"
{	yyval.p = new qexpr(yypvt[-4].pe,yypvt[-2].pe,yypvt[-0].pe); } break;
case 287:
# line 2461 "gram.y"
{	yyval.p = new expr(yypvt[-1].t,yypvt[-2].pe,yypvt[-0].pe); } break;
case 288:
# line 2463 "gram.y"
{ yyval.p = new expr(DELETE,yypvt[-0].pe,0); } break;
case 289:
# line 2465 "gram.y"
{
				if(yypvt[-2].pe != dummy) {
					if ( warning_opt || strict_opt )
						error(strict_opt?0:'w',"v in `delete[v]' is redundant; use `delete[] instead (anachronism)");
				}
				yyval.p = new expr(DELETE,yypvt[-0].pe,yypvt[-2].pe);
			} break;
case 290:
# line 2473 "gram.y"
{	yyval.p = new expr(GDELETE,yypvt[-0].pe,0); } break;
case 291:
# line 2475 "gram.y"
{
				if(yypvt[-2].pe != dummy) { 
					if ( warning_opt || strict_opt )
						error(strict_opt?0:'w',"v in `::delete[v]' is redundant; use `::delete[] instead (anachronism)");
				}
				yyval.p = new expr(DELETE,yypvt[-0].pe,yypvt[-2].pe);
			} break;
case 293:
# line 2484 "gram.y"
{ yyval.p = dummy; } break;
case 294:
# line 2488 "gram.y"
{	binop:	yyval.p = new expr(yypvt[-1].t,yypvt[-2].pe,yypvt[-0].pe); } break;
case 295:
# line 2489 "gram.y"
{	goto binop; } break;
case 296:
# line 2490 "gram.y"
{	goto binop; } break;
case 297:
# line 2491 "gram.y"
{	goto binop; } break;
case 298:
# line 2492 "gram.y"
{	goto binop; } break;
case 299:
# line 2493 "gram.y"
{	goto binop; } break;
case 300:
# line 2494 "gram.y"
{	goto binop; } break;
case 301:
# line 2495 "gram.y"
{ 	goto binop; } break;
case 302:
# line 2496 "gram.y"
{	goto binop; } break;
case 303:
# line 2497 "gram.y"
{	goto binop; } break;
case 304:
# line 2498 "gram.y"
{	goto binop; } break;
case 305:
# line 2499 "gram.y"
{	goto binop; } break;
case 306:
# line 2500 "gram.y"
{	goto binop; } break;
case 307:
# line 2501 "gram.y"
{	goto binop; } break;
case 308:
# line 2502 "gram.y"
{	goto binop; } break;
case 309:
# line 2503 "gram.y"
{	goto binop; } break;
case 310:
# line 2504 "gram.y"
{	goto binop; } break;
case 311:
# line 2506 "gram.y"
{	yyval.p = new qexpr(yypvt[-4].pe,yypvt[-2].pe,yypvt[-0].pe); } break;
case 312:
# line 2508 "gram.y"
{	yyval.p = new expr(yypvt[-1].t,yypvt[-2].pe,yypvt[-0].pe); } break;
case 313:
# line 2510 "gram.y"
{	yyval.p = new expr(DELETE,yypvt[-0].pe,0); } break;
case 314:
# line 2512 "gram.y"
{
				if(yypvt[-2].pe != dummy) {
					if ( warning_opt || strict_opt )
						error(strict_opt?0:'w',"v in `delete[v]' is redundant; use `delete[] instead (anachronism)");
				}
				yyval.p = new expr(DELETE,yypvt[-0].pe,yypvt[-2].pe);
			} break;
case 315:
# line 2520 "gram.y"
{	yyval.p = new expr(GDELETE,yypvt[-0].pe,0); } break;
case 316:
# line 2522 "gram.y"
{
				if(yypvt[-2].pe != dummy) {
					if ( warning_opt || strict_opt )
						error(strict_opt?0:'w',"v in `::delete[v]' is redundant; use `::delete[] instead (anachronism)");
				}
				yyval.p = new expr(DELETE,yypvt[-0].pe,yypvt[-2].pe);
			} break;
case 317:
# line 2529 "gram.y"
{ 
			init_seen = 0; 
			} break;
case 318:
# line 2533 "gram.y"
{ yyval.p = dummy; } break;
case 319:
# line 2535 "gram.y"
{	yyval.p = dummy; } break;
case 320:
# line 2538 "gram.y"
{ goto new1; } break;
case 321:
# line 2540 "gram.y"
{	new1:
				Ptype t = yypvt[-0].pn->tp;
				yyval.p = new texpr(NEW,t,0);
				--in_new;
			} break;
case 322:
# line 2545 "gram.y"
{ goto new3; } break;
case 323:
# line 2547 "gram.y"
{	new3:
				Ptype t = yypvt[-0].pn->tp;
 				yyval.p = new texpr(GNEW,t,0);
				--in_new;
 			} break;
case 324:
# line 2553 "gram.y"
{	yyval.p = new expr(yypvt[-0].t,yypvt[-1].pe,0); } break;
case 325:
# line 2555 "gram.y"
{
				yyval.p = new texpr(CAST,yypvt[-1].pn->tp,yypvt[-0].pe);
			} break;
case 326:
# line 2559 "gram.y"
{	yyval.p = new expr(DEREF,yypvt[-0].pe,0); } break;
case 327:
# line 2561 "gram.y"
{	yyval.p = new expr(ADDROF,0,yypvt[-0].pe); } break;
case 328:
# line 2563 "gram.y"
{	yyval.p = new expr(UMINUS,0,yypvt[-0].pe); } break;
case 329:
# line 2565 "gram.y"
{	yyval.p = new expr(UPLUS,0,yypvt[-0].pe); } break;
case 330:
# line 2567 "gram.y"
{	yyval.p = new expr(NOT,0,yypvt[-0].pe); } break;
case 331:
# line 2569 "gram.y"
{	yyval.p = new expr(COMPL,0,yypvt[-0].pe); } break;
case 332:
# line 2571 "gram.y"
{	yyval.p = new expr(yypvt[-1].t,0,yypvt[-0].pe); } break;
case 333:
# line 2573 "gram.y"
{	
				yyval.p = new texpr(SIZEOF,0,yypvt[-0].pe); 
				--in_sizeof;
			} break;
case 334:
# line 2578 "gram.y"
{	
				yyval.p = new texpr(SIZEOF,yypvt[-0].pn->tp,0); 
				--in_sizeof;
			} break;
case 335:
# line 2583 "gram.y"
{	yyval.p = new expr(DEREF,yypvt[-3].pe,yypvt[-1].pe); } break;
case 336:
# line 2585 "gram.y"
{	yyval.p = new ref(REF,yypvt[-2].pe,yypvt[-0].pn); } break;
case 337:
# line 2587 "gram.y"
{
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(REF,yypvt[-3].pe,yypvt[-0].pn);
			} break;
case 338:
# line 2592 "gram.y"
{	yypvt[-0].pn = new name(yypvt[-0].pn->string);
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(REF,yypvt[-3].pe,yypvt[-0].pn);
			} break;
case 339:
# line 2597 "gram.y"
{	yyval.p = new ref(REF,yypvt[-2].pe,yypvt[-0].pn); } break;
case 340:
# line 2599 "gram.y"
{ // kluge to handle parameterized qualifiers, since
			  //    they are not included in MEMQ
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(REF,yypvt[-3].pe,yypvt[-0].pn);
				if ( yypvt[-1].pn && yypvt[-1].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();
			} break;
case 341:
# line 2607 "gram.y"
{ // kluge to handle parameterized qualifiers, since
			  //    they are not included in MEMQ
				yypvt[-0].pn = new name(yypvt[-0].pn->string);
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(REF,yypvt[-3].pe,yypvt[-0].pn);
				if ( yypvt[-1].pn && yypvt[-1].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();
			} break;
case 342:
# line 2616 "gram.y"
{	yyval.p = new ref(DOT,yypvt[-2].pe,yypvt[-0].pn); } break;
case 343:
# line 2618 "gram.y"
{
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(DOT,yypvt[-3].pe,yypvt[-0].pn);
			} break;
case 344:
# line 2623 "gram.y"
{	yypvt[-0].pn = new name(yypvt[-0].pn->string);
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(DOT,yypvt[-3].pe,yypvt[-0].pn);
			} break;
case 345:
# line 2628 "gram.y"
{	yyval.p = new ref(DOT,yypvt[-2].pe,yypvt[-0].pn); } break;
case 346:
# line 2630 "gram.y"
{ // kluge to handle parameterized qualifiers, since
			  //    they are not included in MEMQ
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(DOT,yypvt[-3].pe,yypvt[-0].pn);
				if ( yypvt[-1].pn && yypvt[-1].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();
			} break;
case 347:
# line 2638 "gram.y"
{ // kluge to handle parameterized qualifiers, since
			  //    they are not included in MEMQ
				yypvt[-0].pn = new name(yypvt[-0].pn->string);
				yypvt[-0].pn->n_qualifier = yypvt[-1].pn;
				yyval.p = new ref(DOT,yypvt[-3].pe,yypvt[-0].pn);
				if ( yypvt[-1].pn && yypvt[-1].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();
			} break;
case 349:
# line 2648 "gram.y"
{ // set scope to parse 'C::operator N' where N is in C
			  // still does not handle 'p->operator N'
			  //     (requires either fancier structures or 
			  //     on-the-fly type checking)
				yyval.p = Ncopy(yypvt[-0].pn);
				yyval.pn->n_qualifier = yypvt[-1].pn;
				if ( yypvt[-1].pn && yypvt[-1].pn->n_template_arg != template_type_formal )
					UNSET_SCOPE();
			} break;
case 350:
# line 2658 "gram.y"
{
				yyval.p = dummy_dtor();
				yyval.pn->n_qualifier = yypvt[-2].pn;
				yyval.pn->n_dtag = yypvt[-0].pn;
			} break;
case 351:
# line 2664 "gram.y"
{	
				yyval.p = dummy_dtor( yypvt[-0].t, yypvt[-0].t );
				yyval.pn->n_qualifier = yypvt[-2].pn;
			} break;
case 352:
# line 2669 "gram.y"
{
			if ( init_seen )
     				error( "syntax error:IrL illegal within ()");
			} break;
case 353:
# line 2675 "gram.y"
{
				if ( yypvt[-1].p == dummy )
					error("syntax error: nullE");
				yyval.p = yypvt[-1].p;
			} break;
case 354:
# line 2681 "gram.y"
{	yyval.p = zero; } break;
case 355:
# line 2683 "gram.y"
{	yyval.p = new expr(ICON,0,0);
				yyval.pe->string = copy_if_need_be(yypvt[-0].s);
			} break;
case 356:
# line 2687 "gram.y"
{	yyval.p = new expr(FCON,0,0);
				yyval.pe->string = copy_if_need_be(yypvt[-0].s);
			} break;
case 357:
# line 2691 "gram.y"
{	yyval.p = new expr(STRING,0,0);
				yyval.pe->string = copy_if_need_be(yypvt[-0].s);
			} break;
case 358:
# line 2695 "gram.y"
{	yyval.p = new expr(CCON,0,0);
				yyval.pe->string = copy_if_need_be(yypvt[-0].s);
			} break;
case 359:
# line 2699 "gram.y"
{	yyval.p = new expr(THIS,0,0); } break;
case 360:
# line 2703 "gram.y"
{	
				yyval.p = dummy_dtor();
				yyval.pn->n_dtag = yypvt[-0].pn; // checked later
			} break;
case 361:
# line 2708 "gram.y"
{	
				yyval.p = dummy_dtor();
				yyval.pn->n_qualifier = yypvt[-2].pn; // checked later
				yyval.pn->n_dtag = yypvt[-0].pn; // checked later
			} break;
case 362:
# line 2714 "gram.y"
{ yyval.p = dummy_dtor(yypvt[-3].t,yypvt[-0].t); } break;
case 363:
# line 2716 "gram.y"
{ yyval.p = dummy_dtor(yypvt[-0].t,yypvt[-0].t); } break;
case 364:
# line 2718 "gram.y"
{	
				yyval.p = dummy_dtor( yypvt[-3].t, yypvt[-3].t );
				yyval.pn->n_dtag = yypvt[-0].pn;
			} break;
case 365:
# line 2723 "gram.y"
{
				yyval.p = dummy_dtor( yypvt[-0].t, yypvt[-0].t );
				yyval.pn->n_qualifier = yypvt[-2].pn;
			} break;
case 366:
# line 2728 "gram.y"
{ // kluge to parse parameterized qualifiers after ./->
				yyval.p = dummy_dtor();
				yyval.pn->n_qualifier = yypvt[-2].pn;
				yyval.pn->n_dtag = yypvt[-0].pn;
			} break;
case 367:
# line 2734 "gram.y"
{ // kluge to parse parameterized qualifiers after ./->
				yyval.p = dummy_dtor( yypvt[-0].t, yypvt[-0].t );
				yyval.pn->n_qualifier = yypvt[-2].pn;
			} break;
case 368:
# line 2741 "gram.y"
{ 	yyval.p = new texpr(VALUE,tok_to_type(yypvt[-3].t),yypvt[-1].pe); } break;
case 369:
# line 2746 "gram.y"
{	
				yyval.p = new texpr(VALUE,yypvt[-3].pn->tp,yypvt[-1].pe); 
				if (yypvt[-3].pn->is_template_arg() && yypvt[-3].pn->tp->base == ANY) {
					yyval.pe->tp2 = new basetype(TYPE,yypvt[-3].pn);
				}
			} break;
case 370:
# line 2752 "gram.y"
{ goto new2; } break;
case 371:
# line 2754 "gram.y"
{	new2:
				Ptype t = yypvt[-0].pn->tp;
				yyval.p=new texpr(NEW,t,0);
				yyval.pe->e2 = yypvt[-2].pe;
				--in_new;
			} break;
case 372:
# line 2760 "gram.y"
{ goto new4; } break;
case 373:
# line 2762 "gram.y"
{	new4:
				Ptype t = yypvt[-0].pn->tp;
				yyval.p = new texpr(GNEW,t,0);
				yyval.pe->e2 = yypvt[-2].pe;
				--in_new;
			} break;
case 374:
# line 2769 "gram.y"
{	
				Pexpr ee = yypvt[-1].pe;
				Pexpr e = yypvt[-3].pe;
				if (e->base==NEW || e->base==GNEW)
					e->e1 = ee;
				else
					yyval.p = new call(e,ee);
			} break;
case 375:
# line 2781 "gram.y"
{
			yyval.pn = parametrized_typename(yypvt[-3].pn,(expr_unlist(yypvt[-1].el))); 
	 	 } break;
case 376:
# line 2786 "gram.y"
{ yyval.pn = yypvt[-0].pn; } break;
case 377:
# line 2787 "gram.y"
{ yyval.pn = sta_name; } break;
case 378:
# line 2788 "gram.y"
{ yyval.pn = yypvt[-1].pn; } break;
case 379:
# line 2793 "gram.y"
{
				if ( in_arg_list && !in_binit_list ) {
				    Pktab tb = Ctbl;
				    for (; tb && tb->k_id==ARG; tb=tb->k_next) {
					if ( tb->look(yypvt[-0].pn->string,0) ) {
						error("illegalR toA%n in defaultA",yypvt[-0].pn);
						yypvt[-0].pe = dummy;
						break;
					}
				    }
				}
				yyval.p = yypvt[-0].pn;
			} break;
case 380:
# line 2807 "gram.y"
{	yyval.p = new name(oper_name(yypvt[-0].t));
				yyval.pn->n_oper = yypvt[-0].t;
			} break;
case 381:
# line 2811 "gram.y"
{	yyval.p = yypvt[-0].p;
				sig_name(yyval.pn);
			} break;
case 382:
# line 2820 "gram.y"
{
				yyval.p = Ncast(yypvt[-2].p,yypvt[-1].pn);
			} break;
case 383:
# line 2825 "gram.y"
{ check_cast(); } break;
case 384:
# line 2829 "gram.y"
{
				TOK t = yypvt[-0].t;

				switch (t) {
				case FRIEND:
				case OVERLOAD:
				case REGISTER:
				case STATIC:
				case EXTERN:
				case AUTO:
				case VIRTUAL:
					error("%k in operatorT",t);
					t = INT;
					
				}

				yyval.p = new basetype(t,0);

			} break;
case 385:
# line 2848 "gram.y"
{ yyval.p = new basetype(TYPE,yypvt[-0].pn); } break;
case 386:
# line 2850 "gram.y"
{ 
				if ( DECL_TYPE != -1 ) {
					switch (yypvt[-1].pb->base) { 
					case COBJ: case EOBJ:
						{
						Pbase bt;
						bt = new basetype(0,0);
						*bt = *yypvt[-1].pb;
						DEL(yypvt[-1].pb);
						yypvt[-1].pb = bt;
						}
					}
					yyval.p = yypvt[-1].pb->type_adj(yypvt[-0].t); 
				}
				DECL_TYPE = 0;
			} break;
case 387:
# line 2867 "gram.y"
{ 
				if ( DECL_TYPE != -1 ) 
			 		yyval.p = yypvt[-1].pb->name_adj(yypvt[-0].pn);
				DECL_TYPE = 0;
			} break;
case 388:
# line 2874 "gram.y"
{ yyval.p = Ncast(yypvt[-1].p,yypvt[-0].pn); } break;
case 389:
# line 2877 "gram.y"
{ yyval.p = Ncast(yypvt[-1].p,yypvt[-0].pn); } break;
case 390:
# line 2880 "gram.y"
{	
                         //      ENTER_NAME(yypvt[-0].pn);
				yyval.p = Ndata(yypvt[-1].p,yypvt[-0].pn); 
			} break;
case 391:
# line 2885 "gram.y"
{
                        //      ENTER_NAME(yypvt[-1].pn);
                        } break;
case 392:
# line 2889 "gram.y"
{       
				yyval.p = Ndata(yypvt[-4].p,yypvt[-3].pn);
                                yyval.pn->n_initializer = yypvt[-0].pe;
                        } break;
case 393:
# line 2896 "gram.y"
{	PUSH_ARG_SCOPE();//SYM
				//SAVE_STATE();
				in_arg_list=1; 
				check_decl(); 
				yyval.pl = 0;
				//SYM -- tn stuff removed
			} break;
case 394:
# line 2906 "gram.y"
{
			yyval.p = new fct(0,name_unlist(yypvt[-3].nl),yypvt[-2].t); 
			if ( NEXTTOK() != COLON ) in_arg_list=0;
			//in_arg_list=0;
			Pfct(yyval.pt)->f_const = (yypvt[-0].i & 1);
			//SYM -- removed kluge
                        POP_SCOPE();//SYM
			//RESTORE_STATE();
		    } break;
case 395:
# line 2918 "gram.y"
{
				if (yypvt[-0].p)
					if (yypvt[-2].p)
						yypvt[-2].nl->add(yypvt[-0].pn);
					else {
						error("AD syntax");
						yyval.nl = new nlist(yypvt[-0].pn); 
					}
				else
					error("AD syntax");
			} break;
case 396:
# line 2930 "gram.y"
{
				if (yypvt[-0].p) yyval.nl = new nlist(yypvt[-0].pn); 
			} break;
case 398:
# line 2936 "gram.y"
{	yyval.p = 0; } break;
case 399:
# line 2940 "gram.y"
{	yyval.t = 1; } break;
case 400:
# line 2942 "gram.y"
{	yyval.t = ELLIPSIS; } break;
case 401:
# line 2944 "gram.y"
{	yyval.t = ELLIPSIS; } break;
case 402:
# line 2948 "gram.y"
{
			yyval.p = new ptr(PTR,0); 
			EXPECT_ID();
			} break;
case 403:
# line 2953 "gram.y"
{
			yyval.p = new ptr(RPTR,0); 
			EXPECT_ID();
			} break;
case 404:
# line 2958 "gram.y"
{	yyval.p = doptr(PTR,yypvt[-0].t); } break;
case 405:
# line 2960 "gram.y"
{	
				switch ( yypvt[-0].t ) {
				case CONST:
                                     yypvt[-1].pp->b_const = 1; break;
				case VOLATILE:
				     error('w',"\"volatile\" not implemented (ignored)");
				     break;
				default:
				    error( "syntax error: *%k", yypvt[-0].t );
				}
				yyval.p = yypvt[-1].pp; 
			} break;
case 406:
# line 2973 "gram.y"
{	yyval.p = doptr(RPTR,yypvt[-0].t); } break;
case 407:
# line 2975 "gram.y"
{	
				memptr_pn = yypvt[-1].pn;
				memptr_tok = 0;
				goto memptr1;
			} break;
case 408:
# line 2981 "gram.y"
{
			memptr_pn = yypvt[-0].pn;
			memptr_tok = 0;
			memptr1:
			if (memptr_tok)
				yyval.p = doptr(PTR,memptr_tok);
			else
				yyval.p = new ptr(PTR,0);
			Pname n = memptr_pn;
			if (n->is_template_arg()==0) {
				if(n->tp->skiptypedefs()->base != COBJ) {
				    yyval.pp->memof = 0;
				    error("P toM of nonCT");
				}
				else yyval.pp->memof = n->tp->skiptypedefs()->classtype();
			}
			else {
				yyval.pp->memof = 0;
				yyval.pp->ptname = n;
			}
			EXPECT_ID();
			} break;
case 409:
# line 3004 "gram.y"
{	
				memptr_pn = yypvt[-2].pn;
				memptr_tok = yypvt[-0].t;
				goto memptr1;
			} break;
case 410:
# line 3010 "gram.y"
{	
				memptr_pn = yypvt[-1].pn;
				memptr_tok = yypvt[-0].t;
				goto memptr1;
			} break;
case 411:
# line 3017 "gram.y"
{ yyval.p = new vec(0,yypvt[-1].pe!=dummy?yypvt[-1].pe:0 ); } break;
case 412:
# line 3018 "gram.y"
{ yyval.p = new vec(0,0); } break;
	}
	goto yystack;  /* stack new state and value */
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.