shithub: purgatorio

ref: a8083462e62459b2ae8a243dc4ba88416eba03b1

View raw version

#line	2	"limbo.y"
#include "limbo.h"

#line	5	"limbo.y"
typedef union 
{
	struct{
		Src	src;
		union{
			Sym	*idval;
			Long	ival;
			Real	rval;
		}v;
	}tok;
	Decl	*ids;
	Node	*node;
	Type	*type;
	Typelist *types;
} YYSTYPE;
extern	int	yyerrflag;
#ifndef	YYMAXDEPTH
#define	YYMAXDEPTH	150
#endif
YYSTYPE	yylval;
YYSTYPE	yyval;
#define	Landeq	57346
#define	Loreq	57347
#define	Lxoreq	57348
#define	Llsheq	57349
#define	Lrsheq	57350
#define	Laddeq	57351
#define	Lsubeq	57352
#define	Lmuleq	57353
#define	Ldiveq	57354
#define	Lmodeq	57355
#define	Lexpeq	57356
#define	Ldeclas	57357
#define	Lload	57358
#define	Loror	57359
#define	Landand	57360
#define	Lcons	57361
#define	Leq	57362
#define	Lneq	57363
#define	Lleq	57364
#define	Lgeq	57365
#define	Llsh	57366
#define	Lrsh	57367
#define	Lexp	57368
#define	Lcomm	57369
#define	Linc	57370
#define	Ldec	57371
#define	Lof	57372
#define	Lref	57373
#define	Lif	57374
#define	Lelse	57375
#define	Lfn	57376
#define	Lexcept	57377
#define	Lraises	57378
#define	Lmdot	57379
#define	Lto	57380
#define	Lor	57381
#define	Lrconst	57382
#define	Lconst	57383
#define	Lid	57384
#define	Ltid	57385
#define	Lsconst	57386
#define	Llabs	57387
#define	Lnil	57388
#define	Llen	57389
#define	Lhd	57390
#define	Ltl	57391
#define	Ltagof	57392
#define	Limplement	57393
#define	Limport	57394
#define	Linclude	57395
#define	Lcon	57396
#define	Ltype	57397
#define	Lmodule	57398
#define	Lcyclic	57399
#define	Ladt	57400
#define	Larray	57401
#define	Llist	57402
#define	Lchan	57403
#define	Lself	57404
#define	Ldo	57405
#define	Lwhile	57406
#define	Lfor	57407
#define	Lbreak	57408
#define	Lalt	57409
#define	Lcase	57410
#define	Lpick	57411
#define	Lcont	57412
#define	Lreturn	57413
#define	Lexit	57414
#define	Lspawn	57415
#define	Lraise	57416
#define	Lfix	57417
#define	Ldynamic	57418
#define YYEOFCODE 1
#define YYERRCODE 2

#line	1600	"limbo.y"


static	char	*mkfileext(char*, char*, char*);
static	void	usage(void);

static	int	dosym;
static	int	toterrors;
static	ulong	canonnanbits[] = { 0x7fffffff, 0xffffffff};
static	char*	infile;

#define SLASHMOD	"/module"

static char*
getroot(void)
{
	int n;
	char *e, *l, *s;

	if((e = getenv("EMU")) != nil){
		for(s = e; *e != '\0'; e++){
			if(*e == '-' && *(e+1) == 'r' && (e == s || *(e-1) == ' ' || *(e-1) == '\t')){
				e += 2;
				l = strchr(e, ' ');
				if(l != nil)
					*l = '\0';
				if((n = strlen(e)) > 0){
					s = malloc(n+1);
					strcpy(s, e);
					return s;
				}
			}
		}
	}
	if((e = getenv("ROOT")) != nil)
		return strdup(e);
	return nil;
}

void
main(int argc, char *argv[])
{
	char *s, *ofile, *ext, *root;
	int i;

	FPinit();
	FPcontrol(0, INVAL|ZDIV|OVFL|UNFL|INEX);
	canonnan = canontod(canonnanbits);

	fmtinstall('D', dotconv);
	fmtinstall('I', instconv);
	fmtinstall('K', declconv);
	fmtinstall('k', storeconv);
	fmtinstall('L', lineconv);
	fmtinstall('M', mapconv);
	fmtinstall('n', nodeconv);		/* exp structure */
	fmtinstall('O', opconv);
	fmtinstall('g', gfltconv);
	fmtinstall('Q', etconv);		/* src expression with type */
	fmtinstall('R', ctypeconv);		/* c equivalent type */
	fmtinstall('P', ctypeconv);		/* c equivalent type - pointer type */
	fmtinstall('T', typeconv);		/* source style types */
	fmtinstall('t', stypeconv);		/* structurally descriptive type */
	fmtinstall('U', srcconv);
	fmtinstall('v', expconv);		/* src expression */
	fmtinstall('V', expconv);		/* src expression in '' */
	lexinit();
	typeinit();
	optabinit();

	gendis = 1;
	asmsym = 0;
	maxerr = 20;
	ofile = nil;
	ext = nil;
	ARGBEGIN{
	case 'D':
		/*
		 * debug flags:
		 *
		 * a	alt compilation
		 * A	array constructor compilation
		 * b	boolean and branch compilation
		 * c	case compilation
		 * d	function declaration
		 * D	descriptor generation
		 * e	expression compilation
		 * E	addressable expression compilation
		 * f	print arguments for compiled functions
		 * F	constant folding
		 * g	print out globals
		 * m	module declaration and type checking
		 * n	nil references
		 * s	print sizes of output file sections
		 * S	type signing
		 * t	type checking function bodies
		 * T	timing
		 * v	global var and constant compilation
		 * x	adt verification
		 * Y	tuple compilation
		 * z Z	bug fixes
		 */
		s = ARGF();
		while(s && *s)
			debug[*s++] = 1;
		break;
	case 'I':
		s = ARGF();
		if(s == nil)
			usage();
		addinclude(s);
		break;
	case 'G':
		asmsym = 1;
		break;
	case 'S':
		gendis = 0;
		break;
	case 'a':
		emitstub = 1;
		break;
	case 'A':
		emitstub = emitdyn = 1;
		break;
	case 'c':
		mustcompile = 1;
		break;
	case 'C':
		dontcompile = 1;
		break;
	case 'e':
		maxerr = 1000;
		break;
	case 'f':
		isfatal = 1;
		break;
	case 'F':
		newfnptr = 1;
		break;
	case 'g':
		dosym = 1;
		break;
	case 'i':
		dontinline = 1;
		break;
	case 'o':
		ofile = ARGF();
		break;
	case 'O':
		optims = 1;
		break;
	case 's':
		s = ARGF();
		if(s != nil)
			fixss = atoi(s);
		break;
	case 't':
		emittab = ARGF();
		if(emittab == nil)
			usage();
		break;
	case 'T':
		emitcode = ARGF();
		if(emitcode == nil)
			usage();
		break;
	case 'd':
		emitcode = ARGF();
		if(emitcode == nil)
			usage();
		emitdyn = 1;
		break;
	case 'w':
		superwarn = dowarn;
		dowarn = 1;
		break;
	case 'x':
		ext = ARGF();
		break;
	case 'X':
		signdump = ARGF();
		break;
	case 'y':
		oldcycles = 1;
		break;
	case 'z':
		arrayz = 1;
		break;
	default:
		usage();
		break;
	}ARGEND

	if((root = getroot()) != nil){
		char *r;

		r = malloc(strlen(root)+strlen(SLASHMOD)+1);
		strcpy(r, root);
		strcat(r, SLASHMOD);
		addinclude(r);
		free(root);
	}
	else
		addinclude(INCPATH);

	if(argc == 0){
		usage();
	}else if(ofile != nil){
		if(argc != 1)
			usage();
		translate(argv[0], ofile, mkfileext(ofile, ".dis", ".sbl"));
	}else{
		if(ext == nil){
			ext = ".s";
			if(gendis)
				ext = ".dis";
		}
		for(i = 0; i < argc; i++){
			s = strrchr(argv[i], '/');
			if(s == nil)
				s = argv[i];
			else
				s++;
			if(argc > 1)
				print("%s:\n", argv[i]);
			ofile = mkfileext(s, ".b", ext);
			translate(argv[i], ofile, mkfileext(ofile, ext, ".sbl"));
		}
	}
	if(toterrors)
		exits("errors");
	exits(0);
}

static void
usage(void)
{
	fprint(2, "usage: limbo [-CGSacgwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ...\n");
	exits("usage");
}

static char*
mkfileext(char *file, char *oldext, char *ext)
{
	char *ofile;
	int n, n2;

	n = strlen(file);
	n2 = strlen(oldext);
	if(n >= n2 && strcmp(&file[n-n2], oldext) == 0)
		n -= n2;
	ofile = malloc(n + strlen(ext) + 1);
	memmove(ofile, file, n);
	strcpy(ofile+n, ext);
	return ofile;
}

void
translate(char *in, char *out, char *dbg)
{
	Decl *entry;
	int doemit;

	infile = in;
	outfile = out;
	symfile = dbg;
	errors = 0;
	bins[0] = Bopen(in, OREAD);
	if(bins[0] == nil){
		fprint(2, "can't open %s: %r\n", in);
		toterrors++;
		return;
	}
	doemit = emitstub || emittab || emitcode;
	if(!doemit){
		bout = Bopen(out, OWRITE);
		if(bout == nil){
			fprint(2, "can't open %s: %r\n", out);
			toterrors++;
			Bterm(bins[0]);
			return;
		}
		if(dosym){
			bsym = Bopen(dbg, OWRITE);
			if(bsym == nil)
				fprint(2, "can't open %s: %r\n", dbg);
		}
	}

	lexstart(in);

	popscopes();
	typestart();
	declstart();

	yyparse();

	entry = typecheck(!doemit);

	modcom(entry);

	fns = nil;
	nfns = 0;
	descriptors = nil;

	if(bout != nil)
		Bterm(bout);
	if(bsym != nil)
		Bterm(bsym);
	toterrors += errors;
	if(errors && bout != nil)
		remove(out);
	if(errors && bsym != nil)
		remove(dbg);
}

void
trapFPE(unsigned exception[5], int value[2])
{
	/* can't happen; it's just here to keep FPinit happy. */
	USED(exception);
	USED(value);
}

static char *
win2inf(char *s)
{
	int nt = 0;
	char *t;

	if(strlen(s) > 1 && s[1] == ':'){
		s[1] = '/';
		s++;
		nt = 1;
	}
	for(t = s; *t != '\0'; t++){
		if(*t == '\\')
			*t = '/';
		if(nt)
			*t = tolower(*t);
	}
	return s;
}

static char *
cleann(char *s)
{
	char *p, *r, *t;
	char buf[256];

	r = t = malloc(strlen(s)+1);
	strcpy(t, s);
	t = win2inf(t);
	if(*t != '/'){
		p = win2inf(getwd(buf, sizeof(buf)));
		s = malloc(strlen(p)+strlen(t)+2);
		strcpy(s, p);
		strcat(s, "/");
		strcat(s, t);
	}
	else{
		s = malloc(strlen(t)+1);
		strcpy(s, t);
	}
	free(r);
	/* print("cleann: %s\n", p); */
	return cleanname(s);
}

