forsyth20121205-174063a80cc13 years agoHistory
662 lines · 16.9 KB · Brainfuck
RawDownload
implement Mashparse; #line	2	"mash.y"include	"mash.m"; ##	mash parser.  Thread safe.#Mashparse: module { 	PATH:	con "/dis/lib/mashparse.dis"; 	init:		fn(l: Mashlib);	parse:	fn(e: ref Mashlib->Env); 	YYSTYPE: adt	{		cmd:		ref Mashlib->Cmd;		item:		ref Mashlib->Item;		items:	list of ref Mashlib->Item;		flag:		int;	}; 	YYETYPE:	type ref Mashlib->Env;Lcase: con	57346;Lfor: con	57347;Lif: con	57348;Lwhile: con	57349;Loffparen: con	57350;Lelse: con	57351;Lpipe: con	57352;Leqeq: con	57353;Lmatch: con	57354;Lnoteq: con	57355;Lcons: con	57356;Lcaret: con	57357;Lnot: con	57358;Lhd: con	57359;Ltl: con	57360;Llen: con	57361;Lword: con	57362;Lbackq: con	57363;Lcolon: con	57364;Lcolonmatch: con	57365;Ldefeq: con	57366;Leq: con	57367;Lmatched: con	57368;Lquote: con	57369;Loncurly: con	57370;Lonparen: con	57371;Loffcurly: con	57372;Lat: con	57373;Lgreat: con	57374;Lgreatgreat: con	57375;Lless: con	57376;Llessgreat: con	57377;Lfn: con	57378;Lin: con	57379;Lrescue: con	57380;Land: con	57381;Leof: con	57382;Lsemi: con	57383;Lerror: con	57384; }; #line	28	"mash.y"	lib:		Mashlib; 	Cmd, Item, Stab, Env:		import lib;YYEOFCODE: con 1;YYERRCODE: con 2;YYMAXDEPTH: con 150; #line	244	"mash.y"  init(l: Mashlib){	lib = l;} parse(e: ref Env){	y := ref YYENV;	y.yyenv = e;	y.yysys = lib->sys;	y.yystderr = e.stderr;	yyeparse(y);} yyerror(e: ref YYENV, s: string){	e.yyenv.report(s);	e.yyenv.suck();} yyelex(e: ref YYENV): int{	return e.yyenv.lex(e.yylval);}yyexca := array[] of {-1, 1,	1, -1,	-2, 0,-1, 2,	1, 1,	-2, 0,-1, 21,	24, 51,	25, 51,	-2, 48,};YYNPROD: con 75;YYPRIVATE: con 57344;yytoknames: array of string;yystates: array of string;yydebug: con 0;YYLAST:	con 249;yyact := array[] of {   7,  20,   4,  49,  41,  47, 110,  65, 103,  95,  17,  24,  32, 112,  33, 146, 142,  38,  39,  28,  59,  60, 140, 129,  40,  64,  22,  46,  63,  35,  36,  34,  37, 128, 127,  38,  67,  69,  70,  71,  27,  26,  25,  76,  22,  75, 126, 111,  77,  74,  45,  80,  81,  38,  44,  78,  88,  89,  90,  91,  92,  68,  22,  98,  99,  93,  94,  32, 124,  33,  97, 106,  62, 107,  38,  39, 104, 108, 109, 104,  68,  40, 105,  22,  66, 105,  56, 143,  55, 116, 117, 118, 119, 120,  73,  32,  32,  33,  33,  38,  39, 122, 132,  36, 131,  37,  40, 123,  22,  72, 125,  56,  43,  55, 135, 136,  58,  57, 133,  62, 134, 139,  38,   6,  62,  16,  13,  14,  15, 141,  66,  22,  96,  67,  69,  62,  32,  79,  33,  84,  83,  21,  24,  61, 147, 148, 144,  24, 149,  11,  22,   3,  12,  16,  13,  14,  15,  18,   2,  19,   1,   5,  85,  87,  86,  84,  83,   8, 101,  21,  54,  51,  52,  53,  48,  39,   9,  11,  22,  82,  12,  40,  42,  50, 137,  18,  56,  19,  55,  54,  51,  52,  53,  48,  39, 115, 138,  38,  39, 130,  40,  10,  50,  29,  40,  56,  22,  55, 102,  56,  31,  55,  85,  87,  86,  84,  83, 121,  23,  30,  85,  87,  86,  84,  83, 114,   0, 145,  85,  87,  86,  84,  83, 113,   0,   0,  85,  87,  86,  84,  83, 100,   0,   0,  85,  87,  86,  84,  83,};yypact := array[] of {-1000,-1000, 121,-1000,-1000,-1000,-1000,   1,-1000,-1000,  -3,-1000,  84,  25,  21,  -2, 173,  92,  15,  15, 120,-1000, 173,-1000, 149,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 109,-1000, 102,  33,  15,  15,-1000,  81,  66,  19, 149,-1000, 117, 173, 173, 151,-1000,-1000, 173, 173, 173, 173, 173,  56,  52,-1000,-1000, 104, 104,  15,  15, 233,-1000,  54,-1000, 109,-1000, 109, 109, 109,-1000,-1000,-1000,-1000,   1,  17, -24,-1000, 225, 217,-1000, 173, 173, 173, 173, 173, 209,-1000,-1000,-1000,-1000, 177, 177,-1000,-1000,-1000,  57,-1000,-1000,-1000,-1000,-1000,  40,-1000,  16,   4,   3,  -7,  70,-1000,-1000, 149, 149, 154,-1000, 125, 125, 125, 125,-1000,  -8,-1000,-1000, -14,-1000,-1000,-1000,-1000,-1000,  15,  15,  70,  79, 137, 132,-1000,-1000, 201,-1000, -15,-1000, 149, 149, 149,-1000, 132, 132,-1000,};yypgo := array[] of {   0, 218, 203,   3, 208,   1, 199,  10, 201,   7, 196, 195,   0,   2,   4, 182, 176,   6,   5,   8, 168,   9, 167, 160, 158, 151,};yyr1 := array[] of {   0,  23,  24,  24,  25,  25,  25,  15,  15,  13,  14,  14,  12,  12,  12,  22,  22,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  16,  19,  19,  20,  20,  21,  21,  11,  11,  10,   8,   8,   2,   2,   4,   4,   3,   3,   3,   3,   5,   5,   5,   7,   9,   9,  17,  17,   6,   6,   6,   6,   1,   1,   1,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,};yyr2 := array[] of {   0,   1,   0,   2,   1,   1,   1,   0,   2,   2,   1,   2,   1,   1,   3,   1,   4,   4,   5,   7,   5,   7,   5,   5,   3,   3,   3,   3,   4,   4,   3,   0,   1,   0,   3,   0,   2,   3,   1,   2,   1,   1,   1,   1,   4,   4,   4,   4,   1,   3,   3,   1,   0,   2,   0,   2,   2,   2,   2,   2,   1,   1,   1,   1,   1,   3,   3,   2,   2,   2,   2,   3,   3,   3,   3,};yychk := array[] of {-1000, -23, -24, -25, -13,  40,   2, -12, -22, -16,  -8,  28,  31,   5,   6,   7,   4,  -7,  36,  38,  -5,  20,  29,  -1,  10,  41,  40,  39,  22,  -2,  -4,  -6,  -5,  -3,  34,  32,  33,  35,  20,  21,  27, -14, -15,  28,  29,  29,  29, -18,  20,  -3,  29,  17,  18,  19,  16,  34,  32,  25,  24,  -5,  -5,  23,  15, -18, -12,  -9,  28,  -5,  28,  -5,  -5,  -5,  28,  28,  30, -13, -12, -14,  -7,  20, -18, -18,  28,  15,  14,  11,  13,  12, -18, -18, -18, -18, -18,  -9,  -9, -21,  28, -21,  -5,  -5,   8, -20,  -4, -19,  22,  28, -14, -14, -14, -14, -17,  30,  37,   8,   8, -11, -18, -18, -18, -18, -18,   8, -14, -19,  28, -14,  30,  30,  30,  30,  -6,  34,  32, -17,  -9, -12, -12,  30, -10, -18,  30, -14,  30,   8,   9,  26,  30, -12, -12, -13,};yydef := array[] of {   2,  -2,  -2,   3,   4,   5,   6,   0,  12,  13,  15,   7,   0,   0,   0,   0,   0,   0,   0,   0,  38,  -2,   0,   9,   0,  60,  61,  62,  52,  39,  40,  41,  42,  43,   0,   0,   0,   0,  48,   0,   0,   0,  10,   7,   0,   0,   0,   0,  63,  64,   0,   0,   0,   0,   0,   0,   0,  52,  52,  33,  33,   0,   0,   0,  14,  31,   7,  56,   7,  57,  58,  59,   7,   7,  54,   8,  11,   0,   0,  51,   0,   0,  35,   0,   0,   0,   0,   0,   0,  67,  68,  69,  70,  24,  25,  26,   7,  27,   0,  49,  50,  16,  53,  32,   0,   7,   0,   0,   0,   0,  17,  54,  52,   0,   0,   0,  66,  71,  72,  73,  74,  65,   0,  28,   7,   0,  46,  47,  44,  45,  55,   0,   0,  18,   0,  20,  22,  23,  36,   0,  34,   0,  30,   0,   0,   0,  29,  19,  21,  37,};yytok1 := array[] of {   1,};yytok2 := array[] of {   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,};yytok3 := array[] of {   0}; YYFLAG: con -1000; # parser for yacc outputYYENV: adt{	yylval:	ref YYSTYPE;	# lexical value	yyval:	YYSTYPE;		# goto value	yyenv:	YYETYPE;		# useer environment	yynerrs:	int;			# number of errors	yyerrflag:	int;			# error recovery flag	yysys:	Sys;	yystderr:	ref Sys->FD;}; yytokname(yyc: int): string{	if(yyc > 0 && yyc <= len yytoknames && yytoknames[yyc-1] != nil)		return yytoknames[yyc-1];	return "<"+string yyc+">";} yystatname(yys: int): string{	if(yys >= 0 && yys < len yystates && yystates[yys] != nil)		return yystates[yys];	return "<"+string yys+">\n";} yylex1(e: ref YYENV): int{	c, yychar : int;	yychar = yyelex(e);	if(yychar <= 0)		c = yytok1[0];	else if(yychar < len yytok1)		c = yytok1[yychar];	else if(yychar >= YYPRIVATE && yychar < YYPRIVATE+len yytok2)		c = yytok2[yychar-YYPRIVATE];	else{		n := len yytok3;		c = 0;		for(i := 0; i < n; i+=2) {			if(yytok3[i+0] == yychar) {				c = yytok3[i+1];				break;			}		}		if(c == 0)			c = yytok2[1];	# unknown char	}	if(yydebug >= 3)		e.yysys->fprint(e.yystderr, "lex %.4ux %s\n", yychar, yytokname(c));	return c;} YYS: adt{	yyv: YYSTYPE;	yys: int;}; yyparse(): int{	return yyeparse(nil);} yyeparse(e: ref YYENV): int{	if(e == nil)		e = ref YYENV;	if(e.yylval == nil)		e.yylval = ref YYSTYPE;	if(e.yysys == nil) {		e.yysys = load Sys "$Sys";		e.yystderr = e.yysys->fildes(2);	} 	yys := array[YYMAXDEPTH] of YYS; 	yystate := 0;	yychar := -1;	e.yynerrs = 0;	e.yyerrflag = 0;	yyp := -1;	yyn := 0; yystack:	for(;;){		# put a state and value onto the stack		if(yydebug >= 4)			e.yysys->fprint(e.yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate)); 		yyp++;		if(yyp >= YYMAXDEPTH) {			yyerror(e, "yacc stack overflow");			yyn = 1;			break yystack;		}		yys[yyp].yys = yystate;		yys[yyp].yyv = e.yyval; 		for(;;){			yyn = yypact[yystate];			if(yyn > YYFLAG) {	# simple state				if(yychar < 0)					yychar = yylex1(e);				yyn += yychar;				if(yyn >= 0 && yyn < YYLAST) {					yyn = yyact[yyn];					if(yychk[yyn] == yychar) { # valid shift						yychar = -1;						yyp++;						if(yyp >= YYMAXDEPTH) {							yyerror(e, "yacc stack overflow");							yyn = 1;							break yystack;						}						yystate = yyn;						yys[yyp].yys = yystate;						yys[yyp].yyv = *e.yylval;						if(e.yyerrflag > 0)							e.yyerrflag--;						if(yydebug >= 4)							e.yysys->fprint(e.yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate));						continue;					}				}			}					# default state action			yyn = yydef[yystate];			if(yyn == -2) {				if(yychar < 0)					yychar = yylex1(e);						# look through exception table				for(yyxi:=0;; yyxi+=2)					if(yyexca[yyxi] == -1 && yyexca[yyxi+1] == yystate)						break;				for(yyxi += 2;; yyxi += 2) {					yyn = yyexca[yyxi];					if(yyn < 0 || yyn == yychar)						break;				}				yyn = yyexca[yyxi+1];				if(yyn < 0){					yyn = 0;					break yystack;				}			} 			if(yyn != 0)				break; 			# error ... attempt to resume parsing			if(e.yyerrflag == 0) { # brand new error				yyerror(e, "syntax error");				e.yynerrs++;				if(yydebug >= 1) {					e.yysys->fprint(e.yystderr, "%s", yystatname(yystate));					e.yysys->fprint(e.yystderr, "saw %s\n", yytokname(yychar));				}			} 			if(e.yyerrflag != 3) { # incompletely recovered error ... try again				e.yyerrflag = 3;					# find a state where "error" is a legal shift action				while(yyp >= 0) {					yyn = yypact[yys[yyp].yys] + YYERRCODE;					if(yyn >= 0 && yyn < YYLAST) {						yystate = yyact[yyn];  # simulate a shift of "error"						if(yychk[yystate] == YYERRCODE) {							yychar = -1;							continue yystack;						}					}						# the current yyp has no shift on "error", pop stack					if(yydebug >= 2)						e.yysys->fprint(e.yystderr, "error recovery pops state %d, uncovers %d\n",							yys[yyp].yys, yys[yyp-1].yys );					yyp--;				}				# there is no state on the stack with an error shift ... abort				yyn = 1;				break yystack;			} 			# no shift yet; clobber input char			if(yydebug >= 2)				e.yysys->fprint(e.yystderr, "error recovery discards %s\n", yytokname(yychar));			if(yychar == YYEOFCODE) {				yyn = 1;				break yystack;			}			yychar = -1;			# try again in the same state		}			# reduction by production yyn		if(yydebug >= 2)			e.yysys->fprint(e.yystderr, "reduce %d in:\n\t%s", yyn, yystatname(yystate));			yypt := yyp;		yyp -= yyr2[yyn];#		yyval = yys[yyp+1].yyv;		yym := yyn;			# consult goto table to find next state		yyn = yyr1[yyn];		yyg := yypgo[yyn];		yyj := yyg + yys[yyp].yys + 1;			if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)			yystate = yyact[yyg];		case yym {			4=>#line	63	"mash.y"{ yys[yypt-0].yyv.cmd.xeq(e.yyenv); }7=>#line	69	"mash.y"{ e.yyval.cmd = nil; }8=>#line	71	"mash.y"{ e.yyval.cmd = Cmd.cmd2(Cseq, yys[yypt-1].yyv.cmd, yys[yypt-0].yyv.cmd); }9=>#line	75	"mash.y"{ e.yyval.cmd = yys[yypt-1].yyv.cmd.mkcmd(e.yyenv, yys[yypt-0].yyv.flag); }10=>e.yyval.cmd = yys[yyp+1].yyv.cmd;11=>#line	80	"mash.y"{ e.yyval.cmd = Cmd.cmd2(Cseq, yys[yypt-1].yyv.cmd, yys[yypt-0].yyv.cmd.mkcmd(e.yyenv, 0)); }12=>e.yyval.cmd = yys[yyp+1].yyv.cmd;13=>e.yyval.cmd = yys[yyp+1].yyv.cmd;14=>#line	86	"mash.y"{  e.yyval.cmd = Cmd.cmd2(Cpipe, yys[yypt-2].yyv.cmd, yys[yypt-0].yyv.cmd); }15=>#line	90	"mash.y"{ e.yyval.cmd = e.yyenv.mksimple(yys[yypt-0].yyv.items); }16=>#line	92	"mash.y"{				yys[yypt-0].yyv.cmd.words = e.yyenv.mklist(yys[yypt-1].yyv.items);				e.yyval.cmd = Cmd.cmd1w(Cdepend, yys[yypt-0].yyv.cmd, e.yyenv.mklist(yys[yypt-3].yyv.items));			}17=>#line	99	"mash.y"{ e.yyval.cmd = yys[yypt-0].yyv.cmd.cmde(Cgroup, yys[yypt-2].yyv.cmd, nil); }18=>#line	101	"mash.y"{ e.yyval.cmd = yys[yypt-0].yyv.cmd.cmde(Csubgroup, yys[yypt-2].yyv.cmd, nil); }19=>#line	103	"mash.y"{ e.yyval.cmd = Cmd.cmd1i(Cfor, yys[yypt-0].yyv.cmd, yys[yypt-4].yyv.item); e.yyval.cmd.words = lib->revitems(yys[yypt-2].yyv.items); }20=>#line	105	"mash.y"{ e.yyval.cmd = Cmd.cmd2(Cif, yys[yypt-2].yyv.cmd, yys[yypt-0].yyv.cmd); }21=>#line	107	"mash.y"

Lines 1–500 of 662.