|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 23983 (0x5daf) Types: TextFile Notes: UNIX file Names: »gram.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─ ⟦this⟧ »cmd/bc/gram.c«
#line 4 "gram.y" #include <stdio.h> #include "bc.h" #define YYTNAMES static code *breakloc = NULL, /* where to go on break statement */ *contloc = NULL; /* where to go on continue statement */ static dicent *retfrom = NULL, /* what function to return from */ **dvec, /* list of locals */ **pardvec, /* list of formal parameters */ **autdvec; /* list of automatic variables */ static int ldvec, /* length of dvec */ lpardvec, /* length of pardvec */ lautdvec; /* length of autdvec */ #include "yy.h" #define YYCLEARIN yychar = -1000 #define YYERROK yyerrflag = 0 extern int yychar; extern short yyerrflag; #ifndef YYMAXDEPTH #define YYMAXDEPTH 150 #endif YYSTYPE yyval, yylval; #line 672 "gram.y" /* * Yyerror is the error routine called on a syntax error by * yyparse. */ yyerror(m) char *m; { register struct yytname *ptr; fprintf(stderr,"%s", m); for (ptr = yytnames; ptr->tn_name != NULL; ++ptr) if (ptr->tn_val == yychar) { fprintf(stderr," at %s", ptr->tn_name); break; } fprintf(stderr,"\n"); allok = FALSE; } #ifdef YYTNAMES struct yytname yytnames[55] = { "$end", -1, "error", -2, "NUMBER", 256, "STRING", 257, "IDENTIFIER", 258, "ADDAB", 259, "AUTO", 260, "BREAK", 261, "CONTINUE", 262, "DECR", 307, "DEFINE", 264, "DIVAB", 265, "DO", 266, "DOT", 267, "ELSE", 268, "EQP", 269, "ERROR", 270, "EXPAB", 271, "FOR", 272, "GEP", 273, "GTP", 274, "IBASE", 275, "IF", 276, "INCR", 306, "LENGTH_", 278, "LEP", 279, "LTP", 280, "MULAB", 281, "NEP", 282, "OBASE", 283, "QUIT", 284, "REMAB", 285, "RETURN_", 286, "SCALE_", 287, "SQRT_", 288, "SUBAB", 289, "WHILE", 290, "'='", 61, "'+'", 43, "'-'", 45, "'*'", 42, "'/'", 47, "'%'", 37, "'^'", 94, "UMINUS", 308, "'\\n'", 10, "'('", 40, "')'", 41, "';'", 59, "'$'", 36, "'{'", 123, "'}'", 125, "','", 44, "'['", 91, "']'", 93, NULL, } ; #endif unsigned yypdnt[109] = { 00, 01, 01, 01, 01, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 02, 014, 014, 020, 020, 05, 05, 013, 013, 021, 021, 011, 012, 010, 06, 03, 022, 023, 023, 025, 025, 026, 026, 027, 027, 024, 024, 015, 015, 016, 016, 016, 016, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 017, 030, 030, 037, 037, 035, 035, 040, 040, 031, 033, 033, 033, 034, 034, 034, 032, 032, 032, 032, 032, 032, 036, 036, 036, 07, 07, 04, 04, 041, 041, 041, 041, 041, 041, } ; unsigned yypn[109] = { 02, 00, 02, 02, 03, 06, 012, 020, 016, 02, 02, 02, 03, 02, 02, 03, 02, 03, 03, 02, 01, 01, 01, 00, 02, 00, 04, 00, 01, 01, 03, 00, 00, 00, 00, 012, 02, 00, 01, 00, 03, 01, 03, 01, 03, 00, 01, 01, 01, 03, 04, 03, 03, 01, 01, 01, 01, 04, 02, 02, 02, 02, 02, 02, 02, 02, 02, 03, 03, 03, 03, 03, 03, 03, 04, 01, 04, 01, 03, 00, 01, 01, 03, 00, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 01, 00, 03, 00, 03, 01, 01, 01, 01, 01, 01, } ; unsigned yypgo[34] = { 00, 00, 02, 020, 022, 024, 026, 034, 042, 050, 072, 0106, 0112, 0144, 0176, 0220, 0274, 0300, 0302, 0304, 0306, 0310, 0312, 0320, 0322, 0362, 0364, 0370, 0372, 0432, 0434, 0436, 0442, 0444, } ; unsigned yygo[296] = { 0176030, 01, 01, 035, 0210, 0234, 0253, 0260, 0262, 0270, 0263, 0271, 0310, 0311, 0176030, 0160, 0176030, 036, 0176030, 0152, 0176030, 0247, 0205, 0231, 0267, 0275, 0176030, 077, 0232, 0245, 0301, 0303, 0176030, 0220, 0236, 0250, 0254, 0261, 0176030, 0146, 0146, 0205, 0231, 0244, 0246, 0255, 0250, 0256, 0261, 0267, 0271, 0276, 0304, 0306, 0311, 0312, 0176030, 065, 0244, 0253, 0255, 0262, 0256, 0263, 0274, 0301, 0306, 0310, 0176030, 0232, 0275, 0302, 0176030, 0147, 05, 051, 07, 054, 010, 055, 023, 072, 024, 073, 040, 0106, 041, 0116, 050, 0137, 074, 0154, 0115, 0167, 0272, 0277, 0305, 0307, 0176030, 037, 024, 074, 032, 0104, 052, 0141, 066, 0150, 0122, 0174, 0124, 0176, 0135, 0177, 0136, 0200, 0175, 0225, 0203, 0141, 0207, 0233, 0275, 0150, 0176030, 0145, 01, 040, 0105, 040, 0210, 040, 0253, 040, 0262, 040, 0263, 040, 0273, 040, 0310, 040, 0176030, 075, 01, 041, 030, 0101, 067, 0153, 0105, 041, 0107, 0161, 0110, 0162, 0111, 0163, 0112, 0164, 0113, 0165, 0114, 0166, 0155, 0221, 0210, 041, 0217, 0235, 0232, 0221, 0237, 0251, 0253, 041, 0262, 041, 0263, 041, 0273, 041, 0301, 0221, 0310, 041, 0176030, 076, 0265, 0273, 0176030, 0105, 0176030, 0151, 0176030, 042, 0176030, 0171, 0176030, 0242, 0176030, 0265, 0224, 0243, 0264, 0272, 0176030, 0172, 0176030, 0173, 011, 062, 020, 070, 030, 0102, 067, 0102, 0107, 0102, 0110, 0102, 0111, 0102, 0112, 0102, 0113, 0102, 0114, 0102, 0155, 0102, 0217, 0102, 0232, 0102, 0237, 0102, 0301, 0102, 0176030, 043, 0176030, 0123, 0123, 0175, 0176030, 0135, 0176030, 044, 011, 063, 020, 071, 030, 0103, 067, 0103, 0107, 0103, 0110, 0103, 0111, 0103, 0112, 0103, 0113, 0103, 0114, 0103, 0155, 0103, 0217, 0103, 0232, 0103, 0237, 0103, 0301, 0103, 0176030, 045, 0176030, 0142, 0176030, 046, 0203, 0230, 0176030, 0143, 0176030, 0144, 0221, 0237, 0176030, 0217, } ; unsigned yypa[203] = { 00, 02, 070, 074, 0100, 0102, 0112, 0120, 0120, 0126, 0140, 0144, 0146, 0150, 0154, 0160, 0126, 0164, 0166, 0120, 0172, 0230, 0236, 0240, 0242, 0274, 0276, 0330, 0332, 0334, 0336, 0340, 0120, 0342, 0366, 0372, 0416, 0422, 0444, 0450, 0120, 0452, 0454, 0276, 0506, 0510, 0512, 0516, 0520, 0522, 0524, 0526, 0530, 0532, 0534, 0566, 0620, 0622, 0624, 0626, 0120, 0630, 0632, 0650, 0654, 0660, 0662, 0670, 0676, 0702, 0766, 0242, 0242, 0242, 0242, 0242, 0242, 0120, 0770, 0772, 0776, 01000, 0276, 01002, 0276, 01020, 01022, 01024, 01026, 01030, 01032, 01034, 01036, 0276, 0276, 01040, 01042, 01050, 01052, 01056, 01060, 01064, 0144, 01070, 01074, 01076, 01102, 01106, 01140, 01142, 01174, 01176, 01200, 01202, 01214, 01226, 01232, 01236, 01242, 01246, 01250, 01254, 01260, 01262, 01266, 0276, 01270, 01272, 01274, 01300, 01334, 01336, 01370, 0240, 01372, 0276, 01374, 01456, 01460, 01462, 01464, 01466, 01470, 0242, 01472, 01106, 01476, 01502, 01506, 01512, 01514, 01516, 01520, 0144, 01142, 01522, 01524, 01530, 0532, 0242, 01546, 01550, 01552, 01556, 01560, 01562, 0144, 01566, 0144, 01570, 01606, 01374, 0532, 01560, 01560, 01612, 01616, 0144, 01374, 01374, 01506, 0332, 01622, 0240, 01626, 0144, 0120, 01630, 01560, 0534, 01714, 01716, 01720, 01142, 01722, 01726, 0144, 0120, 01560, 01732, 01374, 0144, 01734, } ; unsigned yyact[990] = { 020001, 0176030, 02, 0177777, 04, 0400, 05, 0401, 06, 0402, 07, 0405, 010, 0406, 011, 0463, 012, 0410, 013, 0412, 014, 0413, 015, 0420, 016, 0423, 017, 0424, 020, 0462, 021, 0426, 022, 0433, 023, 0434, 024, 0436, 025, 0437, 026, 0440, 027, 0442, 030, 055, 031, 012, 032, 050, 033, 073, 034, 0173, 03, 0176030, 040000, 0177777, 060000, 0176030, 047, 012, 060000, 0176030, 020065, 0176030, 031, 012, 033, 073, 050, 044, 060000, 0176030, 052, 050, 053, 0133, 020113, 0176030, 031, 012, 033, 073, 060000, 0176030, 056, 0402, 057, 0423, 060, 0433, 061, 0437, 060000, 0176030, 064, 0402, 060000, 0176030, 020037, 0176030, 020066, 0176030, 066, 050, 060000, 0176030, 020124, 075, 020127, 0176030, 067, 050, 060000, 0176030, 020141, 0176030, 020125, 075, 020130, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 031, 012, 032, 050, 033, 073, 060000, 0176030, 020126, 075, 020142, 050, 020131, 0176030, 020140, 0176030, 020042, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 057, 0423, 020, 0462, 021, 0426, 060, 0433, 0100, 0437, 026, 0440, 030, 055, 032, 050, 060000, 0176030, 020026, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 032, 050, 060000, 0176030, 020025, 0176030, 020027, 0176030, 020002, 0176030, 020003, 0176030, 020024, 0176030, 0107, 053, 0110, 055, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 031, 012, 033, 073, 0115, 044, 060000, 0176030, 0117, 050, 060000, 0176030, 0120, 0463, 0121, 0462, 0122, 075, 020123, 0403, 020123, 0411, 020123, 0417, 020123, 0431, 020123, 0435, 020123, 0441, 020067, 0176030, 0124, 075, 060000, 0176030, 0125, 0403, 0126, 0463, 0127, 0411, 0130, 0417, 0131, 0462, 0132, 0431, 0133, 0435, 0134, 0441, 020070, 0176030, 0136, 050, 060000, 0176030, 020004, 0176030, 020020, 0176030, 04, 0400, 0140, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 032, 050, 020117, 0176030, 020011, 0176030, 020012, 0176030, 053, 0133, 020113, 0176030, 020127, 0176030, 020130, 0176030, 020131, 0176030, 020074, 0176030, 020075, 0176030, 020044, 0176030, 020041, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 032, 050, 020033, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 057, 0423, 020, 0462, 021, 0426, 060, 0433, 0100, 0437, 026, 0440, 030, 055, 032, 050, 020145, 0176030, 020072, 0176030, 020073, 0176030, 020023, 0176030, 020013, 0176030, 020057, 0176030, 0107, 053, 0110, 055, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 020060, 0176030, 0155, 050, 060000, 0176030, 020142, 050, 020131, 0176030, 020102, 0176030, 0120, 0463, 0121, 0462, 020067, 0176030, 0126, 0463, 0131, 0462, 020070, 0176030, 0156, 051, 060000, 0176030, 04, 0400, 05, 0401, 06, 0402, 07, 0405, 010, 0406, 011, 0463, 013, 0412, 014, 0413, 015, 0420, 016, 0423, 017, 0424, 020, 0462, 021, 0426, 022, 0433, 023, 0434, 024, 0436, 025, 0437, 026, 0440, 027, 0442, 030, 055, 031, 012, 032, 050, 033, 073, 034, 0173, 0157, 0175, 060000, 0176030, 020015, 0176030, 020016, 0176030, 0170, 0402, 020045, 0176030, 020100, 0176030, 020076, 0176030, 0125, 0403, 0127, 0411, 0130, 0417, 0132, 0431, 0133, 0435, 0134, 0441, 060000, 0176030, 020132, 0176030, 020101, 0176030, 020135, 0176030, 020137, 0176030, 020077, 0176030, 020134, 0176030, 020136, 0176030, 020133, 0176030, 020021, 0176030, 052, 050, 0201, 0133, 020113, 0176030, 020115, 0176030, 0202, 051, 060000, 0176030, 020121, 0176030, 0203, 054, 020120, 0176030, 0204, 0135, 060000, 0176030, 0206, 073, 060000, 0176030, 020035, 0176030, 0207, 054, 020034, 0176030, 0210, 051, 060000, 0176030, 0211, 0415, 0212, 0421, 0213, 0422, 0214, 0427, 0215, 0430, 0216, 0432, 0107, 053, 0110, 055, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 060000, 0176030, 020014, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 057, 0423, 020, 0462, 021, 0426, 060, 0433, 0100, 0437, 026, 0440, 030, 055, 032, 050, 020143, 0176030, 020111, 0176030, 020022, 0176030, 020030, 0176030, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 020107, 0176030, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 020110, 0176030, 0114, 0136, 020104, 0176030, 0114, 0136, 020105, 0176030, 0114, 0136, 020106, 0176030, 0114, 0136, 020103, 0176030, 020017, 0176030, 0222, 0133, 020053, 0176030, 0223, 051, 060000, 0176030, 020046, 0176030, 0224, 054, 020051, 0176030, 020061, 0176030, 020063, 0176030, 020064, 0176030, 0226, 051, 060000, 0176030, 04, 0400, 06, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 032, 050, 0227, 0135, 060000, 0176030, 020071, 0176030, 04, 0400, 0140, 0402, 011, 0463, 014, 0413, 016, 0423, 020, 0462, 021, 0426, 022, 0433, 025, 0437, 026, 0440, 030, 055, 032, 050, 060000, 0176030, 020114, 0176030, 020040, 0176030, 04, 0400, 05, 0401, 06, 0402, 07, 0405, 010, 0406, 011, 0463, 013, 0412, 014, 0413, 015, 0420, 016, 0423, 017, 0424, 020, 0462, 021, 0426, 022, 0433, 023, 0434, 024, 0436, 025, 0437, 026, 0440, 027, 0442, 030, 055, 031, 012, 032, 050, 033, 073, 034, 0173, 060000, 0176030, 020151, 0176030, 020152, 0176030, 020153, 0176030, 020150, 0176030, 020147, 0176030, 020154, 0176030, 0236, 051, 060000, 0176030, 0240, 0135, 060000, 0176030, 0241, 012, 020055, 0176030, 0170, 0402, 060000, 0176030, 020062, 0176030, 020112, 0176030, 020116, 0176030, 020122, 0176030, 020036, 0176030, 0246, 0414, 020031, 0176030, 0107, 053, 0110, 055, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 020146, 0176030, 020054, 0176030, 020056, 0176030, 0252, 0173, 060000, 0176030, 020052, 0176030, 020040, 0176030, 0254, 073, 060000, 0176030, 020005, 0176030, 0107, 053, 0110, 055, 0111, 052, 0112, 057, 0113, 045, 0114, 0136, 020144, 0176030, 0257, 012, 060000, 0176030, 0264, 0404, 020047, 0176030, 0266, 0442, 060000, 0176030, 0274, 050, 060000, 0176030, 020032, 0176030, 04, 0400, 05, 0401, 06, 0402, 07, 0405, 010, 0406, 011, 0463, 013, 0412, 014, 0413, 015, 0420, 016, 0423, 017, 0424, 020, 0462, 021, 0426, 022, 0433, 023, 0434, 024, 0436, 025, 0437, 026, 0440, 027, 0442, 030, 055, 031, 012, 032, 050, 033, 073, 034, 0173, 0300, 0175, 060000, 0176030, 020006, 0176030, 020050, 0176030, 020043, 0176030, 0304, 051, 060000, 0176030, 0305, 051, 060000, 0176030, 020010, 0176030, 020007, 0176030, } ; #include "action.h" #define YYNOCHAR (-1000) #define yyerrok yyerrflag=0 #define yyclearin yylval=YYNOCHAR int yystack[YYMAXDEPTH]; YYSTYPE yyvstack[YYMAXDEPTH], *yyv; int yychar; int yydebug = 0; /* No sir, not in the BSS */ short yyerrflag; int *yys; yyparse() { register YYSTYPE *yypvt; int act; register unsigned *ip, yystate; int pno; yystate = 0; yychar = YYNOCHAR; yyv = &yyvstack[-1]; yys = &yystack[-1]; stack: if( ++yys >= &yystack[YYMAXDEPTH] ) { fprintf(stderr, "Stack overflow\n"); exit(1); } *yys = yystate; *++yyv = yyval; if( yydebug ) fprintf(stdout, "Stack state %d, char %d\n", yystate, yychar); read: ip = &yyact[yypa[yystate]]; if( ip[1] != YYNOCHAR ) { if( yychar == YYNOCHAR ) { yychar = yylex(); if( yydebug ) fprintf(stdout, "lex read char %d, val %d\n", yychar, yylval); } while (ip[1]!=YYNOCHAR) { if (ip[1]==yychar) break; ip += 2; } } act = ip[0]; switch( act>>YYACTSH ) { case YYSHIFTACT: if( ip[1]==YYNOCHAR ) goto YYerract; if( yychar != -1 ) yychar = YYNOCHAR; /* dont throw away EOF */ yystate = act&YYAMASK; yyval = yylval; if( yydebug ) fprintf(stdout, "shift %d\n", yystate); if( yyerrflag ) --yyerrflag; goto stack; case YYACCEPTACT: if( yydebug ) fprintf(stdout, "accept\n"); return(0); case YYERRACT: YYerract: switch (yyerrflag) { case 0: yyerror("Syntax error"); case 1: case 2: yyerrflag = 3; while( yys >= & yystack[0] ) { ip = &yyact[yypa[*yys]]; while( ip[1]!=YYNOCHAR ) ip += 2; if( (*ip&~YYAMASK) == (YYSHIFTACT<<YYACTSH) ) { yystate = *ip&YYAMASK; goto stack; } if( yydebug ) fprintf(stderr, "error recovery leaves state %d, uncovers %d\n", *yys, yys[-1]); yys--; yyv--; } if( yydebug ) fprintf(stderr, "no shift on error; abort\n"); return(1); case 3: if( yydebug ) fprintf(stderr, "Error recovery clobbers char %o\n", yychar); if( yychar==YYEOFVAL ) return(1); yychar = YYNOCHAR; goto read; } case YYREDACT: pno = act&YYAMASK; if( yydebug ) fprintf(stdout, "reduce %d\n", pno); yypvt = yyv; yyv -= yypn[pno]; yys -= yypn[pno]; yyval = yyv[1]; switch(pno) { case 2: { #line 62 "gram.y" emitop(STOP); if (allok) interp(); loc = cstream; allok = TRUE; breakloc = contloc = retfrom = NULL; }break; case 3: { #line 70 "gram.y" emitop(PGLSC); emitnum(&zero); emitop(LOAD); emitop(RETURN); emitid(retfrom); if (allok) { install(&retfrom->globalv.fvalue, pardvec, lpardvec, autdvec, lautdvec); mpfree(pardvec); mpfree(autdvec); } loc = cstream; allok = TRUE; breakloc = contloc = retfrom = NULL; }break; case 4: { #line 86 "gram.y" YYERROK; loc = cstream; allok = TRUE; breakloc = contloc = retfrom = NULL; }break; case 5: { #line 117 "gram.y" /* $6 */ patch(yypvt[-3].location, yypvt[0].location); }break; case 6: { #line 133 "gram.y" /* $10 */ patch(yypvt[-6].location, yypvt[-2].location); patch(yypvt[-3].location, loc); patch(yypvt[0].location, contloc); breakloc = yypvt[-4].location; /* restore break */ contloc = yypvt[-8].location; /* restore continue */ }break; case 7: { #line 159 "gram.y" /* $16 */ patch(yypvt[-10].location, yypvt[-2].location); patch(yypvt[-7].location, loc); patch(yypvt[-3].location, yypvt[-11].location); patch(yypvt[0].location, contloc); breakloc = yypvt[-8].location; contloc = yypvt[-6].location; }break; case 8: { #line 182 "gram.y" /* $11 */ patch(yypvt[-12].location, yypvt[-7].location); patch(yypvt[-10].location, loc); patch(yypvt[-8].location, yypvt[-3].location); patch(yypvt[-2].location, yypvt[-7].location); breakloc = yypvt[-11].location; contloc = yypvt[-9].location; }break; case 9: { #line 190 "gram.y" if (breakloc == NULL) gerror("Break not in loop"); emitop(BRALW); emitaddr(breakloc); }break; case 10: { #line 196 "gram.y" if (contloc == NULL) gerror("Continue not in loop"); emitop(BRALW); emitaddr(contloc); }break; case 11: { #line 202 "gram.y" if (retfrom == NULL) gerror("Return not in function"); emitop(PGLSC); emitnum(&zero); emitop(LOAD); emitop(RETURN); emitid(retfrom); }break; case 12: { #line 211 "gram.y" if (retfrom == NULL) gerror("Return not in function"); emitop(RETURN); emitid(retfrom); }break; case 13: { #line 217 "gram.y" emitop(POP); }break; case 14: { #line 220 "gram.y" emitop(PRNUM); emitop(PRNL); }break; case 15: { #line 224 "gram.y" emitop(PRNUM); }break; case 16: { #line 227 "gram.y" emitop(PRSTR); emitstr(yypvt[-1].svalue); emitop(PRNL); }break; case 17: { #line 232 "gram.y" emitop(PRSTR); emitstr(yypvt[-2].svalue); }break; case 19: { #line 237 "gram.y" return(0); }break; case 25: { #line 257 "gram.y" yyval.location = loc; }break; case 26: { #line 260 "gram.y" yyval.location = yypvt[-1].location; patch(yypvt[-2].location, loc); }break; case 29: { #line 274 "gram.y" emitop(POP); }break; case 30: { #line 277 "gram.y" emitop(POP); }break; case 31: { #line 284 "gram.y" emitop(BRALW); yyval.location = emitzap; }break; case 32: { #line 292 "gram.y" yyval.location = loc; }break; case 33: { #line 299 "gram.y" yyval.location = breakloc; breakloc = loc; }break; case 34: { #line 307 "gram.y" yyval.location = contloc; contloc = loc; }break; case 36: { #line 326 "gram.y" chkfunc(yypvt[0].dvalue); retfrom = yypvt[0].dvalue; ldvec = 0; }break; case 37: { #line 335 "gram.y" pardvec = NULL; lpardvec = 0; }break; case 38: { #line 339 "gram.y" pardvec = dvec; lpardvec = ldvec; locaddr(pardvec, lpardvec, 0); ldvec = 0; }break; case 39: { #line 349 "gram.y" autdvec = NULL; lautdvec = 0; }break; case 40: { #line 353 "gram.y" autdvec = dvec; lautdvec = ldvec; locaddr(autdvec, lautdvec, lpardvec); }break; case 41: { #line 362 "gram.y" dvec = (dicent **)mpalc(ldvec * sizeof (*dvec)); dvec += ldvec; *--dvec = yypvt[0].dvalue; }break; case 42: { #line 367 "gram.y" *--dvec = yypvt[-2].dvalue; }break; case 43: { #line 374 "gram.y" if (yypvt[0].dvalue->localt != UNDEFINED) gerror("Attempt to redeclare %s", yypvt[0].dvalue->word); yypvt[0].dvalue->localt = SCALAR; ++ldvec; /* $$ = $1 */ }break; case 44: { #line 381 "gram.y" if (yypvt[-2].dvalue->localt != UNDEFINED) gerror("Attempt to redeclare %s", yypvt[-2].dvalue->word); yypvt[-2].dvalue->localt = ARRAY; ++ldvec; /* $$ = $1 */ }break; case 49: { #line 408 "gram.y" emitop(STORE); }break; case 50: { #line 411 "gram.y" emitop(yypvt[-1].opcode); emitop(STORE); }break; case 51: { #line 415 "gram.y" emitop(yypvt[-2].opcode); }break; case 52: { #line 418 "gram.y" emitop(yypvt[-1].opcode); emitop(yypvt[-2].opcode); }break; case 53: { #line 426 "gram.y" emitop(PGLSC); emitnum(yypvt[0].lvalue); emitop(LOAD); }break; case 54: { #line 431 "gram.y" emitop(PGLSC); emitnum(&dot); emitop(LOAD); }break; case 55: { #line 436 "gram.y" emitop(LOAD); }break; case 57: { #line 440 "gram.y" chkfunc(yypvt[-3].dvalue); emitop(CALL); emitid(yypvt[-3].dvalue); emitcnt(yypvt[-1].ivalue); }break; case 58: { #line 446 "gram.y" emitop(PRVAL); emitop(INC); emitop(STORE); }break; case 59: { #line 451 "gram.y" emitop(INC); emitop(yypvt[0].opcode); }break; case 60: { #line 455 "gram.y" emitop(PRVAL); emitop(DEC); emitop(STORE); }break; case 61: { #line 460 "gram.y" emitop(DEC); emitop(yypvt[0].opcode); }break; case 62: { #line 464 "gram.y" emitop(PRVAL); emitop(INC); emitop(STORE); emitop(DEC); }break; case 63: { #line 470 "gram.y" emitop(INC); emitop(yypvt[-1].opcode); emitop(DEC); }break; case 64: { #line 475 "gram.y" emitop(PRVAL); emitop(DEC); emitop(STORE); emitop(INC); }break; case 65: { #line 481 "gram.y" emitop(DEC); emitop(yypvt[-1].opcode); emitop(INC); }break; case 66: { #line 486 "gram.y" emitop(NEG); }break; case 67: { #line 489 "gram.y" emitop(EXP); }break; case 68: { #line 492 "gram.y" emitop(MUL); }break; case 69: { #line 495 "gram.y" emitop(DIV); }break; case 70: { #line 498 "gram.y" emitop(REM); }break; case 71: { #line 501 "gram.y" emitop(ADD); }break; case 72: { #line 504 "gram.y" emitop(SUB); }break; case 74: { #line 508 "gram.y" emitop(yypvt[-3].opcode); }break; case 75: { #line 515 "gram.y" sload(yypvt[0].dvalue); }break; case 76: { #line 518 "gram.y" aeload(yypvt[-3].dvalue); }break; case 78: { #line 526 "gram.y" arload(yypvt[-2].dvalue); }break; case 79: { #line 533 "gram.y" yyval.ivalue = 0; }break; case 81: { #line 542 "gram.y" yyval.ivalue = 1; }break; case 82: { #line 545 "gram.y" yyval.ivalue = yypvt[-2].ivalue + 1; }break; case 83: { #line 552 "gram.y" emitop(PRVAL); }break; case 84: { #line 559 "gram.y" yyval.opcode = SIBASE; }break; case 85: { #line 562 "gram.y" yyval.opcode = SOBASE; }break; case 86: { #line 565 "gram.y" yyval.opcode = SSCALE; }break; case 87: { #line 572 "gram.y" emitop(LIBASE); yyval.opcode = SIBASE; }break; case 88: { #line 576 "gram.y" emitop(LOBASE); yyval.opcode = SOBASE; }break; case 89: { #line 580 "gram.y" emitop(LSCALE); yyval.opcode = SSCALE; }break; case 90: { #line 588 "gram.y" yyval.opcode = ADD; }break; case 91: { #line 591 "gram.y" yyval.opcode = SUB; }break; case 92: { #line 594 "gram.y" yyval.opcode = MUL; }break; case 93: { #line 597 "gram.y" yyval.opcode = DIV; }break; case 94: { #line 600 "gram.y" yyval.opcode = REM; }break; case 95: { #line 603 "gram.y" yyval.opcode = EXP; }break; case 96: { #line 610 "gram.y" yyval.opcode = SQRT; }break; case 97: { #line 613 "gram.y" yyval.opcode = LENGTH; }break; case 98: { #line 616 "gram.y" yyval.opcode = SCALE; }break; case 99: { #line 627 "gram.y" emitop(BRALW); yyval.location = emitzap; }break; case 100: { #line 631 "gram.y" emitop(yypvt[-1].opcode); yyval.location = emitzap; }break; case 101: { #line 639 "gram.y" emitop(BRNEV); yyval.location = emitzap; }break; case 102: { #line 643 "gram.y" emitop(negate(yypvt[-1].opcode)); yyval.location = emitzap; }break; case 103: { #line 651 "gram.y" yyval.opcode = BRLT; }break; case 104: { #line 654 "gram.y" yyval.opcode = BRLE; }break; case 105: { #line 657 "gram.y" yyval.opcode = BREQ; }break; case 106: { #line 660 "gram.y" yyval.opcode = BRGE; }break; case 107: { #line 663 "gram.y" yyval.opcode = BRGT; }break; case 108: { #line 666 "gram.y" yyval.opcode = BRNE; }break; } ip = &yygo[ yypgo[yypdnt[pno]] ]; while( *ip!=*yys && *ip!=YYNOCHAR ) ip += 2; yystate = ip[1]; goto stack; } }