char *
srcpath(char *name, int nlen)
{
	int l1, l2;
	char *r, *srcp, *t;

	srcp = cleann(infile);
	r = getroot();
	if(r == nil){
		l1 = strlen(INCPATH);
		r = malloc(l1+1);
		strcpy(r, INCPATH);
		if(l1 >= strlen(SLASHMOD) && strcmp(r+l1-strlen(SLASHMOD), SLASHMOD) == 0)
			r[l1-strlen(SLASHMOD)] = '\0';
	}
	t = cleann(r);
	free(r);
	r = t;
	/* srcp relative to r */
	l1 = strlen(srcp);
	l2 = strlen(r);
	if(l1 >= l2 && strncmp(srcp, r, l2) == 0){
		/* nothing to do */
	}else
		l2 = 0;
	strncpy(name, srcp+l2, nlen);
	name[nlen-1] = '\0';
	free(r);
	free(srcp);
	/* print("srcpath: %s\n", name); */
	return name;
}
short	yyexca[] =
{-1, 1,
	1, -1,
	-2, 0,
-1, 3,
	1, 3,
	-2, 0,
-1, 17,
	39, 88,
	50, 62,
	54, 88,
	99, 62,
	-2, 251,
-1, 209,
	59, 29,
	71, 29,
	-2, 0,
-1, 228,
	1, 2,
	-2, 0,
-1, 272,
	50, 176,
	-2, 256,
-1, 306,
	59, 41,
	71, 41,
	91, 41,
	-2, 0,
-1, 308,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 377,
	50, 62,
	99, 62,
	-2, 251,
-1, 378,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 384,
	53, 71,
	54, 71,
	-2, 110,
-1, 386,
	53, 72,
	54, 72,
	-2, 112,
-1, 418,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 425,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 440,
	53, 71,
	54, 71,
	-2, 111,
-1, 441,
	53, 72,
	54, 72,
	-2, 113,
-1, 449,
	71, 278,
	99, 278,
	-2, 163,
-1, 466,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 483,
	50, 126,
	99, 126,
	-2, 240,
-1, 488,
	71, 275,
	-2, 0,
-1, 500,
	59, 47,
	71, 47,
	-2, 0,
-1, 505,
	59, 41,
	71, 41,
	91, 41,
	-2, 0,
-1, 511,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 545,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 551,
	71, 154,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 559,
	56, 59,
	62, 59,
	-2, 62,
-1, 565,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 570,
	71, 157,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 574,
	72, 176,
	-2, 163,
-1, 593,
	71, 160,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 599,
	71, 168,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 603,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 606,
	50, 62,
	56, 171,
	62, 171,
	99, 62,
	-2, 251,
};
#define	YYNPROD	283
#define	YYPRIVATE 57344
#define	YYLAST	2707
short	yyact[] =
{
 376, 588, 450, 361, 502, 381, 409, 308, 366, 312,
 356, 448, 446, 184,  83,  82, 429, 296, 269,  15,
   8,  49,   4, 101, 318,  12,  23, 109,  48,  77,
  78,  79, 196,  35,  51,  42, 541, 488, 360,   6,
 397,   3,   6, 456, 483, 379, 362,  14, 455,  21,
  14, 350, 420, 291, 347, 284, 117, 223,  31, 328,
 285, 224, 221,  46, 462, 111, 425, 424, 423,  11,
 427, 426, 428, 185, 163, 164, 165, 166, 167, 168,
 169, 170, 171, 172, 173, 174, 175, 104, 116,  43,
 181, 182, 183,  71,  10, 285, 203,  10, 206,  40,
 346, 419,  92, 285, 118, 346,  32,  32, 514, 113,
 292, 346, 292,  44, 285, 118, 417, 416, 415, 596,
 582, 544, 482, 229, 230, 231, 232, 233, 234, 235,
 236, 237, 238, 239, 240, 242, 243, 244, 245, 246,
 247, 248, 249, 250, 251, 252, 253, 254, 255, 256,
 257, 258, 259, 260, 261, 262, 263, 264, 185,   6,
 480, 272, 228, 306, 192, 193,  22,  14, 208, 270,
 479, 266,  22, 478, 192, 193, 435, 278, 562, 598,
 307, 283, 421, 556, 407, 563, 406, 286, 226, 200,
 192, 193, 287, 532, 268,  86, 215, 404, 412,  22,
 210, 207,  84, 216, 412,  89, 301,  98,  63, 527,
  93, 351, 227,  47,  10,  91,  81, 310, 309,  75,
  74,  69,  68,  73,  26,  18,  54,  55,  62,  60,
  61,  64, 460, 459, 295,  25, 100,  87,  88,  85,
  24, 303, 324,  65,  66,  67, 592, 111, 321, 316,
 311,  23, 569,  76, 554, 192, 193, 550, 533,  76,
 510, 522, 487, 465, 314, 396, 380,   6, 505,  86,
 213, 205, 577,  86, 492,  14,  84, 495, 476,  89,
  84,  98, 185,  89,  43, 464, 338, 395, 358,  91,
  81, 113, 281,  91,  81, 336, 181, 217, 209, 322,
 576, 536, 334, 323,  95, 382,  97,  94,  44, 192,
 193,  87,  88,  85,  33,  87,  88,  85, 378, 345,
 192, 193,  10,  86, 355, 354,  19,  76, 509, 390,
  84,  76, 214,  89, 386, 384, 388, 501, 212, 204,
 399, 280, 601,  91,  81, 484,  45, 389, 611, 561,
  18, 353,  45,   5, 537, 504,  18, 485, 192, 193,
 400, 401, 559, 497,  86,  87,  88,  85, 413, 191,
 540,  84, 418, 433,  89,   5, 185, 299,  22, 477,
 432,  76, 434, 430,  91,  81, 315, 431, 438, 436,
  19,  19, 289, 288, 504, 445, 449, 267, 338, 182,
 441, 440, 156, 411, 119, 314,  87,  88,  85, 103,
  17, 114,  19, 334,  18, 115, 107,  70, 192, 193,
  72,  19,  76, 470,   2, 466,  13, 475, 439, 473,
 192, 193,  17, 158, 484, 102,  18, 190,  75,  74,
  45, 114,  73,  86,  18, 115, 449, 507,  13,  90,
  84, 490,  90,  89, 601, 515, 490, 609, 486, 490,
 600, 494, 597,  91,  81, 594, 463, 591, 490, 185,
 490, 414, 474, 167, 585, 405, 571, 520, 490, 519,
 512, 513, 508, 403, 552,  87,  88,  85,  86, 449,
 524, 520, 526, 525, 327,  84, 222, 530,  89, 590,
 523,  76,  90,  39,  90, 529, 534, 490,  91,  81,
 105, 542,  90, 491, 565, 543, 538, 520,  36, 549,
  34, 398, 553,  90, 589, 496, 551, 394, 497, 333,
  87,  88,  85, 157, 330, 160, 199, 161, 162, 557,
 560, 438, 314, 198, 195, 178,  76, 159, 158, 567,
 443, 442, 574, 566, 572, 568, 570, 176, 474, 180,
 343, 329, 326, 179, 520, 225, 580, 342, 176, 581,
 297, 574, 177, 584, 140, 141, 137, 138, 139, 136,
 134, 558,  41, 546, 201, 411, 603, 593, 583, 545,
 383, 595, 474, 325, 574, 599, 602,  90, 220, 219,
 472, 604,  80, 608,  86,  96, 471, 610, 468, 422,
  39,  84, 474,  90,  89, 186,  90,  90,  19,  90,
 136, 134, 452, 134,  91,  81,  90,  29, 182, 167,
 137, 138, 139, 136, 134, 521, 357,  50, 535,  30,
  90,  90, 305, 365, 298, 120,  87,  88,  85,  27,
 474,   1,  52,  53, 451, 194, 461, 197,  59,  72,
 271,  28,  76,  57,  58, 202,  63, 143, 142, 140,
 141, 137, 138, 139, 136, 134, 218,  75,  74,  69,
  68,  73, 273,  18,  54,  55,  62,  60,  61,  64,
 313, 539,  50, 579, 578,  90, 410, 500, 499, 587,
 586,  65,  66,  67,  16, 408, 304,  52,  53,  56,
  90, 352,   9,  59,  72, 548,  90,  76,  57,  58,
 547,  63, 518, 517, 211,   7, 447, 335, 265, 503,
 368, 108,  75,  74,  69, 274,  73,  90,  18,  54,
  55,  62,  60,  61,  64, 106, 112,  90,  90, 110,
 282,  20,  37,  38, 277,  86, 275, 276,  67,   0,
  90,  90,  84,   0,  90,  89, 290,   0,   0, 293,
 294,   0,  76,   0,   0,  91,  81,   0,   0, 197,
   0,   0,   0,   0,   0,   0, 281,   0,   0,   0,
   0,   0,   0, 317, 320,   0,   0,  87,  88,  85,
   0,   0,   0,  90,   0,   0,   0,   0,  52,  53,
  56,   0,  90,  76,  59,  72,  90,   0,   0,  57,
  58,  90,  63,  90,   0,   0,   0,   0,   0,   0,
   0,   0,  90,  75,  74,  69,  68,  73,  90,  18,
  54,  55,  62,  60,  61,  64,   0,   0, 331,   0,
   0,   0,   0,   0,  86,   0,   0,  65,  66,  67,
   0,  84,   0, 344,  89,   0,  98,   0,   0, 348,
   0,   0,   0,  76,  91,  81,   0,  90,   0,   0,
   0,  90,   0,   0,   0,   0,   0,   0,   0,  95,
 387,  97,  94,  99,   0, 100,  87,  88,  85,   0,
 392, 393,  90,   0,   0,   0,   0,   0,   0,   0,
   0,   0,  76,   0,   0,  90,   0, 402, 122, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 135,   0, 155, 154, 153, 152, 151, 150, 148, 149,
 144, 145, 146, 147, 143, 142, 140, 141, 137, 138,
 139, 136, 134,   0, 340,   0, 194,  86,   0,   0,
   0,  86,   0,   0,  84, 444,   0,  89,  84, 453,
   0,  89,   0,   0, 457,   0, 458,  91,  81,   0,
 363,  91, 391,   0,   0,  96,   0,   0,   0,   0,
   0, 469,   0,   0,   0,  50,   0,   0,   0,  87,
  88,  85, 319,  87,  88,  85,   0,   0,   0,   0,
  52,  53,  56, 339,   0,  76,  59, 375,   0,  76,
   0,  57,  58,   0,  63, 367,   0,   0,   0,   0,
 493,   0,   0,   0, 498,  75,  74, 377,  68,  73,
   0,  18,  54,  55,  62,  60,  61,  64, 364, 506,
 363,   0,   0,  13,   0, 498,   0,   0,   0,  65,
  66,  67,   0,   0,   0,  50, 369,   0, 531,   0,
 370, 371, 374, 372, 373,  76,   0,   0,   0,   0,
  52,  53,  56,   0,   0,   0,  59, 375,   0,   0,
   0,  57,  58,   0,  63, 367,   0,   0,   0,   0,
   0,   0,   0,   0,   0,  75,  74, 377,  68,  73,
   0,  18,  54,  55,  62,  60,  61,  64, 364, 467,
 363,   0,   0,  13,   0,   0,   0,   0,   0,  65,
  66,  67,   0,   0,   0,  50, 369,   0,   0,   0,
 370, 371, 374, 372, 373,  76,   0,   0,   0,   0,
  52,  53,  56,   0,   0,   0,  59, 375,   0,   0,
   0,  57,  58,   0,  63, 367,   0,   0,   0,   0,
   0,   0,   0,   0,   0,  75,  74, 377,  68,  73,
   0,  18,  54,  55,  62,  60,  61,  64, 364, 437,
 363,   0,   0,  13,   0,   0,   0,   0,   0,  65,
  66,  67,   0,   0,   0,  50, 369,   0,   0,   0,
 370, 371, 374, 372, 373,  76,   0,   0,   0,   0,
  52,  53,  56,   0,   0,   0,  59, 375,   0,   0,
   0,  57,  58,   0,  63, 367,   0,   0,   0,   0,
   0,   0,   0,   0,   0,  75,  74, 377,  68,  73,
   0,  18,  54,  55,  62,  60,  61,  64, 364, 359,
 605,   0,   0,  13,   0,   0,   0,   0,   0,  65,
  66,  67,   0,   0,   0,  50, 369,   0,   0,   0,
 370, 371, 374, 372, 373,  76,   0,   0,   0,   0,
  52,  53, 607,   0,   0,   0,  59, 375,   0,   0,
   0,  57,  58,   0,  63, 367,   0,   0,   0,   0,
   0,   0,   0,   0,   0,  75,  74, 606,  68,  73,
   0,  18,  54,  55,  62,  60,  61,  64, 364, 573,
   0,   0,   0,  13,   0,   0,   0,   0,   0,  65,
  66,  67,   0,   0,  50,   0, 369,   0,   0,   0,
 370, 371, 374, 372, 373,  76,   0,   0,   0,  52,
  53, 451,   0,   0,   0,  59, 375,   0,   0,   0,
  57,  58,   0,  63, 367,   0,   0,   0,   0,   0,
   0,   0,   0,   0,  75,  74, 377,  68,  73,   0,
  18,  54,  55,  62,  60,  61,  64, 364, 363,   0,
   0,   0,  13,   0,   0,   0,   0,   0,  65,  66,
  67,   0,   0,  50,   0, 369,   0,   0,   0, 370,
 371, 374, 372, 373,  76,   0,   0,   0,  52,  53,
  56,   0,   0,   0,  59, 375,   0,   0,   0,  57,
  58,   0,  63, 367,   0,   0,   0,   0,   0,   0,
   0,   0,   0,  75,  74, 377,  68,  73,   0,  18,
  54,  55,  62,  60,  61,  64, 364,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,  65,  66,  67,
  50,   0,   0,   0, 369,   0,   0,   0, 370, 371,
 374, 372, 373,  76,   0,  52,  53,  56,   0,   0,
   0,  59,  72,   0,   0, 279,  57,  58,   0,  63,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  75,  74,  69,  68,  73,   0,  18,  54,  55,  62,
  60,  61,  64,   0, 241,   0,   0,   0,   0,   0,
   0,   0,   0,   0,  65,  66,  67,  50,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  76,   0,  52,  53,  56,   0,   0,   0,  59,  72,
   0,   0,   0,  57,  58,   0,  63,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,  75,  74,  69,
  68,  73,   0,  18,  54,  55,  62,  60,  61,  64,
   0,   0,  50,   0,   0,   0,   0,   0,   0,   0,
   0,  65,  66,  67,   0,   0,   0,  52,  53,  56,
   0,   0,   0,  59,  72,   0,   0,  76,  57,  58,
   0,  63,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,  75,  74,  69,  68,  73,   0,  18,  54,
  55,  62,  60,  61,  64,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,  65,  66,  67, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135,  76, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 564, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134, 153,
 152, 151, 150, 148, 149, 144, 145, 146, 147, 143,
 142, 140, 141, 137, 138, 139, 136, 134,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 555, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134, 151, 150, 148, 149, 144, 145,
 146, 147, 143, 142, 140, 141, 137, 138, 139, 136,
 134,   0,   0,   0, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 528, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134, 150,
 148, 149, 144, 145, 146, 147, 143, 142, 140, 141,
 137, 138, 139, 136, 134,   0,   0,   0,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 481, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134,   0,
   0,   0,   0,   0, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 349, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134, 144,
 145, 146, 147, 143, 142, 140, 141, 137, 138, 139,
 136, 134,   0,   0,   0,   0,   0,   0,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 341, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 302, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 300, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 189, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 188, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135, 187, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134,   0,
  86,   0,   0,   0,   0,   0,   0, 385,   0,   0,
  89,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  91,  81,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0, 121,   0,   0,   0,   0,   0,   0,   0,
   0,   0,  87,  88,  85, 122, 123, 124, 125, 126,
 127, 128, 129, 130, 131, 132, 133, 135,  76, 155,
 154, 153, 152, 151, 150, 148, 149, 144, 145, 146,
 147, 143, 142, 140, 141, 137, 138, 139, 136, 134,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0, 122, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 135, 575, 155, 154, 153, 152, 151, 150, 148, 149,
 144, 145, 146, 147, 143, 142, 140, 141, 137, 138,
 139, 136, 134,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0, 122, 123, 124, 125, 126, 127, 128, 129, 130,
 131, 132, 133, 135, 516, 155, 154, 153, 152, 151,
 150, 148, 149, 144, 145, 146, 147, 143, 142, 140,
 141, 137, 138, 139, 136, 134,   0,   0,   0, 122,
 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
 133, 135, 489, 155, 154, 153, 152, 151, 150, 148,
 149, 144, 145, 146, 147, 143, 142, 140, 141, 137,
 138, 139, 136, 134,   0,   0,   0, 337, 122, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 135,   0, 155, 154, 153, 152, 151, 150, 148, 149,
 144, 145, 146, 147, 143, 142, 140, 141, 137, 138,
 139, 136, 134,   0,   0,   0, 332, 122, 123, 124,
 125, 126, 127, 128, 129, 130, 131, 132, 133, 135,
   0, 155, 154, 153, 152, 151, 150, 148, 149, 144,
 145, 146, 147, 143, 142, 140, 141, 137, 138, 139,
 136, 134,   0, 511, 122, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 135,   0, 155, 154,
 153, 152, 151, 150, 148, 149, 144, 145, 146, 147,
 143, 142, 140, 141, 137, 138, 139, 136, 134,   0,
 454, 122, 123, 124, 125, 126, 127, 128, 129, 130,
 131, 132, 133, 135,   0, 155, 154, 153, 152, 151,
 150, 148, 149, 144, 145, 146, 147, 143, 142, 140,
 141, 137, 138, 139, 136, 134, 155, 154, 153, 152,
 151, 150, 148, 149, 144, 145, 146, 147, 143, 142,
 140, 141, 137, 138, 139, 136, 134
};
short	yypact[] =
{
 351,-1000, 319, 373,-1000, 168,-1000,-1000, 163, 152,
 645, 623,   8, 253, 470,-1000, 464, 541,-1000, 287,
 -36, 141,-1000,-1000,-1000,-1000,-1000,1585,1585,1585,
1585, 234, 579, 138, 815, 383, 350,   0, 460, 382,
-1000, 319,  16,-1000,-1000,-1000, 345,-1000,2270,-1000,
 343, 494, 776, 776, 776, 776, 776, 776, 776, 776,
 776, 776, 776, 776, 776, 527, 500, 518, 776, 162,
 776,-1000,1585,-1000,-1000,-1000, 576,2215,2160,2105,
 365,-1000,-1000,-1000, 234, 499, 234, 498, 491, 541,
-1000, 543,-1000,-1000, 234,1585, 267,1585, 129, 228,
 541, 268, 293, 541, 227, 234, 559, 558, -37,-1000,
 446,   7, -38,-1000,-1000,-1000, 523,-1000, 287,-1000,
 373,-1000,1585,1585,1585,1585,1585,1585,1585,1585,
1585,1585,1585,1585,1530,1585,1585,1585,1585,1585,
1585,1585,1585,1585,1585,1585,1585,1585,1585,1585,
1585,1585,1585,1585,1585,1585,1585,1585, 338, 381,
 675,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,1463, 281, 222, 234,
1585,-1000,-1000,-1000,  15,2647,1585,-1000,-1000,-1000,
-1000,1585, 334, 333, 377, 234,  13, 377, 234, 234,
 571, 565, 305,2050,-1000,1585,1995,-1000, 234, 640,
  93,-1000,-1000, 147, 287,-1000,-1000, 319, 377,-1000,
-1000, 352, 918, 918, 240,-1000,-1000,-1000, 373,2647,
2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,
2647,1585, 585,2647, 583, 583, 583, 583, 596, 596,
 542, 542, 637, 637, 637, 637,1953,1953,1900,1846,
1792,1739,1739,1685,2668, 553, -39,-1000, 379, 520,
 444, -40,2647,-1000, 776, 516, 489, 234,2534, 484,
 776,1585, 377,2495,-1000,1585, 914,1940, 526, 519,
 377,-1000, 234, 377, 377, 383,  12, 377, 234,-1000,
-1000,1885,-1000,  11, 140,-1000, 634, 218,1188,-1000,
-1000,   5, 195,-1000, 243, 550,-1000, 377,-1000,2271,
 377,-1000,-1000,-1000,2647,-1000,-1000,1585, 675, 922,
 716, 377, 482, 217,-1000, 194, -59, 476,2647,1585,
-1000,-1000, 565, 565, 377,-1000, 404,-1000, 377,-1000,
 125,-1000,-1000, 425, 114,-1000, 113,-1000, 319,-1000,
-1000,-1000, 421,  46,-1000,   2, 110, 570, -19, 324,
 324,1585,1585,1585, 104,1585,2647, 162,1118,-1000,
-1000, 319,-1000,-1000,-1000, 234,-1000, 377, 509, 508,
2647, 776, 377, 377, 325, 620,-1000,1585, 234,2610,
   6,   1, 377, 234,-1000, 156,-1000, -23,-1000,-1000,
-1000, 416, 215, 192, 230,-1000,-1000,-1000,1048, 569,
 234,-1000,1585, 567, 561,1396,1585, 208, 320, 101,
-1000,  98,  88,1830,  50,-1000,   4,-1000,-1000, 295,
-1000,-1000,-1000,-1000, 377, 620, 191, -62,-1000,2457,
 451, 776,-1000, 377,-1000,-1000,-1000, 377, 202, 234,
1585,-1000, 207, 449, 335, 198, 978, 396,1585, 256,
2573,1585,1585,  22, 405,2404, 620, 619,-1000,-1000,
-1000,-1000,-1000,-1000, 284,-1000, 190,-1000, 620,1585,
 620,1585,-1000, 137,1775, 319,1585, 234, 121, 187,
 636,-1000, 239, 298,-1000, 634,-1000, 311,  -4,-1000,
1585,1396,  49, 549, 544,-1000, 620, 186,-1000, 422,
2457,1585,-1000,-1000,2647,-1000,2647,-1000,-1000, 183,
1720, 111,-1000,-1000, 303, 296,-1000, 290, 107, 115,
-1000,-1000,1665, 466,1585,1396,1585, 181,-1000, 414,
-1000,1327,-1000,2351,-1000,-1000,-1000, 238, 384,-1000,
 210,-1000,-1000, 620,-1000,1396,  48,-1000, 548,-1000,
1327,-1000, 412,  46,2457, 465,-1000,-1000, 175,-1000,
 403,-1000,1585,  47, 400,-1000, 108,-1000, 398,-1000,
-1000,-1000,-1000,1327,-1000, 546,-1000,-1000,-1000,1258,
-1000, 465, 395,1396, 286,  46, 162, 776,-1000,-1000,
-1000,-1000
};
short	yypgo[] =
{
   0, 570, 753, 752,  33,  24, 417,  15,  14,  46,
 751, 749, 746,  32, 745, 731,  27, 730,  16,   4,
 729,  99,   8,   0,  21,  34,  13, 728, 727,  93,
  25,  69,  35,  12, 726,  11,   2,  38,  41,  22,
 725, 724,   3,   7, 723, 722, 720, 715, 712,  20,
 711, 706, 705,  10, 704, 700, 699,   1, 698, 697,
 696,   6,   5, 694, 693, 691,  19,  23, 690,   9,
 682,  18, 660, 656,  17, 651, 645, 643
};
short	yyr1[] =
{
   0,  76,  75,  75,  38,  38,  39,  39,  39,  39,
  39,  39,  39,  39,  39,  39,  39,  30,  30,  37,
  37,  37,  37,  37,  37,  37,  66,  66,  48,  51,
  51,  51,  50,  50,  50,  50,  50,  49,  49,  73,
  73,  53,  53,  53,  52,  52,  52,  62,  62,  61,
  61,  60,  58,  58,  58,  59,  59,  59,  19,  20,
  20,   9,  10,  10,   6,   6,  74,  74,  74,  74,
   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1,   1,   7,   7,   8,   8,  13,  13,  21,  21,
   2,   2,   2,   3,   3,   4,   4,  14,  14,  15,
  15,  16,  16,  16,  16,  11,  12,  12,  12,  12,
   5,   5,   5,   5,  40,  67,  67,  67,  41,  41,
  41,  54,  54,  43,  43,  43,  77,  77,  42,  42,
  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
  17,  17,  18,  18,  44,  45,  45,  46,  47,  47,
  63,  64,  64,  36,  36,  36,  36,  36,  55,  56,
  56,  57,  57,  57,  57,  22,  22,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,
  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
  24,  24,  24,  24,  24,  24,  24,  24,  25,  25,
  25,  25,  25,  25,  25,  25,  25,  25,  25,  25,
  25,  29,  29,  31,  72,  72,  71,  71,  70,  70,
  70,  70,  65,  65,  32,  32,  32,  32,  27,  27,
  28,  28,  26,  26,  33,  33,  34,  34,  35,  35,
  69,  68,  68
};
short	yyr2[] =
{
   0,   0,   5,   1,   1,   2,   2,   1,   1,   2,
   2,   4,   4,   4,   4,   4,   6,   1,   3,   3,
   5,   5,   4,   6,   5,   1,   4,   7,   6,   0,
   2,   1,   4,   2,   5,   5,   1,   8,  11,   0,
   4,   0,   2,   1,   1,   1,   5,   0,   2,   5,
   4,   4,   2,   2,   1,   2,   4,   4,   1,   1,
   3,   1,   1,   3,   6,   4,   1,   2,   3,   4,
   1,   1,   1,   3,   6,   2,   3,   3,   3,   3,
   4,   1,   1,   4,   3,   6,   1,   3,   0,   3,
   3,   3,   5,   1,   3,   1,   5,   0,   1,   1,
   3,   3,   3,   3,   3,   1,   1,   1,   3,   3,
   2,   3,   2,   3,   4,   4,   2,   0,   3,   2,
   4,   2,   4,   0,   2,   2,   3,   5,   2,   2,
   4,   3,   4,   6,   2,   5,   7,  10,   6,   8,
   3,   3,   3,   3,   3,   6,   5,   8,   2,   8,
   0,   2,   0,   1,   2,   2,   4,   2,   2,   4,
   2,   2,   4,   1,   3,   1,   3,   1,   2,   2,
   4,   1,   1,   3,   1,   0,   1,   1,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   4,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   1,   2,   2,   2,   2,   2,
   2,   2,   2,   2,   2,   2,   2,   2,   6,   8,
   7,   5,   3,   6,   4,   2,   2,   2,   1,   4,
   3,   3,   3,   4,   6,   2,   2,   1,   1,   1,
   6,   1,   1,   3,   1,   3,   1,   1,   1,   3,
   3,   2,   1,   0,   1,   1,   3,   3,   0,   1,
   1,   2,   1,   3,   1,   2,   1,   3,   1,   3,
   2,   2,   4
};
short	yychk[] =
{
-1000, -75,  73, -38, -39,   2, -37, -40, -49, -48,
 -29, -31, -30,  75,  -9, -66, -54,  59,  63,  39,
 -10,  -9,  59, -39,  72,  72,  72,   4,  16,   4,
  16,  50,  99,  61,  50,  -4,  54,  -3,  -2,  39,
 -21,  41, -32, -31, -29,  59,  99,  72, -23, -24,
  17, -25,  32,  33,  64,  65,  34,  43,  44,  38,
  67,  68,  66,  46,  69,  81,  82,  83,  60,  59,
  -6, -29,  39,  61,  58,  57,  97, -23, -23, -23,
  -1,  60,  -7,  -8,  46,  83,  39,  81,  82,  49,
  -6,  59, -31,  72,  77,  74,  -1,  76,  51,  78,
  80, -67,  52,  59,  87,  50, -14,  34, -15, -16,
 -11, -30, -12, -31,  59,  63,  -9,  40,  99,  59,
 -76,  72,   4,   5,   6,   7,   8,   9,  10,  11,
  12,  13,  14,  15,  38,  16,  37,  34,  35,  36,
  32,  33,  31,  30,  26,  27,  28,  29,  24,  25,
  23,  22,  21,  20,  19,  18,  59,  39,  54,  53,
  41,  43,  44, -24, -24, -24, -24, -24, -24, -24,
 -24, -24, -24, -24, -24, -24,  41,  45,  45,  45,
  41, -24, -24, -24, -26, -23,  39,  72,  72,  72,
  72,   4,  53,  54,  -1,  45, -13,  -1,  45,  45,
 -21,  41,  -1, -23,  72,   4, -23,  72,  39,  70,
 -21, -41,  70,   2,  39, -29, -21,  70,  -1,  40,
  40,  99,  50,  50,  99,  42, -31, -29, -38, -23,
 -23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
 -23,   4, -23, -23, -23, -23, -23, -23, -23, -23,
 -23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
 -23, -23, -23, -23, -23, -27, -26,  59, -25, -71,
 -22, -72, -23, -70,  60,  81,  82,  79, -23,  42,
  60,  70,  -1, -23,  40,  99, -23, -23,  59,  59,
  -1,  40,  99,  -1,  -1,  -4, -74,  -1,  79,  72,
  72, -23,  72, -13, -51,   2,  70,  87, -43,  71,
  70, -32, -69, -68,  -9,  34, -16,  -1,  -5,  84,
  -1,  -5,  59,  63, -23,  40,  42,  50,  99,  45,
  45,  -1,  42,  45, -24, -28, -26,  42, -23,  99,
  40,  72,  41,  41,  -1, -67,  99,  42,  -1,  72,
  40,  71, -50,  -9, -49, -66, -53,   2,  70,  71,
 -37, -42,  -9,   2,  70, -77, -22,  47, -17,  88,
  92,  93,  95,  96,  94,  39, -23,  59, -43,  40,
  71, -62,  62,  40,  -7,  46,  -8,  -1, -22, -71,
 -23,  60,  -1,  -1,  45,  70,  71,  99,  45, -23,
 -74, -74,  -1,  79,  72,  50,  72,  71, -52, -61,
 -60,  -9,  91, -69,  50,  72,  71,  70, -43,  99,
  50,  72,  39,  87,  86,  85,  90,  89,  91, -18,
  59, -18, -22, -23, -22,  72, -26,  71, -61,  -9,
  -7,  -8,  42,  42,  -1,  70, -33, -34, -35, -23,
 -36,  34,   2,  -1,  40,  42,  42,  -1,  -1,  77,
  76, -73,  87,  50,  70,  71, -43,  71,  39,  -1,
 -23,  39,  39, -42,  -9, -23,  70,  59,  72,  72,
  72,  72,  72,  40,  50,  62, -33,  71,  99,  55,
  56,  62,  72,  -1, -23,  70,  76,  79,  -1, -58,
 -59,   2, -19, -20,  59,  70,  71,  51, -26,  72,
   4,  40, -22, -22,  86,  50,  70, -44, -45, -36,
 -23,  16,  71, -35, -23, -36, -23,  72,  72, -69,
 -23,  -1,  72,  71, -62,   2,  62,  56, -53, -65,
  59,  40, -23, -42,  72,  40,  39, -46, -47, -36,
  71, -43,  62, -23,  71,  72,  72, -19,  -9,  59,
 -19,  59,  71,  70,  72,  48, -22, -42, -22,  71,
 -43,  62, -36,   2, -23,  70,  62,  62, -63, -64,
 -36, -42,  72,  40, -36,  62, -55, -56, -57,  59,
  34,   2,  71, -43,  62, -22,  72,  62,  71, -43,
  62,  56, -36,  40, -57,   2,  59,  34, -57,  62,
 -42,  62
};
short	yydef[] =
{
   0,  -2,   0,  -2,   4,   0,   7,   8,   0,   0,
   0,  17,   0,   0,   0,  25,   0,  -2, 252,   0,
  61,   0,  62,   5,   6,   9,  10,   0,   0,   0,
   0,   0,   0,   0,   0, 117,   0,  95,  93,  97,
 121,   0,   0, 264, 265, 251,   0,   1,   0, 177,
   0, 214,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 251,
   0, 238,   0, 247, 248, 249,   0,   0,   0,   0,
   0,  70,  71,  72,   0,   0,   0,   0,   0,  88,
  81,  82,  18,  19,   0,   0,   0,   0,   0,   0,
  88,   0,   0,  88,   0,   0,   0,   0,  98,  99,
   0,   0, 105,  17, 106, 107,   0, 253,   0,  63,
   0,  11,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0, 268,   0,   0,
 175, 245, 246, 215, 216, 217, 218, 219, 220, 221,
 222, 223, 224, 225, 226, 227,   0,   0,   0,   0,
   0, 235, 236, 237,   0, 272,   0,  13,  12,  14,
  15,   0,   0,   0,  75,   0,   0,  86,   0,   0,
   0,   0,   0,   0,  22,   0,   0,  26,   0,  -2,
   0, 114, 123,   0,   0, 116, 122,   0,  94,  90,
  91,   0,   0,   0,   0,  89, 266, 267,  -2, 178,
 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
 189,   0, 191, 192, 194, 195, 196, 197, 198, 199,
 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
 210, 211, 212, 213, 193,   0, 269, 241, 242, 254,
   0,   0,  -2, 257, 258,   0,   0,   0,   0,   0,
   0,   0, 232,   0, 240,   0,   0,   0,  73,  84,
  76,  77,   0,  78,  79, 117,   0,  66,   0,  20,
  21,   0,  24,   0,   0,  31,  -2,   0,  -2, 119,
 123,   0,   0,  47,   0,   0, 100, 101, 102,   0,
 103, 104, 108, 109, 190, 239, 243, 175,   0,   0,
   0, 261,   0,   0, 234,   0, 270,   0, 273,   0,
  65,  16,   0,   0,  87,  80,   0,  83,  67,  23,
   0,  28,  30,   0,   0,  36,   0,  43,   0, 118,
 124, 125,   0,   0, 123,   0,   0,   0,   0, 152,
 152, 175,   0, 175,   0,   0, 176,  -2,  -2, 115,
  96, 280, 281,  92,  -2,   0,  -2,   0,   0, 255,
 256,  70, 259, 260,   0,   0, 231, 271,   0,   0,
   0,   0,  68,   0,  27,   0,  33,  39,  42,  44,
  45,   0,   0,   0, 151, 128, 129, 123,  -2,   0,
   0, 134,   0,   0,   0,  -2,   0,   0,   0,   0,
 153,   0,   0,   0,   0, 148,   0, 120,  48,   0,
  -2,  -2, 244, 250, 228,   0,   0, 274, 276,  -2,
   0, 165, 167, 233,  64,  74,  85,  69,   0,   0,
   0,  37,   0,   0,   0,   0,  -2, 131,   0,   0,
   0, 175, 175,   0,   0,   0,   0,   0, 140, 141,
 142, 143, 144,  -2,   0, 282,   0, 230,  -2,   0,
   0,   0,  32,   0,   0,   0,   0,   0,   0,   0,
  -2,  54,   0,  58,  59,  -2, 130, 263,   0, 132,
   0,  -2,   0,   0,   0, 151,   0,   0, 123,   0,
 163,   0, 229, 277, 164, 166, 279,  34,  35,   0,
   0,   0,  50,  51,  52,  53,  55,   0,   0,   0,
 262, 127,   0, 135, 175,  -2, 175,   0, 123,   0,
 146,  -2, 155,   0,  40,  46,  49,   0,   0,  -2,
   0,  60,  38,   0, 133,  -2,   0, 138,   0, 145,
  -2, 158,   0, 167,  -2,   0,  56,  57,   0, 123,
   0, 136, 175,   0,   0, 156,   0, 123,   0, 171,
 172, 174, 149,  -2, 161,   0, 139, 159, 147,  -2,
 169,   0,   0,  -2,   0, 174,  -2, 172, 173, 162,
 137, 170
};
short	yytok1[] =
{
   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,  64,   0,   0,   0,  36,  23,   0,
  39,  40,  34,  32,  99,  33,  54,  35,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,  50,  72,
  26,   4,  27,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,  41,   0,  42,  22,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,  70,  21,  71,  65
};
short	yytok2[] =
{
   2,   3,   5,   6,   7,   8,   9,  10,  11,  12,
  13,  14,  15,  16,  17,  18,  19,  20,  24,  25,
  28,  29,  30,  31,  37,  38,  43,  44,  45,  46,
  47,  48,  49,  51,  52,  53,  55,  56,  57,  58,
  59,  60,  61,  62,  63,  66,  67,  68,  69,  73,
  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,
  94,  95,  96,  97,  98
};
long	yytok3[] =
{
   0
};
#define YYFLAG 		-1000
#define	yyclearin	yychar = -1
#define	yyerrok		yyerrflag = 0

#ifdef	yydebug
#include	"y.debug"
#else
#define	yydebug		0
char*	yytoknames[1];		/* for debugging */
char*	yystates[1];		/* for debugging */
#endif

/*	parser for yacc output	*/

int	yynerrs = 0;		/* number of errors */
int	yyerrflag = 0;		/* error recovery flag */

extern	int	fprint(int, char*, ...);
extern	int	sprint(char*, char*, ...);

char*
yytokname(int yyc)
{
	static char x[16];

	if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
	if(yytoknames[yyc-1])
		return yytoknames[yyc-1];
	sprint(x, "<%d>", yyc);
	return x;
}

char*
yystatname(int yys)
{
	static char x[16];

	if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
	if(yystates[yys])
		return yystates[yys];
	sprint(x, "<%d>\n", yys);
	return x;
}

long
yylex1(void)
{
	long yychar;
	long *t3p;
	int c;

	yychar = yylex();
	if(yychar <= 0) {
		c = yytok1[0];
		goto out;
	}
	if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) {
		c = yytok1[yychar];
		goto out;
	}
	if(yychar >= YYPRIVATE)
		if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) {
			c = yytok2[yychar-YYPRIVATE];
			goto out;
		}
	for(t3p=yytok3;; t3p+=2) {
		c = t3p[0];
		if(c == yychar) {
			c = t3p[1];
			goto out;
		}
		if(c == 0)
			break;
	}
	c = 0;

out:
	if(c == 0)
		c = yytok2[1];	/* unknown char */
	if(yydebug >= 3)
		fprint(2, "lex %.4lux %s\n", yychar, yytokname(c));
	return c;
}

int
yyparse(void)
{
	struct
	{
		YYSTYPE	yyv;
		int	yys;
	} yys[YYMAXDEPTH], *yyp, *yypt;
	short *yyxi;
	int yyj, yym, yystate, yyn, yyg;
	long yychar;
	YYSTYPE save1, save2;
	int save3, save4;

	save1 = yylval;
	save2 = yyval;
	save3 = yynerrs;
	save4 = yyerrflag;

	yystate = 0;
	yychar = -1;
	yynerrs = 0;
	yyerrflag = 0;
	yyp = &yys[-1];
	goto yystack;

ret0:
	yyn = 0;
	goto ret;

ret1:
	yyn = 1;
	goto ret;

ret:
	yylval = save1;
	yyval = save2;
	yynerrs = save3;
	yyerrflag = save4;
	return yyn;

yystack:
	/* put a state and value onto the stack */
	if(yydebug >= 4)
		fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate));

	yyp++;
	if(yyp >= &yys[YYMAXDEPTH]) {
		yyerror("yacc stack overflow");
		goto ret1;
	}
	yyp->yys = yystate;
	yyp->yyv = yyval;

yynewstate:
	yyn = yypact[yystate];
	if(yyn <= YYFLAG)
		goto yydefault; /* simple state */
	if(yychar < 0)
		yychar = yylex1();
	yyn += yychar;
	if(yyn < 0 || yyn >= YYLAST)
		goto yydefault;
	yyn = yyact[yyn];
	if(yychk[yyn] == yychar) { /* valid shift */
		yychar = -1;
		yyval = yylval;
		yystate = yyn;
		if(yyerrflag > 0)
			yyerrflag--;
		goto yystack;
	}

yydefault:
	/* default state action */
	yyn = yydef[yystate];
	if(yyn == -2) {
		if(yychar < 0)
			yychar = yylex1();

		/* look through exception table */
		for(yyxi=yyexca;; yyxi+=2)
			if(yyxi[0] == -1 && yyxi[1] == yystate)
				break;
		for(yyxi += 2;; yyxi += 2) {
			yyn = yyxi[0];
			if(yyn < 0 || yyn == yychar)
				break;
		}
		yyn = yyxi[1];
		if(yyn < 0)
			goto ret0;
	}
	if(yyn == 0) {
		/* error ... attempt to resume parsing */
		switch(yyerrflag) {
		case 0:   /* brand new error */
			yyerror("syntax error");
			yynerrs++;
			if(yydebug >= 1) {
				fprint(2, "%s", yystatname(yystate));
				fprint(2, "saw %s\n", yytokname(yychar));
			}

		case 1:
		case 2: /* incompletely recovered error ... try again */
			yyerrflag = 3;

			/* find a state where "error" is a legal shift action */
			while(yyp >= yys) {
				yyn = yypact[yyp->yys] + YYERRCODE;
				if(yyn >= 0 && yyn < YYLAST) {
					yystate = yyact[yyn];  /* simulate a shift of "error" */
					if(yychk[yystate] == YYERRCODE)
						goto yystack;
				}

				/* the current yyp has no shift onn "error", pop stack */
				if(yydebug >= 2)
					fprint(2, "error recovery pops state %d, uncovers %d\n",
						yyp->yys, (yyp-1)->yys );
				yyp--;
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1;

		case 3:  /* no shift yet; clobber input char */
			if(yydebug >= 2)
				fprint(2, "error recovery discards %s\n", yytokname(yychar));
			if(yychar == YYEOFCODE)
				goto ret1;
			yychar = -1;
			goto yynewstate;   /* try again in the same state */
		}
	}

	/* reduction by production yyn */
	if(yydebug >= 2)
		fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate));

	yypt = yyp;
	yyp -= yyr2[yyn];
	yyval = (yyp+1)->yyv;
	yym = yyn;

	/* consult goto table to find next state */
	yyn = yyr1[yyn];
	yyg = yypgo[yyn];
	yyj = yyg + yyp->yys + 1;

	if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
		yystate = yyact[yyg];
	switch(yym) {
		
case 1:
#line	74	"limbo.y"
{
		impmods = yypt[-1].yyv.ids;
	} break;
case 2:
#line	77	"limbo.y"
{
		tree = rotater(yypt[-0].yyv.node);
	} break;
case 3:
#line	81	"limbo.y"
{
		impmods = nil;
		tree = rotater(yypt[-0].yyv.node);
	} break;
case 5:
#line	89	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else if(yypt[-0].yyv.node == nil)
			yyval.node = yypt[-1].yyv.node;
		else
			yyval.node = mkbin(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 6:
#line	100	"limbo.y"
{
		yyval.node = nil;
	} break;
case 11:
#line	108	"limbo.y"
{
		yyval.node = mkbin(Oas, yypt[-3].yyv.node, yypt[-1].yyv.node);
	} break;
case 12:
#line	112	"limbo.y"
{
		yyval.node = mkbin(Oas, yypt[-3].yyv.node, yypt[-1].yyv.node);
	} break;
case 13:
#line	116	"limbo.y"
{
		yyval.node = mkbin(Odas, yypt[-3].yyv.node, yypt[-1].yyv.node);
	} break;
case 14:
#line	120	"limbo.y"
{
		yyval.node = mkbin(Odas, yypt[-3].yyv.node, yypt[-1].yyv.node);
	} break;
case 15:
#line	124	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = nil;
	} break;
case 16:
#line	129	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = nil;
	} break;
case 18:
#line	137	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 19:
#line	143	"limbo.y"
{
		includef(yypt[-1].yyv.tok.v.idval);
		yyval.node = nil;
	} break;
case 20:
#line	148	"limbo.y"
{
		yyval.node = typedecl(yypt[-4].yyv.ids, yypt[-1].yyv.type);
	} break;
case 21:
#line	152	"limbo.y"
{
		yyval.node = importdecl(yypt[-1].yyv.node, yypt[-4].yyv.ids);
		yyval.node->src.start = yypt[-4].yyv.ids->src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 22:
#line	158	"limbo.y"
{
		yyval.node = vardecl(yypt[-3].yyv.ids, yypt[-1].yyv.type);
	} break;
case 23:
#line	162	"limbo.y"
{
		yyval.node = mkbin(Ovardecli, vardecl(yypt[-5].yyv.ids, yypt[-3].yyv.type), varinit(yypt[-5].yyv.ids, yypt[-1].yyv.node));
	} break;
case 24:
#line	166	"limbo.y"
{
		yyval.node = condecl(yypt[-4].yyv.ids, yypt[-1].yyv.node);
	} break;
case 26:
#line	173	"limbo.y"
{
		yyval.node = exdecl(yypt[-3].yyv.ids, nil);
	} break;
case 27:
#line	177	"limbo.y"
{
		yyval.node = exdecl(yypt[-6].yyv.ids, revids(yypt[-2].yyv.ids));
	} break;
case 28:
#line	183	"limbo.y"
{
		yypt[-5].yyv.ids->src.stop = yypt[-0].yyv.tok.src.stop;
		yyval.node = moddecl(yypt[-5].yyv.ids, rotater(yypt[-1].yyv.node));
	} break;
case 29:
#line	190	"limbo.y"
{
		yyval.node = nil;
	} break;
case 30:
#line	194	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else if(yypt[-0].yyv.node == nil)
			yyval.node = yypt[-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 31:
#line	203	"limbo.y"
{
		yyval.node = nil;
	} break;
case 32:
#line	209	"limbo.y"
{
		yyval.node = fielddecl(Dglobal, typeids(yypt[-3].yyv.ids, yypt[-1].yyv.type));
	} break;
case 34:
#line	214	"limbo.y"
{
		yyval.node = typedecl(yypt[-4].yyv.ids, yypt[-1].yyv.type);
	} break;
case 35:
#line	218	"limbo.y"
{
		yyval.node = condecl(yypt[-4].yyv.ids, yypt[-1].yyv.node);
	} break;
case 37:
#line	225	"limbo.y"
{
		yypt[-7].yyv.ids->src.stop = yypt[-1].yyv.tok.src.stop;
		yyval.node = adtdecl(yypt[-7].yyv.ids, rotater(yypt[-2].yyv.node));
		yyval.node->ty->polys = yypt[-4].yyv.ids;
		yyval.node->ty->val = rotater(yypt[-0].yyv.node);
	} break;
case 38:
#line	232	"limbo.y"
{
		yypt[-10].yyv.ids->src.stop = yypt[-0].yyv.tok.src.stop;
		yyval.node = adtdecl(yypt[-10].yyv.ids, rotater(yypt[-1].yyv.node));
		yyval.node->ty->polys = yypt[-7].yyv.ids;
		yyval.node->ty->val = rotater(yypt[-4].yyv.node);
	} break;
case 39:
#line	241	"limbo.y"
{
		yyval.node = nil;
	} break;
case 40:
#line	245	"limbo.y"
{
		yyval.node = yypt[-1].yyv.node;
	} break;
case 41:
#line	251	"limbo.y"
{
		yyval.node = nil;
	} break;
case 42:
#line	255	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else if(yypt[-0].yyv.node == nil)
			yyval.node = yypt[-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 43:
#line	264	"limbo.y"
{
		yyval.node = nil;
	} break;
case 46:
#line	272	"limbo.y"
{
		yyval.node = condecl(yypt[-4].yyv.ids, yypt[-1].yyv.node);
	} break;
case 47:
#line	278	"limbo.y"
{
		yyval.node = nil;
	} break;
case 48:
#line	282	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else if(yypt[-0].yyv.node == nil)
			yyval.node = yypt[-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 49:
#line	293	"limbo.y"
{
		Decl *d;

		for(d = yypt[-4].yyv.ids; d != nil; d = d->next)
			d->cyc = 1;
		yyval.node = fielddecl(Dfield, typeids(yypt[-4].yyv.ids, yypt[-1].yyv.type));
	} break;
case 50:
#line	301	"limbo.y"
{
		yyval.node = fielddecl(Dfield, typeids(yypt[-3].yyv.ids, yypt[-1].yyv.type));
	} break;
case 51:
#line	307	"limbo.y"
{
		yyval.node = yypt[-1].yyv.node;
	} break;
case 52:
#line	313	"limbo.y"
{
		yypt[-1].yyv.node->right->right = yypt[-0].yyv.node;
		yyval.node = yypt[-1].yyv.node;
	} break;
case 53:
#line	318	"limbo.y"
{
		yyval.node = nil;
	} break;
case 54:
#line	322	"limbo.y"
{
		yyval.node = nil;
	} break;
case 55:
#line	328	"limbo.y"
{
		yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yypt[-1].yyv.ids), nil));
		typeids(yypt[-1].yyv.ids, mktype(&yypt[-1].yyv.ids->src.start, &yypt[-1].yyv.ids->src.stop, Tadtpick, nil, nil));
	} break;
case 56:
#line	333	"limbo.y"
{
		yypt[-3].yyv.node->right->right = yypt[-2].yyv.node;
		yyval.node = mkn(Opickdecl, yypt[-3].yyv.node, mkn(Oseq, fielddecl(Dtag, yypt[-1].yyv.ids), nil));
		typeids(yypt[-1].yyv.ids, mktype(&yypt[-1].yyv.ids->src.start, &yypt[-1].yyv.ids->src.stop, Tadtpick, nil, nil));
	} break;
case 57:
#line	339	"limbo.y"
{
		yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yypt[-1].yyv.ids), nil));
		typeids(yypt[-1].yyv.ids, mktype(&yypt[-1].yyv.ids->src.start, &yypt[-1].yyv.ids->src.stop, Tadtpick, nil, nil));
	} break;
case 58:
#line	346	"limbo.y"
{
		yyval.ids = revids(yypt[-0].yyv.ids);
	} break;
case 59:
#line	352	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, nil);
	} break;
case 60:
#line	356	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, yypt[-2].yyv.ids);
	} break;
case 61:
#line	362	"limbo.y"
{
		yyval.ids = revids(yypt[-0].yyv.ids);
	} break;
case 62:
#line	368	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, nil);
	} break;
case 63:
#line	372	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, yypt[-2].yyv.ids);
	} break;
case 64:
#line	378	"limbo.y"
{
		yyval.type = mktype(&yypt[-5].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tfix, nil, nil);
		yyval.type->val = mkbin(Oseq, yypt[-3].yyv.node, yypt[-1].yyv.node);
	} break;
case 65:
#line	383	"limbo.y"
{
		yyval.type = mktype(&yypt[-3].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tfix, nil, nil);
		yyval.type->val = yypt[-1].yyv.node;
	} break;
case 66:
#line	390	"limbo.y"
{
		yyval.types = addtype(yypt[-0].yyv.type, nil);
	} break;
case 67:
#line	394	"limbo.y"
{
		yyval.types = addtype(yypt[-0].yyv.type, nil);
		yypt[-0].yyv.type->flags |= CYCLIC;
	} break;
case 68:
#line	399	"limbo.y"
{
		yyval.types = addtype(yypt[-0].yyv.type, yypt[-2].yyv.types);
	} break;
case 69:
#line	403	"limbo.y"
{
		yyval.types = addtype(yypt[-0].yyv.type, yypt[-3].yyv.types);
		yypt[-0].yyv.type->flags |= CYCLIC;
	} break;
case 70:
#line	410	"limbo.y"
{
		yyval.type = mkidtype(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 71:
#line	414	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 72:
#line	418	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 73:
#line	422	"limbo.y"
{
		yyval.type = mkarrowtype(&yypt[-2].yyv.type->src.start, &yypt[-0].yyv.tok.src.stop, yypt[-2].yyv.type, yypt[-0].yyv.tok.v.idval);
	} break;
case 74:
#line	426	"limbo.y"
{
		yyval.type = mkarrowtype(&yypt[-5].yyv.type->src.start, &yypt[-3].yyv.tok.src.stop, yypt[-5].yyv.type, yypt[-3].yyv.tok.v.idval);
		yyval.type = mkinsttype(&yypt[-5].yyv.type->src, yyval.type, yypt[-1].yyv.types);
	} break;
case 75:
#line	431	"limbo.y"
{
		yyval.type = mktype(&yypt[-1].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tref, yypt[-0].yyv.type, nil);
	} break;
case 76:
#line	435	"limbo.y"
{
		yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tchan, yypt[-0].yyv.type, nil);
	} break;
case 77:
#line	439	"limbo.y"
{
		if(yypt[-1].yyv.ids->next == nil)
			yyval.type = yypt[-1].yyv.ids->ty;
		else
			yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Ttuple, nil, revids(yypt[-1].yyv.ids));
	} break;
case 78:
#line	446	"limbo.y"
{
		yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tarray, yypt[-0].yyv.type, nil);
	} break;
case 79:
#line	450	"limbo.y"
{
		yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tlist, yypt[-0].yyv.type, nil);
	} break;
case 80:
#line	454	"limbo.y"
{
		yypt[-1].yyv.type->src.start = yypt[-3].yyv.tok.src.start;
		yypt[-1].yyv.type->polys = yypt[-2].yyv.ids;
		yypt[-1].yyv.type->u.eraises = yypt[-0].yyv.node;
		yyval.type = yypt[-1].yyv.type;
	} break;
case 82:
#line	476	"limbo.y"
{
		yyval.type = mkidtype(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 83:
#line	480	"limbo.y"
{
		yyval.type = mkinsttype(&yypt[-3].yyv.tok.src, mkidtype(&yypt[-3].yyv.tok.src, yypt[-3].yyv.tok.v.idval), yypt[-1].yyv.types);
	} break;
case 84:
#line	486	"limbo.y"
{
		yyval.type = mkdottype(&yypt[-2].yyv.type->src.start, &yypt[-0].yyv.tok.src.stop, yypt[-2].yyv.type, yypt[-0].yyv.tok.v.idval);
	} break;
case 85:
#line	490	"limbo.y"
{
		yyval.type = mkdottype(&yypt[-5].yyv.type->src.start, &yypt[-3].yyv.tok.src.stop, yypt[-5].yyv.type, yypt[-3].yyv.tok.v.idval);
		yyval.type = mkinsttype(&yypt[-5].yyv.type->src, yyval.type, yypt[-1].yyv.types);
	} break;
case 86:
#line	497	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.type->src, nil, yypt[-0].yyv.type, nil);
	} break;
case 87:
#line	501	"limbo.y"
{
		yyval.ids = mkids(&yypt[-2].yyv.ids->src, nil, yypt[-0].yyv.type, yypt[-2].yyv.ids);
	} break;
case 88:
#line	507	"limbo.y"
{
		yyval.ids = nil;
	} break;
case 89:
#line	511	"limbo.y"
{
		yyval.ids = polydecl(yypt[-1].yyv.ids);
	} break;
case 90:
#line	517	"limbo.y"
{
		yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tfn, tnone, yypt[-1].yyv.ids);
	} break;
case 91:
#line	521	"limbo.y"
{
		yyval.type = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tfn, tnone, nil);
		yyval.type->varargs = 1;
	} break;
case 92:
#line	526	"limbo.y"
{
		yyval.type = mktype(&yypt[-4].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tfn, tnone, yypt[-3].yyv.ids);
		yyval.type->varargs = 1;
	} break;
case 93:
#line	533	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 94:
#line	537	"limbo.y"
{
		yypt[-2].yyv.type->tof = yypt[-0].yyv.type;
		yypt[-2].yyv.type->src.stop = yypt[-0].yyv.type->src.stop;
		yyval.type = yypt[-2].yyv.type;
	} break;
case 95:
#line	545	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 96:
#line	549	"limbo.y"
{
		yyval.type = yypt[-4].yyv.type;
		yyval.type->val = rotater(yypt[-1].yyv.node);
	} break;
case 97:
#line	556	"limbo.y"
{
		yyval.ids = nil;
	} break;
case 100:
#line	564	"limbo.y"
{
		yyval.ids = appdecls(yypt[-2].yyv.ids, yypt[-0].yyv.ids);
	} break;
case 101:
#line	570	"limbo.y"
{
		yyval.ids = typeids(yypt[-2].yyv.ids, yypt[-0].yyv.type);
	} break;
case 102:
#line	574	"limbo.y"
{
		Decl *d;

		yyval.ids = typeids(yypt[-2].yyv.ids, yypt[-0].yyv.type);
		for(d = yyval.ids; d != nil; d = d->next)
			d->implicit = 1;
	} break;
case 103:
#line	582	"limbo.y"
{
		yyval.ids = mkids(&yypt[-2].yyv.node->src, enter("junk", 0), yypt[-0].yyv.type, nil);
		yyval.ids->store = Darg;
		yyerror("illegal argument declaration");
	} break;
case 104:
#line	588	"limbo.y"
{
		yyval.ids = mkids(&yypt[-2].yyv.node->src, enter("junk", 0), yypt[-0].yyv.type, nil);
		yyval.ids->store = Darg;
		yyerror("illegal argument declaration");
	} break;
case 105:
#line	596	"limbo.y"
{
		yyval.ids = revids(yypt[-0].yyv.ids);
	} break;
case 106:
#line	602	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, nil);
		yyval.ids->store = Darg;
	} break;
case 107:
#line	607	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, nil, nil, nil);
		yyval.ids->store = Darg;
	} break;
case 108:
#line	612	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, yypt[-2].yyv.ids);
		yyval.ids->store = Darg;
	} break;
case 109:
#line	617	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, nil, nil, yypt[-2].yyv.ids);
		yyval.ids->store = Darg;
	} break;
case 110:
#line	650	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 111:
#line	654	"limbo.y"
{
		yyval.type = mktype(&yypt[-1].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tref, yypt[-0].yyv.type, nil);
	} break;
case 112:
#line	658	"limbo.y"
{
		yyval.type = yypt[-0].yyv.type;
	} break;
case 113:
#line	662	"limbo.y"
{
		yyval.type = mktype(&yypt[-1].yyv.tok.src.start, &yypt[-0].yyv.tok.src.stop, Tref, yypt[-0].yyv.type, nil);
	} break;
case 114:
#line	668	"limbo.y"
{
		yyval.node = fndecl(yypt[-3].yyv.node, yypt[-2].yyv.type, yypt[-0].yyv.node);
		nfns++;
		/* patch up polydecs */
		if(yypt[-3].yyv.node->op == Odot){
			if(yypt[-3].yyv.node->right->left != nil){
				yypt[-2].yyv.type->polys = yypt[-3].yyv.node->right->left->decl;
				yypt[-3].yyv.node->right->left = nil;
			}
			if(yypt[-3].yyv.node->left->op == Oname && yypt[-3].yyv.node->left->left != nil){
				yyval.node->decl = yypt[-3].yyv.node->left->left->decl;
				yypt[-3].yyv.node->left->left = nil;
			}
		}
		else{
			if(yypt[-3].yyv.node->left != nil){
				yypt[-2].yyv.type->polys = yypt[-3].yyv.node->left->decl;
				yypt[-3].yyv.node->left = nil;
			}
		}
		yypt[-2].yyv.type->u.eraises = yypt[-1].yyv.node;
		yyval.node->src = yypt[-3].yyv.node->src;
	} break;
case 115:
#line	694	"limbo.y"
{
		yyval.node = mkn(Otuple, rotater(yypt[-1].yyv.node), nil);
		yyval.node->src.start = yypt[-3].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 116:
#line	700	"limbo.y"
{
		yyval.node = mkn(Otuple, mkunary(Oseq, yypt[-0].yyv.node), nil);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.node->src.stop;
	} break;
case 117:
#line	706	"limbo.y"
{
		yyval.node = nil;
	} break;
case 118:
#line	712	"limbo.y"
{
		if(yypt[-1].yyv.node == nil){
			yypt[-1].yyv.node = mkn(Onothing, nil, nil);
			yypt[-1].yyv.node->src.start = curline();
			yypt[-1].yyv.node->src.stop = yypt[-1].yyv.node->src.start;
		}
		yyval.node = rotater(yypt[-1].yyv.node);
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 119:
#line	723	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
	} break;
case 120:
#line	727	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
	} break;
case 121:
#line	733	"limbo.y"
{
		yyval.node = mkname(&yypt[-1].yyv.tok.src, yypt[-1].yyv.tok.v.idval);
		if(yypt[-0].yyv.ids != nil){
			yyval.node->left = mkn(Onothing, nil ,nil);
			yyval.node->left->decl = yypt[-0].yyv.ids;
		}
	} break;
case 122:
#line	741	"limbo.y"
{
		yyval.node = mkbin(Odot, yypt[-3].yyv.node, mkname(&yypt[-1].yyv.tok.src, yypt[-1].yyv.tok.v.idval));
		if(yypt[-0].yyv.ids != nil){
			yyval.node->right->left = mkn(Onothing, nil ,nil);
			yyval.node->right->left->decl = yypt[-0].yyv.ids;
		}
	} break;
case 123:
#line	751	"limbo.y"
{
		yyval.node = nil;
	} break;
case 124:
#line	755	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else if(yypt[-0].yyv.node == nil)
			yyval.node = yypt[-1].yyv.node;
		else
			yyval.node = mkbin(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 125:
#line	764	"limbo.y"
{
		if(yypt[-1].yyv.node == nil)
			yyval.node = yypt[-0].yyv.node;
		else
			yyval.node = mkbin(Oseq, yypt[-1].yyv.node, yypt[-0].yyv.node);
	} break;
case 128:
#line	777	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 129:
#line	783	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 130:
#line	789	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 131:
#line	795	"limbo.y"
{
		if(yypt[-1].yyv.node == nil){
			yypt[-1].yyv.node = mkn(Onothing, nil, nil);
			yypt[-1].yyv.node->src.start = curline();
			yypt[-1].yyv.node->src.stop = yypt[-1].yyv.node->src.start;
		}
		yyval.node = mkscope(rotater(yypt[-1].yyv.node));
	} break;
case 132:
#line	804	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 133:
#line	811	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 134:
#line	818	"limbo.y"
{
		yyval.node = yypt[-1].yyv.node;
	} break;
case 135:
#line	822	"limbo.y"
{
		yyval.node = mkn(Oif, yypt[-2].yyv.node, mkunary(Oseq, yypt[-0].yyv.node));
		yyval.node->src.start = yypt[-4].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.node->src.stop;
	} break;
case 136:
#line	828	"limbo.y"
{
		yyval.node = mkn(Oif, yypt[-4].yyv.node, mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node));
		yyval.node->src.start = yypt[-6].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.node->src.stop;
	} break;
case 137:
#line	834	"limbo.y"
{
		yyval.node = mkunary(Oseq, yypt[-0].yyv.node);
		if(yypt[-2].yyv.node->op != Onothing)
			yyval.node->right = yypt[-2].yyv.node;
		yyval.node = mkbin(Ofor, yypt[-4].yyv.node, yyval.node);
		yyval.node->decl = yypt[-9].yyv.ids;
		if(yypt[-6].yyv.node->op != Onothing)
			yyval.node = mkbin(Oseq, yypt[-6].yyv.node, yyval.node);
	} break;
case 138:
#line	844	"limbo.y"
{
		yyval.node = mkn(Ofor, yypt[-2].yyv.node, mkunary(Oseq, yypt[-0].yyv.node));
		yyval.node->src.start = yypt[-4].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.node->src.stop;
		yyval.node->decl = yypt[-5].yyv.ids;
	} break;
case 139:
#line	851	"limbo.y"
{
		yyval.node = mkn(Odo, yypt[-2].yyv.node, yypt[-5].yyv.node);
		yyval.node->src.start = yypt[-6].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-1].yyv.tok.src.stop;
		yyval.node->decl = yypt[-7].yyv.ids;
	} break;
case 140:
#line	858	"limbo.y"
{
		yyval.node = mkn(Obreak, nil, nil);
		yyval.node->decl = yypt[-1].yyv.ids;
		yyval.node->src = yypt[-2].yyv.tok.src;
	} break;
case 141:
#line	864	"limbo.y"
{
		yyval.node = mkn(Ocont, nil, nil);
		yyval.node->decl = yypt[-1].yyv.ids;
		yyval.node->src = yypt[-2].yyv.tok.src;
	} break;
case 142:
#line	870	"limbo.y"
{
		yyval.node = mkn(Oret, yypt[-1].yyv.node, nil);
		yyval.node->src = yypt[-2].yyv.tok.src;
		if(yypt[-1].yyv.node->op == Onothing)
			yyval.node->left = nil;
		else
			yyval.node->src.stop = yypt[-1].yyv.node->src.stop;
	} break;
case 143:
#line	879	"limbo.y"
{
		yyval.node = mkn(Ospawn, yypt[-1].yyv.node, nil);
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-1].yyv.node->src.stop;
	} break;
case 144:
#line	885	"limbo.y"
{
		yyval.node = mkn(Oraise, yypt[-1].yyv.node, nil);
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-1].yyv.node->src.stop;
	} break;
case 145:
#line	891	"limbo.y"
{
		yyval.node = mkn(Ocase, yypt[-3].yyv.node, caselist(yypt[-1].yyv.node, nil));
		yyval.node->src = yypt[-3].yyv.node->src;
		yyval.node->decl = yypt[-5].yyv.ids;
	} break;
case 146:
#line	897	"limbo.y"
{
		yyval.node = mkn(Oalt, caselist(yypt[-1].yyv.node, nil), nil);
		yyval.node->src = yypt[-3].yyv.tok.src;
		yyval.node->decl = yypt[-4].yyv.ids;
	} break;
case 147:
#line	903	"limbo.y"
{
		yyval.node = mkn(Opick, mkbin(Odas, mkname(&yypt[-5].yyv.tok.src, yypt[-5].yyv.tok.v.idval), yypt[-3].yyv.node), caselist(yypt[-1].yyv.node, nil));
		yyval.node->src.start = yypt[-5].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-3].yyv.node->src.stop;
		yyval.node->decl = yypt[-7].yyv.ids;
	} break;
case 148:
#line	910	"limbo.y"
{
		yyval.node = mkn(Oexit, nil, nil);
		yyval.node->src = yypt[-1].yyv.tok.src;
	} break;
case 149:
#line	915	"limbo.y"
{
		if(yypt[-6].yyv.node == nil){
			yypt[-6].yyv.node = mkn(Onothing, nil, nil);
			yypt[-6].yyv.node->src.start = curline();
			yypt[-6].yyv.node->src.stop = curline();
		}
		yypt[-6].yyv.node = mkscope(rotater(yypt[-6].yyv.node));
		yyval.node = mkbin(Oexstmt, yypt[-6].yyv.node, mkn(Oexcept, yypt[-3].yyv.node, caselist(yypt[-1].yyv.node, nil)));
	} break;
case 150:
#line	933	"limbo.y"
{
		yyval.ids = nil;
	} break;
case 151:
#line	937	"limbo.y"
{
		if(yypt[-1].yyv.ids->next != nil)
			yyerror("only one identifier allowed in a label");
		yyval.ids = yypt[-1].yyv.ids;
	} break;
case 152:
#line	945	"limbo.y"
{
		yyval.ids = nil;
	} break;
case 153:
#line	949	"limbo.y"
{
		yyval.ids = mkids(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval, nil, nil);
	} break;
case 154:
#line	955	"limbo.y"
{
		yypt[-1].yyv.node->left->right->right = yypt[-0].yyv.node;
		yyval.node = yypt[-1].yyv.node;
	} break;
case 155:
#line	962	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkscope(mkunary(Olabel, rotater(yypt[-1].yyv.node))));
	} break;
case 156:
#line	966	"limbo.y"
{
		yypt[-3].yyv.node->left->right->right = yypt[-2].yyv.node;
		yyval.node = mkbin(Oseq, mkscope(mkunary(Olabel, rotater(yypt[-1].yyv.node))), yypt[-3].yyv.node);
	} break;
case 157:
#line	973	"limbo.y"
{
		yypt[-1].yyv.node->left->right = mkscope(yypt[-0].yyv.node);
		yyval.node = yypt[-1].yyv.node;
	} break;
case 158:
#line	980	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)));
	} break;
case 159:
#line	984	"limbo.y"
{
		yypt[-3].yyv.node->left->right = mkscope(yypt[-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)), yypt[-3].yyv.node);
	} break;
case 160:
#line	991	"limbo.y"
{
		yypt[-1].yyv.node->left->right = mkscope(yypt[-0].yyv.node);
		yyval.node = yypt[-1].yyv.node;
	} break;
case 161:
#line	998	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)));
	} break;
case 162:
#line	1002	"limbo.y"
{
		yypt[-3].yyv.node->left->right = mkscope(yypt[-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)), yypt[-3].yyv.node);
	} break;
case 164:
#line	1010	"limbo.y"
{
		yyval.node = mkbin(Orange, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 165:
#line	1014	"limbo.y"
{
		yyval.node = mkn(Owild, nil, nil);
		yyval.node->src = yypt[-0].yyv.tok.src;
	} break;
case 166:
#line	1019	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 167:
#line	1023	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 168:
#line	1031	"limbo.y"
{
		yypt[-1].yyv.node->left->right = mkscope(yypt[-0].yyv.node);
		yyval.node = yypt[-1].yyv.node;
	} break;
case 169:
#line	1038	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)));
	} break;
case 170:
#line	1042	"limbo.y"
{
		yypt[-3].yyv.node->left->right = mkscope(yypt[-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yypt[-1].yyv.node)), yypt[-3].yyv.node);
	} break;
case 171:
#line	1049	"limbo.y"
{
		yyval.node = mkname(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 172:
#line	1053	"limbo.y"
{
		yyval.node = mkn(Owild, nil, nil);
		yyval.node->src = yypt[-0].yyv.tok.src;
	} break;
case 173:
#line	1058	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 174:
#line	1062	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 175:
#line	1070	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = curline();
		yyval.node->src.stop = yyval.node->src.start;
	} break;
case 178:
#line	1080	"limbo.y"
{
		yyval.node = mkbin(Oas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 179:
#line	1084	"limbo.y"
{
		yyval.node = mkbin(Oandas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 180:
#line	1088	"limbo.y"
{
		yyval.node = mkbin(Ooras, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 181:
#line	1092	"limbo.y"
{
		yyval.node = mkbin(Oxoras, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 182:
#line	1096	"limbo.y"
{
		yyval.node = mkbin(Olshas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 183:
#line	1100	"limbo.y"
{
		yyval.node = mkbin(Orshas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 184:
#line	1104	"limbo.y"
{
		yyval.node = mkbin(Oaddas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 185:
#line	1108	"limbo.y"
{
		yyval.node = mkbin(Osubas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 186:
#line	1112	"limbo.y"
{
		yyval.node = mkbin(Omulas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 187:
#line	1116	"limbo.y"
{
		yyval.node = mkbin(Odivas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 188:
#line	1120	"limbo.y"
{
		yyval.node = mkbin(Omodas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 189:
#line	1124	"limbo.y"
{
		yyval.node = mkbin(Oexpas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 190:
#line	1128	"limbo.y"
{
		yyval.node = mkbin(Osnd, yypt[-3].yyv.node, yypt[-0].yyv.node);
	} break;
case 191:
#line	1132	"limbo.y"
{
		yyval.node = mkbin(Osnd, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 192:
#line	1136	"limbo.y"
{
		yyval.node = mkbin(Odas, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 193:
#line	1140	"limbo.y"
{
		yyval.node = mkn(Oload, yypt[-0].yyv.node, nil);
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.node->src.stop;
		yyval.node->ty = mkidtype(&yypt[-1].yyv.tok.src, yypt[-1].yyv.tok.v.idval);
	} break;
case 194:
#line	1147	"limbo.y"
{
		yyval.node = mkbin(Oexp, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 195:
#line	1151	"limbo.y"
{
		yyval.node = mkbin(Omul, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 196:
#line	1155	"limbo.y"
{
		yyval.node = mkbin(Odiv, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 197:
#line	1159	"limbo.y"
{
		yyval.node = mkbin(Omod, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 198:
#line	1163	"limbo.y"
{
		yyval.node = mkbin(Oadd, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 199:
#line	1167	"limbo.y"
{
		yyval.node = mkbin(Osub, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 200:
#line	1171	"limbo.y"
{
		yyval.node = mkbin(Orsh, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 201:
#line	1175	"limbo.y"
{
		yyval.node = mkbin(Olsh, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 202:
#line	1179	"limbo.y"
{
		yyval.node = mkbin(Olt, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 203:
#line	1183	"limbo.y"
{
		yyval.node = mkbin(Ogt, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 204:
#line	1187	"limbo.y"
{
		yyval.node = mkbin(Oleq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 205:
#line	1191	"limbo.y"
{
		yyval.node = mkbin(Ogeq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 206:
#line	1195	"limbo.y"
{
		yyval.node = mkbin(Oeq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 207:
#line	1199	"limbo.y"
{
		yyval.node = mkbin(Oneq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 208:
#line	1203	"limbo.y"
{
		yyval.node = mkbin(Oand, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 209:
#line	1207	"limbo.y"
{
		yyval.node = mkbin(Oxor, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 210:
#line	1211	"limbo.y"
{
		yyval.node = mkbin(Oor, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 211:
#line	1215	"limbo.y"
{
		yyval.node = mkbin(Ocons, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 212:
#line	1219	"limbo.y"
{
		yyval.node = mkbin(Oandand, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 213:
#line	1223	"limbo.y"
{
		yyval.node = mkbin(Ooror, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 215:
#line	1230	"limbo.y"
{
		yypt[-0].yyv.node->src.start = yypt[-1].yyv.tok.src.start;
		yyval.node = yypt[-0].yyv.node;
	} break;
case 216:
#line	1235	"limbo.y"
{
		yyval.node = mkunary(Oneg, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 217:
#line	1240	"limbo.y"
{
		yyval.node = mkunary(Onot, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 218:
#line	1245	"limbo.y"
{
		yyval.node = mkunary(Ocomp, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 219:
#line	1250	"limbo.y"
{
		yyval.node = mkunary(Oind, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 220:
#line	1255	"limbo.y"
{
		yyval.node = mkunary(Opreinc, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 221:
#line	1260	"limbo.y"
{
		yyval.node = mkunary(Opredec, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 222:
#line	1265	"limbo.y"
{
		yyval.node = mkunary(Orcv, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 223:
#line	1270	"limbo.y"
{
		yyval.node = mkunary(Ohd, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 224:
#line	1275	"limbo.y"
{
		yyval.node = mkunary(Otl, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 225:
#line	1280	"limbo.y"
{
		yyval.node = mkunary(Olen, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 226:
#line	1285	"limbo.y"
{
		yyval.node = mkunary(Oref, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 227:
#line	1290	"limbo.y"
{
		yyval.node = mkunary(Otagof, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
	} break;
case 228:
#line	1295	"limbo.y"
{
		yyval.node = mkn(Oarray, yypt[-3].yyv.node, nil);
		yyval.node->ty = mktype(&yypt[-5].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tarray, yypt[-0].yyv.type, nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 229:
#line	1301	"limbo.y"
{
		yyval.node = mkn(Oarray, yypt[-5].yyv.node, yypt[-1].yyv.node);
		yyval.node->src.start = yypt[-7].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 230:
#line	1307	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node->src.start = yypt[-5].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-4].yyv.tok.src.stop;
		yyval.node = mkn(Oarray, yyval.node, yypt[-1].yyv.node);
		yyval.node->src.start = yypt[-6].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 231:
#line	1316	"limbo.y"
{
		yyval.node = etolist(yypt[-1].yyv.node);
		yyval.node->src.start = yypt[-4].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 232:
#line	1322	"limbo.y"
{
		yyval.node = mkn(Ochan, nil, nil);
		yyval.node->ty = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tchan, yypt[-0].yyv.type, nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 233:
#line	1328	"limbo.y"
{
		yyval.node = mkn(Ochan, yypt[-3].yyv.node, nil);
		yyval.node->ty = mktype(&yypt[-5].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tchan, yypt[-0].yyv.type, nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 234:
#line	1334	"limbo.y"
{
		yyval.node = mkunary(Ocast, yypt[-0].yyv.node);
		yyval.node->ty = mktype(&yypt[-3].yyv.tok.src.start, &yypt[-0].yyv.node->src.stop, Tarray, mkidtype(&yypt[-1].yyv.tok.src, yypt[-1].yyv.tok.v.idval), nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 235:
#line	1340	"limbo.y"
{
		yyval.node = mkunary(Ocast, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
		yyval.node->ty = mkidtype(&yyval.node->src, yypt[-1].yyv.tok.v.idval);
	} break;
case 236:
#line	1346	"limbo.y"
{
		yyval.node = mkunary(Ocast, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
		yyval.node->ty = mkidtype(&yyval.node->src, yypt[-1].yyv.tok.v.idval);
	} break;
case 237:
#line	1352	"limbo.y"
{
		yyval.node = mkunary(Ocast, yypt[-0].yyv.node);
		yyval.node->src.start = yypt[-1].yyv.tok.src.start;
		yyval.node->ty = yypt[-1].yyv.type;
	} break;
case 239:
#line	1361	"limbo.y"
{
		yyval.node = mkn(Ocall, yypt[-3].yyv.node, yypt[-1].yyv.node);
		yyval.node->src.start = yypt[-3].yyv.node->src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 240:
#line	1367	"limbo.y"
{
		yyval.node = yypt[-1].yyv.node;
		if(yypt[-1].yyv.node->op == Oseq)
			yyval.node = mkn(Otuple, rotater(yypt[-1].yyv.node), nil);
		else
			yyval.node->flags |= PARENS;
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 241:
#line	1377	"limbo.y"
{
		yyval.node = mkbin(Odot, yypt[-2].yyv.node, mkname(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval));
	} break;
case 242:
#line	1381	"limbo.y"
{
		yyval.node = mkbin(Omdot, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 243:
#line	1385	"limbo.y"
{
		yyval.node = mkbin(Oindex, yypt[-3].yyv.node, yypt[-1].yyv.node);
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 244:
#line	1390	"limbo.y"
{
		if(yypt[-3].yyv.node->op == Onothing)
			yypt[-3].yyv.node->src = yypt[-2].yyv.tok.src;
		if(yypt[-1].yyv.node->op == Onothing)
			yypt[-1].yyv.node->src = yypt[-2].yyv.tok.src;
		yyval.node = mkbin(Oslice, yypt[-5].yyv.node, mkbin(Oseq, yypt[-3].yyv.node, yypt[-1].yyv.node));
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 245:
#line	1399	"limbo.y"
{
		yyval.node = mkunary(Oinc, yypt[-1].yyv.node);
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 246:
#line	1404	"limbo.y"
{
		yyval.node = mkunary(Odec, yypt[-1].yyv.node);
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 247:
#line	1409	"limbo.y"
{
		yyval.node = mksconst(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 248:
#line	1413	"limbo.y"
{
		yyval.node = mkconst(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.ival);
		if(yypt[-0].yyv.tok.v.ival > 0x7fffffff || yypt[-0].yyv.tok.v.ival < -0x7fffffff)
			yyval.node->ty = tbig;
		yyval.node = yyval.node;
	} break;
case 249:
#line	1420	"limbo.y"
{
		yyval.node = mkrconst(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.rval);
	} break;
case 250:
#line	1424	"limbo.y"
{
		yyval.node = mkbin(Oindex, yypt[-5].yyv.node, rotater(mkbin(Oseq, yypt[-3].yyv.node, yypt[-1].yyv.node)));
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 251:
#line	1431	"limbo.y"
{
		yyval.node = mkname(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 252:
#line	1435	"limbo.y"
{
		yyval.node = mknil(&yypt[-0].yyv.tok.src);
	} break;
case 253:
#line	1441	"limbo.y"
{
		yyval.node = mkn(Otuple, rotater(yypt[-1].yyv.node), nil);
		yyval.node->src.start = yypt[-2].yyv.tok.src.start;
		yyval.node->src.stop = yypt[-0].yyv.tok.src.stop;
	} break;
case 255:
#line	1450	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 258:
#line	1460	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node->ty = mkidtype(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 259:
#line	1466	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node->ty = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tarray, yypt[-0].yyv.type, nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 260:
#line	1472	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node->ty = mktype(&yypt[-2].yyv.tok.src.start, &yypt[-0].yyv.type->src.stop, Tlist, yypt[-0].yyv.type, nil);
		yyval.node->src = yyval.node->ty->src;
	} break;
case 261:
#line	1478	"limbo.y"
{
		yyval.node = mkn(Otype, nil ,nil);
		yyval.node->ty = yypt[-0].yyv.type;
		yyval.node->ty->flags |= CYCLIC;
		yyval.node->src = yyval.node->ty->src;
	} break;
case 262:
#line	1487	"limbo.y"
{
		yyval.node = mkname(&yypt[-0].yyv.tok.src, yypt[-0].yyv.tok.v.idval);
	} break;
case 263:
#line	1491	"limbo.y"
{
		yyval.node = nil;
	} break;
case 266:
#line	1499	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 267:
#line	1503	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 268:
#line	1509	"limbo.y"
{
		yyval.node = nil;
	} break;
case 269:
#line	1513	"limbo.y"
{
		yyval.node = rotater(yypt[-0].yyv.node);
	} break;
case 273:
#line	1524	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 274:
#line	1530	"limbo.y"
{
		yyval.node = rotater(yypt[-0].yyv.node);
	} break;
case 275:
#line	1534	"limbo.y"
{
		yyval.node = rotater(yypt[-1].yyv.node);
	} break;
case 277:
#line	1541	"limbo.y"
{
		yyval.node = mkbin(Oseq, yypt[-2].yyv.node, yypt[-0].yyv.node);
	} break;
case 278:
#line	1547	"limbo.y"
{
		yyval.node = mkn(Oelem, nil, yypt[-0].yyv.node);
		yyval.node->src = yypt[-0].yyv.node->src;
	} break;
case 279:
#line	1552	"limbo.y"
{
		yyval.node = mkbin(Oelem, rotater(yypt[-2].yyv.node), yypt[-0].yyv.node);
	} break;
case 280:
#line	1577	"limbo.y"
{
		if(yypt[-1].yyv.node->op == Oseq)
			yypt[-1].yyv.node->right->left = rotater(yypt[-0].yyv.node);
		else
			yypt[-1].yyv.node->left = rotater(yypt[-0].yyv.node);
		yyval.node = yypt[-1].yyv.node;
	} break;
case 281:
#line	1587	"limbo.y"
{
		yyval.node = typedecl(yypt[-1].yyv.ids, mktype(&yypt[-1].yyv.ids->src.start, &yypt[-0].yyv.tok.src.stop, Tpoly, nil, nil));
	} break;
case 282:
#line	1591	"limbo.y"
{
		if(yypt[-3].yyv.node->op == Oseq)
			yypt[-3].yyv.node->right->left = rotater(yypt[-2].yyv.node);
		else
			yypt[-3].yyv.node->left = rotater(yypt[-2].yyv.node);
		yyval.node = mkbin(Oseq, yypt[-3].yyv.node, typedecl(yypt[-1].yyv.ids, mktype(&yypt[-1].yyv.ids->src.start, &yypt[-0].yyv.tok.src.stop, Tpoly, nil, nil)));
	} break;
	}
	goto yystack;  /* stack new state and value */
}