home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OS2-YACC.ZIP / WEB2C.C < prev    next >
C/C++ Source or Header  |  1989-10-03  |  45KB  |  1,661 lines

  1. /*
  2.  * Created by CSD YACC (IBM PC) from "web2c.Y" */
  3. # define array_tok 257
  4. # define begin_tok 258
  5. # define case_tok 259
  6. # define const_tok 260
  7. # define do_tok 261
  8. # define downto_tok 262
  9. # define else_tok 263
  10. # define end_tok 264
  11. # define file_tok 265
  12. # define for_tok 266
  13. # define function_tok 267
  14. # define goto_tok 268
  15. # define if_tok 269
  16. # define label_tok 270
  17. # define of_tok 271
  18. # define procedure_tok 272
  19. # define program_tok 273
  20. # define record_tok 274
  21. # define repeat_tok 275
  22. # define then_tok 276
  23. # define to_tok 277
  24. # define type_tok 278
  25. # define until_tok 279
  26. # define var_tok 280
  27. # define while_tok 281
  28. # define integer_tok 282
  29. # define real_tok 283
  30. # define others_tok 284
  31. # define r_num_tok 285
  32. # define i_num_tok 286
  33. # define string_literal_tok 287
  34. # define single_char_tok 288
  35. # define assign_tok 289
  36. # define two_dots_tok 290
  37. # define unknown_tok 291
  38. # define undef_id_tok 292
  39. # define var_id_tok 293
  40. # define proc_id_tok 294
  41. # define proc_param_tok 295
  42. # define fun_id_tok 296
  43. # define fun_param_tok 297
  44. # define const_id_tok 298
  45. # define type_id_tok 299
  46. # define hhb0_tok 300
  47. # define hhb1_tok 301
  48. # define field_id_tok 302
  49. # define define_tok 303
  50. # define field_tok 304
  51. # define break_tok 305
  52. # define not_eq_tok 306
  53. # define less_eq_tok 307
  54. # define great_eq_tok 308
  55. # define or_tok 309
  56. # define unary_plus_tok 310
  57. # define unary_minus_tok 311
  58. # define div_tok 312
  59. # define mod_tok 313
  60. # define and_tok 314
  61. # define not_tok 315
  62.  
  63. # line 18
  64. #include "web2c.h"
  65.  
  66. #ifdef SYSV
  67. #include <string.h>
  68. #define    rindex    strrchr
  69. #define    index    strchr
  70. #else
  71. #include <strings.h>
  72. #endif    /* SYSV */
  73. #define    symbol(x)    sym_table[x].id
  74. static char function_return_type[50], for_stack[300], control_var[50],
  75.             relation[3];
  76. static int last_type = -1;
  77. char my_routine[100];    /* Name of routine being parsed, if any */
  78. static char array_bounds[80], array_offset[80];
  79. static int func_id, uses_mem, uses_eqtb, lower_sym, upper_sym;
  80. extern char conditional[], temp[], *std_header;
  81. extern int tex, mf, strict_for;
  82. extern FILE *coerce;
  83. extern char coerce_name[];
  84. int doing_statements = FALSE, var_formals = FALSE, ids_typed, id_list[20];
  85. long labs();
  86. #define yyclearin yychar = -1
  87. #define yyerrok yyerrflag = 0
  88. #ifndef YYMAXDEPTH
  89. #define YYMAXDEPTH 150
  90. #endif
  91. #ifndef YYSTYPE
  92. #define YYSTYPE int
  93. #endif
  94. extern YYSTYPE yylval;  /*CSD & DECUS LEX */
  95. YYSTYPE yyval;          /*CSD & DECUS LEX */
  96. # define YYERRCODE 256
  97.  
  98. #line 1084
  99.  
  100. compute_array_bounds()
  101. {
  102.     int lb;
  103.     char tmp[200];
  104.  
  105.     if (lower_sym == -1) {    /* lower is a constant */
  106.     lb = lower_bound - 1;
  107.     if (lb==0) lb = -1;    /* Treat lower_bound==1 as if lower_bound==0 */
  108.     if (upper_sym == -1)    /* both constants */
  109.         (void) sprintf(tmp, "[%d]", upper_bound - lb);
  110.     else {            /* upper a symbol, lower constant */
  111.         if (lb < 0)
  112.         (void) sprintf(tmp, "[%s + %d]",
  113.                 symbol(upper_sym), (-lb));
  114.         else
  115.         (void) sprintf(tmp, "[%s - %d]",
  116.                 symbol(upper_sym), lb);
  117.     }
  118.     if (lower_bound < 0 || lower_bound > 1) {
  119.         if (*array_bounds) {
  120.         fprintf(stderr, "Cannot handle offset in second dimension\n");
  121.         exit(1);
  122.         }
  123.         if (lower_bound < 0) {
  124.         (void) sprintf(array_offset, "+%d", -lower_bound);
  125.         } else {
  126.         (void) sprintf(array_offset, "-%d", lower_bound);
  127.         }
  128.     }
  129.     (void) strcat(array_bounds, tmp);
  130.     }
  131.     else {            /* lower is a symbol */
  132.     if (upper_sym != -1)    /* both are symbols */
  133.         (void) sprintf(tmp, "[%s - %s + 1]", symbol(upper_sym),
  134.         symbol(lower_sym));
  135.     else {            /* upper constant, lower symbol */
  136.         (void) sprintf(tmp, "[%d - %s]", upper_bound + 1,
  137.         symbol(lower_sym));
  138.     }
  139.     if (*array_bounds) {
  140.         fprintf(stderr, "Cannot handle symbolic offset in second dimension\n");
  141.         exit(1);
  142.     }
  143.     (void) sprintf(array_offset, "- (int)(%s)", symbol(lower_sym));
  144.     (void) strcat(array_bounds, tmp);
  145.     }
  146. }
  147.  
  148. fixup_var_list()
  149. {
  150.     int i, j;
  151.     char output_string[100], real_symbol[100];
  152.  
  153.     for (i=0; var_list[i++] == '!'; ) {
  154.     for (j=0; real_symbol[j++] = var_list[i++];);
  155.     if (*array_offset) {
  156.         (void) fprintf(std, "\n#define %s (%s %s)\n  ",
  157.             real_symbol, next_temp, array_offset);
  158.         (void) strcpy(real_symbol, next_temp);
  159.         find_next_temp();
  160.     }
  161.     (void) sprintf(output_string, "%s%s%c",
  162.         real_symbol, array_bounds, (var_list[i]=='!' ? ',' : ' '));
  163.     my_output(output_string);
  164.     }
  165.     semicolon();
  166. }
  167.  
  168.  
  169. /*
  170.  * If we're not processing TeX, we return 0 (false).  Otherwise,
  171.  * return 1 if the label is "10" and we're not in one of four TeX
  172.  * routines where the line labeled "10" isn't the end of the routine.
  173.  * Otherwise, return 0.
  174.  */
  175. doreturn(label)
  176. char *label;
  177. {
  178.     if (!tex) return(0);
  179.     if (strcmp(label, "10")) return(0);
  180.     if (strcmp(my_routine, "macrocall") == 0) return(0);
  181.     if (strcmp(my_routine, "hpack") == 0) return(0);
  182.     if (strcmp(my_routine, "vpackage") == 0) return(0);
  183.     if (strcmp(my_routine, "trybreak") == 0) return(0);
  184.     return(1);
  185. }
  186.  
  187.  
  188. /* Return the absolute value of a long */
  189. long labs(x)
  190. long x;
  191. {
  192.     if (x < 0L) return(-x);
  193.     return(x);
  194. }
  195. short yyexca[] ={
  196. -1, 1,
  197.     0, -1,
  198.     -2, 0,
  199. -1, 35,
  200.     292, 29,
  201.     -2, 26,
  202. -1, 50,
  203.     292, 43,
  204.     -2, 40,
  205. -1, 63,
  206.     292, 85,
  207.     293, 85,
  208.     302, 85,
  209.     -2, 82,
  210. -1, 145,
  211.     91, 141,
  212.     46, 141,
  213.     -2, 143,
  214. -1, 197,
  215.     292, 71,
  216.     302, 71,
  217.     -2, 74,
  218. -1, 286,
  219.     292, 71,
  220.     302, 71,
  221.     -2, 74,
  222. -1, 338,
  223.     61, 0,
  224.     306, 0,
  225.     60, 0,
  226.     62, 0,
  227.     307, 0,
  228.     308, 0,
  229.     -2, 166,
  230. -1, 339,
  231.     61, 0,
  232.     306, 0,
  233.     60, 0,
  234.     62, 0,
  235.     307, 0,
  236.     308, 0,
  237.     -2, 168,
  238. -1, 341,
  239.     61, 0,
  240.     306, 0,
  241.     60, 0,
  242.     62, 0,
  243.     307, 0,
  244.     308, 0,
  245.     -2, 172,
  246. -1, 342,
  247.     61, 0,
  248.     306, 0,
  249.     60, 0,
  250.     62, 0,
  251.     307, 0,
  252.     308, 0,
  253.     -2, 174,
  254. -1, 343,
  255.     61, 0,
  256.     306, 0,
  257.     60, 0,
  258.     62, 0,
  259.     307, 0,
  260.     308, 0,
  261.     -2, 176,
  262. -1, 344,
  263.     61, 0,
  264.     306, 0,
  265.     60, 0,
  266.     62, 0,
  267.     307, 0,
  268.     308, 0,
  269.     -2, 178,
  270. -1, 358,
  271.     277, 248,
  272.     -2, 251,
  273.     };
  274. # define YYNPROD 254
  275. # define YYLAST 526
  276. short yyact[]={
  277.  
  278.  294, 364, 349, 221, 351, 119, 120, 365, 293, 288,
  279.  381, 118, 255, 253, 333, 254,  46, 266,   5, 199,
  280.  228, 255, 253,  97, 254, 289, 266,  60,  47, 172,
  281.  260, 257, 261,  46, 238, 290,  82,  83,  10, 260,
  282.  257, 261, 255,  11, 273,  47,  84, 266,   6,  12,
  283.   67,  13, 250, 251, 249,  95,  54,  96, 354, 255,
  284.  253,  21, 254, 332, 266,  20,  19,  18, 255, 253,
  285.   17, 254, 395, 266,   8,   9, 178, 260, 257, 261,
  286.  255, 253, 177, 254, 330, 266, 260, 257, 261, 255,
  287.  253, 353, 254, 352, 266, 139, 149, 370, 260, 257,
  288.  261, 180,  40, 152,  61, 138, 153, 260, 257, 261,
  289.  236, 234, 151, 133,  49, 232, 255, 253, 150, 254,
  290.  240, 266, 159, 124, 173, 103, 102, 106, 107, 136,
  291.  145, 135, 137, 146, 147, 139, 149, 387, 108, 278,
  292.   34,  80, 129, 152, 220, 138, 153, 175, 391,  78,
  293.  316, 382, 151,  89,  77, 322, 198, 353, 150, 352,
  294.  206,  15,  78, 184, 175, 162, 373,  77, 392, 136,
  295.  145, 135, 137, 146, 147, 286, 377, 313,  23, 133,
  296.  133, 202, 129, 203, 361, 133, 214, 225,  33,  81,
  297.  229, 133, 169, 208,  48, 210,  14,  43, 175, 226,
  298.  171, 175, 284, 366, 196, 243, 244, 212, 222, 170,
  299.   22,  64, 100,  30, 155,  31, 268, 133,  86, 252,
  300.   44, 276,  72,  56, 363,  29, 376,  27,  99, 200,
  301.  195, 193, 191,  46, 168, 117,  91,  90,  55, 277,
  302.  375, 326, 362, 282,  28,  47,  26,  99,  59, 295,
  303.  291, 283, 211,  58,  57, 325, 201,  32,  25,  16,
  304.   92,  98, 194, 176, 327,  42,  41, 328, 207, 156,
  305.  311, 398, 379, 397, 378,  79, 258, 262, 263, 265,
  306.  390,  70, 256, 259, 264, 258, 262, 263, 265, 115,
  307.  110, 256, 259, 264,  88, 101, 357, 334, 335, 336,
  308.  337, 338, 339, 340, 341, 342, 343, 344, 345, 346,
  309.  347,  39, 256, 259, 264, 356, 358, 133, 267, 355,
  310.  133, 154, 359, 258, 262, 263, 265, 157, 158, 256,
  311.  259, 264, 258, 262, 263, 265, 368,  94, 256, 259,
  312.  264,  36, 315, 190, 258, 262, 263, 265, 227, 188,
  313.  256, 259, 264, 258, 262, 263, 265,  51, 314, 256,
  314.  259, 264, 237, 187, 271, 133, 186, 272,  69, 393,
  315.  144, 374, 385, 380, 143, 383, 386,  53, 384, 133,
  316.  285, 389, 388, 265, 394, 142, 256, 259, 264, 103,
  317.  102, 106, 107, 318, 133, 323, 396, 145, 399, 400,
  318.  223, 224, 108, 246, 350, 247, 174, 324,  66, 372,
  319.  348, 310, 185, 213, 217, 218, 274, 189, 183, 219,
  320.  320, 319, 148, 141, 140, 275, 132, 131, 179, 329,
  321.  369, 312, 292, 245, 270, 269, 216, 309, 308, 307,
  322.  306, 305, 304, 303, 302, 301, 300, 299, 298, 297,
  323.  237, 296, 215, 371, 331, 248, 209, 182, 205, 134,
  324.  204, 128, 127, 126, 125, 123, 122, 121, 181, 130,
  325.  321, 281, 235, 113,  76, 280, 233, 279, 231, 192,
  326.  112, 111,  75,  74,  73, 109, 114,  65,  63, 242,
  327.  367, 287, 241, 239, 197, 167, 166, 165, 164,  45,
  328.  163, 161, 160, 116,  85,  52,  50, 105, 104,  68,
  329.   37,  35,  38,  24, 360, 317, 230,  93,   4,  87,
  330.   71,  62,   7,   3,   2,   1 };
  331. short yypact[]={
  332.  
  333. -1000,-1000,-255,-1000,-1000,-218,-229,-109, 200,-222,
  334. -225,-226,-227,-231, -82,-1000,-1000, 199, 187, 185,
  335.  154, 198,-138,-1000,-184,-1000,-1000, 225,-1000, 224,
  336. -1000,-282,-1000,-166,-1000,-1000,-1000,-236, 179,-1000,
  337. -1000, 195, 194, 189,-263,-182,-1000,-1000,-1000,-1000,
  338. -1000,-1000,-242,-1000,-1000,-1000,-184,-1000,-1000,-1000,
  339. -282,-1000,-118,-1000,-1000,-256,-1000,-1000, 157,-1000,
  340. -1000,-105,-1000, 178, 177,-1000,-1000,-237,-269,-1000,
  341.  203,-1000,-1000,-1000,-1000, 151,-160,-1000,-1000,-1000,
  342. -1000,-1000,-1000,-109,-1000,-1000,-1000,-1000,-1000,-256,
  343. -1000, 176,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-163,
  344.  -82, 229, 229, 229, -65,-1000, -65,-1000, 142,-1000,
  345. -1000, 205,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  346. -1000,-1000,-1000,-207,-213,-1000,-1000,-1000,-185,-1000,
  347. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-100,-1000,
  348. -1000,-1000,-1000,-1000,-138, 173,-1000, 172, 204, 171,
  349. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 113,
  350. -1000,-115,-280, 170, 210,-163,-123,-1000,-1000, 228,
  351. -1000,-163, 161,-1000,-1000, 104, 104,-163,-273, 104,
  352. -1000,-1000,-169,-1000,-1000,-1000,-265,-1000,-1000,-1000,
  353. -1000,-1000,-1000,-1000, 104, 104,-1000,-1000, 139, 161,
  354. -1000,-1000,-248,-163,  47, 104,-1000,-1000,-1000,-1000,
  355. -1000,-1000,-1000,-1000,-1000,  38,  88,-245,-1000,  38,
  356. -166, 180,-1000,-1000,-1000, -65, 158,-1000,-1000, 116,
  357. -1000,-267, -65,  38,  38, 104,-1000,-1000, 104,-1000,
  358. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  359. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 104,
  360.  228, -84,-1000,-1000,-126,-1000,-1000,-169,-1000,-256,
  361. -1000,-1000,-1000,-116,-265,-1000,-1000, 197,-1000,-1000,
  362. -1000,-1000, 223,-1000,  26, -30, 104, 104, 104, 104,
  363.  104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
  364. -193,  17,-1000,-163, 104, 104,-163, -74,-1000, 184,
  365. -1000, 165, -65, 110,-1000,-1000,-267,-1000,-1000,-1000,
  366. -189,-1000,-1000,-1000,   0,   0,-1000,-1000,  74,  74,
  367. -1000,  74,  74,  74,  74,-1000,   0,-1000, 107,-1000,
  368.  182,-1000,-1000,-1000,-1000,-1000,  38, -85,  38,-1000,
  369. -1000,-163,-289,-1000,-1000,-1000,-120, -65,-1000, 104,
  370. -1000, 104,-1000,-127,-1000,-123,-193,-1000,-129, -94,
  371.  105,-1000, -65,-1000,-1000, -21,-1000,-1000,-1000,-1000,
  372. -163,-1000,-1000,-1000,-1000,-1000,-1000, 104, 104,  38,
  373.   38 };
  374. short yypgo[]={
  375.  
  376.    0, 525, 524, 523, 522, 196, 210, 188, 194, 521,
  377.  520, 519, 518, 165, 260, 517, 516, 515, 514, 513,
  378.  512, 311, 511, 341, 510, 509, 208, 508, 507, 506,
  379.  357, 505, 504, 503,   7, 502, 501, 500, 220, 499,
  380.  498, 497, 496, 495, 110,   1, 494, 493, 120, 492,
  381.  491, 490,   9, 489, 488, 211, 487, 141, 486, 189,
  382.  485,  11, 222, 484, 483, 482, 481, 214, 480, 479,
  383.  478, 115, 139, 477, 476, 475, 474, 473, 472, 471,
  384.  470, 469, 468,   5,   6, 467, 466, 465, 464, 463,
  385.  462, 461,   3, 460,   0, 459, 458, 457, 456, 195,
  386.  455, 454, 453, 452, 451, 449, 448, 447, 446, 445,
  387.  444, 443, 442, 441, 440, 439, 438, 437, 436, 435,
  388.  434, 160, 433, 432,   8, 430, 429, 428, 427, 426,
  389.  424, 423, 422, 418, 417, 416, 413, 412, 411, 410,
  390.  409,   2, 404,   4, 385, 374, 370, 366, 364, 363,
  391.  358, 349, 348, 342, 296, 280, 274, 273, 272, 271 };
  392. short yyr1[]={
  393.  
  394.    0,   4,   9,   1,   2,   2,  12,  12,  12,  12,
  395.   12,  12,  12,  12,   3,  15,  16,  17,  14,   5,
  396.   19,   5,  20,  20,  21,   6,   6,  22,  22,  24,
  397.   25,  23,  26,  26,  26,  26,  27,  27,  28,   7,
  398.    7,  29,  29,  31,  32,  33,  30,  34,  34,  35,
  399.   35,  13,  39,  39,  38,  38,  37,  36,  36,  36,
  400.   36,  43,  40,  40,  44,  44,  45,  46,  41,  47,
  401.   47,  49,  51,  48,  48,  50,  50,  52,  52,  53,
  402.   42,   8,   8,  54,  54,  56,  58,  55,  57,  57,
  403.   59,  59,  59,  11,  60,  11,  10,  10,  62,  62,
  404.   63,  66,  65,  68,  65,  67,  69,  67,  70,  70,
  405.   73,  72,  74,  71,  75,  71,  64,  77,  78,  80,
  406.   76,  79,  18,  82,  81,  61,  61,  83,  83,  85,
  407.   84,  84,  86,  86,  86,  86,  86,  93,  88,  96,
  408.   88,  97,  92,  92,  95,  95,  98,  98, 100,  99,
  409.   99,  99,  99, 101, 102, 101,  94, 104,  94, 105,
  410.   94, 106,  94, 107,  94, 108,  94, 109,  94, 110,
  411.   94, 111,  94, 112,  94, 113,  94, 114,  94, 115,
  412.   94, 116,  94, 117,  94,  94, 103, 103, 103, 119,
  413.  118, 118, 118, 118, 120, 118, 122, 121, 123, 125,
  414.  123, 124, 126, 126,  89,  89, 127,  89,  90,  91,
  415.   87,  87,  87, 128, 128, 130, 130, 134, 135, 132,
  416.  136, 133, 137, 138, 131, 139, 139, 141, 142, 142,
  417.  143, 143, 140, 140, 129, 129, 129, 147, 148, 144,
  418.  149, 150, 145, 151, 153, 155, 146, 152, 156, 157,
  419.  154, 158, 159, 154 };
  420. short yyr2[]={
  421.  
  422.    0,   0,   0,  10,   0,   2,   4,   4,   6,   4,
  423.    6,   4,   6,   4,   3,   0,   0,   0,   8,   0,
  424.    0,   4,   1,   3,   1,   0,   2,   1,   2,   0,
  425.    0,   6,   1,   1,   1,   1,   1,   1,   1,   0,
  426.    2,   1,   2,   0,   0,   0,   7,   1,   1,   1,
  427.    1,   3,   0,   1,   2,   1,   1,   1,   1,   1,
  428.    1,   2,   6,   8,   1,   1,   1,   0,   4,   1,
  429.    3,   0,   0,   5,   0,   1,   3,   1,   1,   0,
  430.    4,   0,   2,   1,   2,   0,   0,   6,   1,   3,
  431.    1,   1,   1,   0,   0,   5,   1,   2,   2,   2,
  432.    2,   0,   5,   0,   5,   0,   0,   4,   1,   3,
  433.    0,   4,   0,   2,   0,   3,   2,   0,   0,   0,
  434.    9,   1,   3,   0,   4,   1,   3,   1,   3,   1,
  435.    1,   1,   1,   1,   1,   1,   1,   0,   4,   0,
  436.    4,   0,   3,   1,   1,   1,   1,   2,   0,   4,
  437.    2,   2,   2,   1,   0,   4,   2,   0,   4,   0,
  438.    4,   0,   4,   0,   4,   0,   4,   0,   4,   0,
  439.    4,   0,   4,   0,   4,   0,   4,   0,   4,   0,
  440.    4,   0,   4,   0,   4,   1,   1,   1,   1,   0,
  441.    4,   1,   1,   1,   0,   3,   0,   4,   1,   0,
  442.    4,   2,   2,   0,   1,   1,   0,   3,   2,   0,
  443.    1,   1,   1,   1,   1,   1,   2,   0,   0,   6,
  444.    0,   3,   0,   0,   7,   1,   3,   3,   1,   3,
  445.    1,   1,   1,   2,   1,   1,   1,   0,   0,   6,
  446.    0,   0,   6,   0,   0,   0,   9,   1,   0,   0,
  447.    5,   0,   0,   5 };
  448. short yychk[]={
  449.  
  450. -1000,  -1,  -2,  -3, -12, 273, 303,  -4, 292, 304,
  451.  267, 272, 278, 280,  -5, 270,  59, 292, 292, 292,
  452.  292, 292,  -6, 260, -19,  59,  59,  40,  59,  40,
  453.   59,  61,  59,  -7, 278, -22, -23, -24, -20, -21,
  454.  286,  41,  41, -13, -38, -39, 298, 310,  -8, 280,
  455.  -29, -30, -31, -23, 292,  59,  44,  59,  59,  59,
  456.  290, 286,  -9, -54, -55, -56, -30, 292, -25, -21,
  457.  -38, -10, -62, -63, -64, -65, -76, 272, 267, -55,
  458.  -57, -59, 292, 293, 302, -32,  61, -11, -62, 258,
  459.   59,  59, -14, -15, -14, 292, 294, 292,  58,  44,
  460.   61, -26, 286, 285, -27, -28, 287, 288, 298, -60,
  461.   -5, -66, -68, -77, -58, -59, -33,  59, -61, -83,
  462.  -84, -85, -86, -87, 286, -88, -89, -90, -91, 305,
  463.  -81,-128,-129, -92, -95, 294, 292, 295, 268, 258,
  464. -130,-131,-144,-145,-146, 293, 296, 297,-132, 259,
  465.  281, 275, 266, 269,  -6, -67,  40, -67, -67, -34,
  466.  -35, -36, -13, -37, -40, -41, -42, -43, 299, 257,
  467.  274, 265,  94, -34, 264,  59,  58, 289, 289,-127,
  468.  286, -82, -97,-133, 263,-137,-147,-149,-151,-134,
  469.   -7,  59, -69,  59,  58,  59,  91, -46, 271, 299,
  470.   59,  46, -83, -84, -93, -96,-121,  40, -61, -98,
  471.  -99,  91,  46,-136, -94,-103,-118, 310, 311, 315,
  472.   40, -92, -26, 296, 297, -94, -61,-152, 293, -94,
  473.  -16, -70, -71, -74, 280, -78, -44, -13, 299, -47,
  474.  -48, -49, -53, -94, -94,-122, 264, -99,-100, 302,
  475.  300, 301, -83,  43,  45,  42, 312,  61, 306, 313,
  476.   60,  62, 307, 308, 314, 309,  47, 271, -94,-119,
  477. -120,-148, 279, 289,-135,  -8,  41,  59, -72, -73,
  478.  -75, -79, -34,  93,  44, 264,  59, -50, -52, 292,
  479.  302, -34,-123,-124, -94, -94,-104,-105,-106,-107,
  480. -108,-109,-110,-111,-112,-113,-114,-115,-116,-117,
  481. -138, -94,-121, 261,-150,-153, 276, -17, -71, -57,
  482.  -72, -80, 271, -44, -48,  58,  44,  41,  44,-126,
  483.   58,-101,  93,  44, -94, -94, -94, -94, -94, -94,
  484.  -94, -94, -94, -94, -94, -94, -94, -94,-139,-141,
  485. -142,-143, 286, 284,  41, -83, -94,-154, -94, -83,
  486.  -18, 258,  58,  59, -45, -34,  93, -51, -52,-125,
  487.  286,-102,-140,  59, 264,  58,  44, 261,-156,-158,
  488.  -61, 299, 271, -34,-124, -94,-141, 264, -84,-143,
  489. -155, 277, 262, 264, -45,  93, -83,-157,-159, -94,
  490.  -94 };
  491. short yydef[]={
  492.  
  493.    4,  -2,   0,   1,   5,   0,   0,  19,   0,   0,
  494.    0,   0,   0,   0,  25,  20,  14,   0,   0,   0,
  495.    0,   0,  39,  29,   0,   6,   7,   0,   9,   0,
  496.   11,  52,  13,  81,  43,  -2,  27,   0,   0,  22,
  497.   24,   0,   0,   0,   0,   0,  55,  53,   2,  85,
  498.   -2,  41,   0,  28,  30,  21,   0,   8,  10,  12,
  499.   52,  54,   0,  -2,  83,   0,  42,  44,   0,  23,
  500.   51,  93,  96,   0,   0,  15,  15,   0,   0,  84,
  501.    0,  88,  90,  91,  92,   0,   0,   3,  97,  94,
  502.   98,  99, 100,  19, 116, 101, 103, 117,  86,   0,
  503.   45,   0,  32,  33,  34,  35,  36,  37,  38, 209,
  504.   25, 105, 105, 105,  52,  89,  52,  31,   0, 125,
  505.  127,   0, 130, 131, 129, 132, 133, 134, 135, 136,
  506.  210, 211, 212,   0,   0, 204, 205, 206,   0, 123,
  507.  213, 214, 234, 235, 236,  -2, 144, 145, 215, 222,
  508.  237, 240, 243, 217,  39,   0, 106,   0,   0,   0,
  509.   47,  48,  49,  50,  57,  58,  59,  60,  56,   0,
  510.   67,   0,   0,   0,   0, 209, 209, 137, 139,   0,
  511.  208, 209,   0, 216, 220,   0,   0, 209,   0,   0,
  512.   16, 102, 112, 104, 118,  87,  52,  -2,  79,  61,
  513.   46,  95, 126, 128,   0,   0, 207, 196,   0, 142,
  514.  146, 148,   0, 209,   0,   0, 185, 186, 187, 188,
  515.  189, 191, 192, 193, 194, 238,   0,   0, 247, 218,
  516.   81,   0, 108, 110, 114,  52,   0,  64,  65,   0,
  517.   69,   0,  52, 138, 140,   0, 124, 147,   0, 150,
  518.  151, 152, 221, 157, 159, 161, 163, 165, 167, 169,
  519.  171, 173, 175, 177, 179, 181, 183, 223, 156,   0,
  520.    0,   0, 241, 244,   0,  17, 107, 112, 113,   0,
  521.  110, 119, 121,   0,  52,  68,  -2,   0,  75,  77,
  522.   78,  80,   0, 198, 203,   0,   0,   0,   0,   0,
  523.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  524.    0,   0, 195, 209,   0,   0, 209,   0, 109,   0,
  525.  115,   0,  52,   0,  70,  72,   0, 197, 199, 201,
  526.    0, 149, 153, 154, 158, 160, 162, 164,  -2,  -2,
  527.  170,  -2,  -2,  -2,  -2, 180, 182, 184,   0, 225,
  528.    0, 228, 230, 231, 190, 239, 242,   0,  -2, 219,
  529.   18, 209,   0, 120,  62,  66,   0,  52,  76,   0,
  530.  202,   0, 224,   0, 232, 209,   0, 245,   0,   0,
  531.    0, 111,  52,  73, 200,   0, 226, 233, 227, 229,
  532.  209, 249, 252, 122,  63, 155, 246,   0,   0, 250,
  533.  253 };
  534. /*
  535.   HEADER: CUG     nnn.nn;
  536.   TITLE:     YACC - Yet Another Compilier-Compilier
  537.   VERSION:     1.0 for IBM-PC
  538.   DATE:      JAN 28, 1985
  539.   DESCRIPTION:     LALR(1) Parser Generator. From UNIX
  540.   KEYWORDS:     Parser Generator Compilier-Compilier YACC
  541.   SYSTEM:     IBM-PC and Compatiables
  542.   FILENAME:      YYPARS.C
  543.   WARNINGS:     This program is not for the casual user. It will
  544.          be useful primarily to expert developers.
  545.   CRC:         N/A
  546.   SEE-ALSO:     LEX and PREP
  547.   AUTHORS:     Scott Guthery 11100 leafwood lane Austin, TX 78750
  548.   COMPILERS:     DESMET-C
  549.   REFERENCES:     UNIX Systems Manuals
  550. */
  551.  
  552. # define YYFLAG -1000
  553. # define YYERROR goto yyerrlab
  554. # define YYACCEPT return(0)
  555. # define YYABORT return(1)
  556.  
  557. /*      parser for yacc output  */
  558.  
  559. int yydebug = 0; /* 1 for debugging */
  560. YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
  561. int yychar = -1; /* current input token number */
  562. int yynerrs = 0;  /* number of errors */
  563. short yyerrflag = 0;  /* error recovery flag */
  564.  
  565. int yyparse( void )
  566.    {
  567.  
  568.    short yys[YYMAXDEPTH];
  569.    short yyj, yym;
  570.    register YYSTYPE *yypvt;
  571.    register short yystate, *yyps, yyn;
  572.    register YYSTYPE *yypv;
  573.    register short *yyxi;
  574.  
  575.    yystate = 0;
  576.    yychar = -1;
  577.    yynerrs = 0;
  578.    yyerrflag = 0;
  579.    yyps= &yys[-1];
  580.    yypv= &yyv[-1];
  581.  
  582. yystack:    /* put a state and value onto the stack */
  583.  
  584.    if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
  585.    if( ++yyps> &yys[YYMAXDEPTH] )
  586.       {
  587.       yyerror( "yacc stack overflow" );
  588.       return(1);
  589.       }
  590.    *yyps = yystate;
  591.    ++yypv;
  592. #ifdef UNION
  593.    yyunion(yypv, &yyval);
  594. #else
  595.    *yypv = yyval;
  596. #endif
  597. yynewstate:
  598.  
  599.    yyn = yypact[yystate];
  600.  
  601.    if( yyn<= YYFLAG ) goto yydefault; /* simple state */
  602.  
  603.    if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
  604.    if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
  605.  
  606.    if( yychk[ yyn=yyact[ yyn ] ] == yychar )
  607.       {
  608.       /* valid shift */
  609.       yychar = -1;
  610. #ifdef UNION
  611.       yyunion(&yyval, &yylval);
  612. #else
  613.       yyval = yylval;
  614. #endif
  615.       yystate = yyn;
  616.       if( yyerrflag > 0 ) --yyerrflag;
  617.       goto yystack;
  618.       }
  619. yydefault:
  620.    /* default state action */
  621.  
  622.    if( (yyn=yydef[yystate]) == -2 )
  623.       {
  624.       if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
  625.       /* look through exception table */
  626.  
  627.       for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
  628.  
  629.       for(yyxi+=2; *yyxi >= 0; yyxi+=2)
  630.          {
  631.          if( *yyxi == yychar ) break;
  632.          }
  633.       if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
  634.       }
  635.  
  636.    if( yyn == 0 )
  637.       {
  638.       /* error */
  639.       /* error ... attempt to resume parsing */
  640.  
  641.       switch( yyerrflag )
  642.          {
  643.  
  644.       case 0:   /* brand new error */
  645.  
  646.          yyerror( "syntax error" );
  647. yyerrlab:
  648.          ++yynerrs;
  649.  
  650.       case 1:
  651.       case 2: /* incompletely recovered error ... try again */
  652.  
  653.          yyerrflag = 3;
  654.  
  655.          /* find a state where "error" is a legal shift action */
  656.  
  657.          while ( yyps >= yys )
  658.             {
  659.             yyn = yypact[*yyps] + YYERRCODE;
  660.             if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE )
  661.                {
  662.                yystate = yyact[yyn];  /* simulate a shift of "error" */
  663.                goto yystack;
  664.                }
  665.             yyn = yypact[*yyps];
  666.  
  667.             /* the current yyps has no shift onn "error", pop stack */
  668.  
  669.             if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
  670.             --yyps;
  671.             --yypv;
  672.             }
  673.  
  674.          /* there is no state on the stack with an error shift ... abort */
  675.  
  676. yyabort:
  677.          return(1);
  678.  
  679.  
  680.       case 3:  /* no shift yet; clobber input char */
  681.  
  682.          if( yydebug ) printf( "error recovery discards char %d\n", yychar );
  683.  
  684.          if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
  685.          yychar = -1;
  686.          goto yynewstate;   /* try again in the same state */
  687.  
  688.          }
  689.  
  690.       }
  691.  
  692.    /* reduction by production yyn */
  693.  
  694.    if( yydebug ) printf("reduce %d\n",yyn);
  695.    yyps -= yyr2[yyn];
  696.    yypvt = yypv;
  697.    yypv -= yyr2[yyn];
  698. #ifdef UNION
  699.    yyunion(&yyval, &yypv[1]);
  700. #else
  701.    yyval = yypv[1];
  702. #endif
  703.    yym=yyn;
  704.    /* consult goto table to find next state */
  705.    yyn = yyr1[yyn];
  706.    yyj = yypgo[yyn] + *yyps + 1;
  707.    if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
  708.    switch(yym)
  709.       {
  710.       
  711. case 1:
  712. # line 48
  713. {block_level++;
  714.              printf("#include \"%s\"\n", std_header);} break;
  715. case 2:
  716. # line 52
  717. {printf("\n#include \"%s\"\n", coerce_name);} break;
  718. case 3:
  719. # line 55
  720. {YYACCEPT;} break;
  721. case 6:
  722. # line 63
  723. {
  724.                 ii = add_to_table(last_id); 
  725.                 sym_table[ii].typ = field_id_tok;
  726.             } break;
  727. case 7:
  728. # line 68
  729. {
  730.                 ii = add_to_table(last_id); 
  731.                 sym_table[ii].typ = fun_id_tok;
  732.             } break;
  733. case 8:
  734. # line 73
  735. {
  736.                 ii = add_to_table(last_id); 
  737.                 sym_table[ii].typ = fun_param_tok;
  738.             } break;
  739. case 9:
  740. # line 78
  741. {
  742.                 ii = add_to_table(last_id); 
  743.                 sym_table[ii].typ = proc_id_tok;
  744.             } break;
  745. case 10:
  746. # line 83
  747. {
  748.                 ii = add_to_table(last_id); 
  749.                 sym_table[ii].typ = proc_param_tok;
  750.             } break;
  751. case 11:
  752. # line 88
  753. {
  754.                 ii = add_to_table(last_id); 
  755.                 sym_table[ii].typ = type_id_tok;
  756.             } break;
  757. case 12:
  758. # line 94
  759. {
  760.                 ii = add_to_table(last_id); 
  761.                 sym_table[ii].typ = type_id_tok;
  762.                 sym_table[ii].val = lower_bound;
  763.                 sym_table[ii].val_sym = lower_sym;
  764.                 sym_table[ii].upper = upper_bound;
  765.                 sym_table[ii].upper_sym = upper_sym;
  766.             } break;
  767. case 13:
  768. # line 103
  769. {
  770.                 ii = add_to_table(last_id); 
  771.                 sym_table[ii].typ = var_id_tok;
  772.             } break;
  773. case 15:
  774. # line 113
  775. {    if (block_level > 0) my_output("{");
  776.             indent++; block_level++;
  777.               } break;
  778. case 16:
  779. # line 118
  780. {if (block_level == 2) {
  781.                 if (function_return_type[0]) {
  782.                   my_output("register");
  783.                   my_output(function_return_type);
  784.                   my_output("Result;");
  785.                 }
  786.                 if (tex) {
  787.                   (void) sprintf(safe_string, "%s_regmem",
  788.                         my_routine);
  789.                   my_output(safe_string);
  790.                   indent_line();
  791.                 }
  792.              }
  793.             } break;
  794. case 17:
  795. # line 133
  796. {if (block_level == 1)
  797.                 puts("\n#include \"coerce.h\"");
  798.              doing_statements = TRUE;
  799.             } break;
  800. case 18:
  801. # line 138
  802. {if (block_level == 2) {
  803.                 if (function_return_type[0]) {
  804.                   my_output("return(Result)");
  805.                   semicolon();
  806.                   function_return_type[0] = '\0';
  807.                  }
  808.                  if (tex) {
  809.                    if (uses_mem && uses_eqtb)
  810.                 (void) fprintf(coerce,
  811.     "#define %s_regmem register memoryword *mem=zmem, *eqtb=zeqtb;\n",
  812.                    my_routine);
  813.                    else if (uses_mem)
  814.                 (void) fprintf(coerce,
  815.             "#define %s_regmem register memoryword *mem=zmem;\n",
  816.                    my_routine);
  817.                    else if (uses_eqtb)
  818.                 (void) fprintf(coerce,
  819.             "#define %s_regmem register memoryword *eqtb=zeqtb;\n",
  820.                    my_routine);
  821.                    else
  822.                 (void) fprintf(coerce,
  823.                    "#define %s_regmem\n",
  824.                    my_routine);
  825.                 }
  826.                 my_routine[0] = '\0';
  827.              }
  828.              indent--; block_level--;
  829.              my_output("}"); new_line();
  830.              doing_statements = FALSE;
  831.             } break;
  832. case 20:
  833. # line 172
  834. { my_output("/*"); } break;
  835. case 21:
  836. # line 174
  837. { my_output("*/"); } break;
  838. case 24:
  839. # line 182
  840. { my_output(temp); } break;
  841. case 26:
  842. # line 187
  843. { indent_line(); } break;
  844. case 29:
  845. # line 195
  846. { new_line(); my_output("#define"); } break;
  847. case 30:
  848. # line 197
  849. { ii=add_to_table(last_id);
  850.                   sym_table[ii].typ = const_id_tok;
  851.                   my_output(last_id);
  852.                 } break;
  853. case 31:
  854. # line 202
  855. { sym_table[ii].val=last_i_num;
  856.                   new_line(); } break;
  857. case 32:
  858. # line 207
  859. {
  860.                   (void) sscanf(temp, "%ld", &last_i_num);
  861.                   if (labs((long) last_i_num) > 32767)
  862.                       (void) strcat(temp, "L");
  863.                   my_output(temp);
  864.                   yyval = ex_32;
  865.                 } break;
  866. case 33:
  867. # line 215
  868. { my_output(temp);
  869.                   yyval = ex_real;
  870.                 } break;
  871. case 34:
  872. # line 219
  873. { yyval = 0; } break;
  874. case 35:
  875. # line 221
  876. { yyval = ex_32; } break;
  877. case 36:
  878. # line 225
  879. { int i, j; char s[132];
  880.                     j = 1;
  881.                   s[0] = '"';
  882.                     for (i=1; yytext[i-1]!=0; i++) {
  883.                       if (yytext[i] == '\\' || yytext[i] == '"')
  884.                     s[j++]='\\';
  885.                         else if (yytext[i] == '\'') i++;
  886.                         s[j++] = yytext[i];
  887.                   }
  888.                       s[j-1] = '"';
  889.                   s[j] = 0;
  890.                   my_output(s);
  891.                 } break;
  892. case 37:
  893. # line 239
  894. { char s[5];
  895.                   s[0]='\'';
  896.                       if (yytext[1] == '\\' || yytext[1] == '\'') {
  897.                       s[2] = yytext[1];
  898.                     s[1] = '\\';
  899.                     s[3] = '\'';
  900.                     s[4] = '\0';
  901.                   }
  902.                     else {
  903.                     s[1] = yytext[1];
  904.                     s[2]='\'';
  905.                     s[3]='\0';
  906.                   }
  907.                     my_output(s);
  908.                 } break;
  909. case 38:
  910. # line 257
  911. { my_output(last_id); } break;
  912. case 43:
  913. # line 269
  914. { my_output("typedef"); } break;
  915. case 44:
  916. # line 271
  917. { ii = add_to_table(last_id);
  918.                   sym_table[ii].typ = type_id_tok;
  919.                   (void) strcpy(safe_string, last_id);
  920.                   last_type = ii;
  921.                 } break;
  922. case 45:
  923. # line 277
  924. {
  925.                   array_bounds[0] = 0;
  926.                   array_offset[0] = 0;
  927.                 } break;
  928. case 46:
  929. # line 282
  930. { if (*array_offset) {
  931.             fprintf(stderr, "Cannot typedef arrays with offsets\n");
  932.                     exit(1);
  933.                   }
  934.                   my_output(safe_string);
  935.                   my_output(array_bounds);
  936.                   semicolon();
  937.                   last_type = -1;
  938.                 } break;
  939. case 49:
  940. # line 298
  941. { if (last_type >= 0) {
  942.                     sym_table[ii].val = lower_bound;
  943.                     sym_table[ii].val_sym = lower_sym;
  944.                      sym_table[ii].upper = upper_bound;
  945.                     sym_table[ii].upper_sym = upper_sym;
  946.                     ii= -1;
  947.                   }
  948. /* The following code says: if the bounds are known at translation time
  949.  * on an integral type, then we select the smallest type of data which
  950.  * can represent it in ANSI C.  We only use unsigned types when necessary.
  951.  */
  952.                   if (lower_sym == -1 && upper_sym == -1) {
  953.                     if (lower_bound>= -127 && upper_bound<=127)
  954.                     my_output("schar");
  955.                     else if (lower_bound >= 0
  956.                       && upper_bound <= 255)
  957.                     my_output("unsigned char");
  958.                       else if (lower_bound >= -32767
  959.                       && upper_bound <= 32767)
  960.                     my_output("short");
  961.                       else if (lower_bound >= 0
  962.                       && upper_bound <= 65535)
  963.                     my_output("unsigned short");
  964.                       else my_output("integer");
  965.                   }
  966.                   else my_output("integer");
  967.                 } break;
  968. case 54:
  969. # line 336
  970. {lower_bound = upper_bound;
  971.                  lower_sym = upper_sym;
  972.                  (void) sscanf(temp, "%d", &upper_bound);
  973.                  upper_sym = -1; /* no sym table entry */
  974.                 } break;
  975. case 55:
  976. # line 342
  977. { lower_bound = upper_bound;
  978.                   lower_sym = upper_sym;
  979.                   upper_bound = sym_table[l_s].val;
  980.                   upper_sym = l_s;
  981.                 } break;
  982. case 56:
  983. # line 350
  984. {if (last_type >= 0) {
  985.         sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
  986.         sym_table[last_type].upper = sym_table[l_s].upper;
  987.         sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
  988.         sym_table[last_type].val = sym_table[l_s].val;
  989.         sym_table[last_type].val_sym = sym_table[l_s].val_sym;
  990.      }
  991.      my_output(last_id); } break;
  992. case 57:
  993. # line 361
  994. {if (last_type >= 0)
  995.                     sym_table[last_type].var_not_needed = TRUE;} break;
  996. case 59:
  997. # line 365
  998. {if (last_type >= 0)
  999.                     sym_table[last_type].var_not_needed = TRUE;} break;
  1000. case 60:
  1001. # line 368
  1002. {if (last_type >= 0)
  1003.                     sym_table[last_type].var_not_needed = TRUE;} break;
  1004. case 61:
  1005. # line 373
  1006. {if (last_type >= 0) {
  1007.         sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed;
  1008.         sym_table[last_type].upper = sym_table[l_s].upper;
  1009.         sym_table[last_type].upper_sym = sym_table[l_s].upper_sym;
  1010.         sym_table[last_type].val = sym_table[l_s].val;
  1011.         sym_table[last_type].val_sym = sym_table[l_s].val_sym;
  1012.      }
  1013.      my_output(last_id); my_output("*"); } break;
  1014. case 64:
  1015. # line 389
  1016. { compute_array_bounds(); } break;
  1017. case 65:
  1018. # line 391
  1019. { int i, j;
  1020.                   lower_bound = sym_table[l_s].val;
  1021.                   lower_sym = sym_table[l_s].val_sym;
  1022.                   upper_bound = sym_table[l_s].upper;
  1023.                   upper_sym = sym_table[l_s].upper_sym;
  1024.                   compute_array_bounds();
  1025.                 } break;
  1026. case 67:
  1027. # line 405
  1028. { my_output("struct"); my_output("{"); indent++;} break;
  1029. case 68:
  1030. # line 407
  1031. { indent--; my_output("}"); semicolon(); } break;
  1032. case 71:
  1033. # line 415
  1034. { field_list[0] = 0; } break;
  1035. case 72:
  1036. # line 417
  1037. {
  1038.                   /*array_bounds[0] = 0;
  1039.                   array_offset[0] = 0;*/
  1040.                 } break;
  1041. case 73:
  1042. # line 422
  1043. { int i=0, j; char temp[80];
  1044.                   while(field_list[i++] == '!') {
  1045.                     j = 0;
  1046.                     while (field_list[i])
  1047.                         temp[j++] = field_list[i++];
  1048.                     i++;
  1049.                     if (field_list[i] == '!')
  1050.                         temp[j++] = ',';
  1051.                     temp[j] = 0;
  1052.                     my_output(temp);
  1053.                   }
  1054.                   semicolon();
  1055.                 } break;
  1056. case 77:
  1057. # line 443
  1058. { int i=0, j=0;
  1059.                   while (field_list[i] == '!')
  1060.                     while(field_list[i++]);
  1061.                   ii = add_to_table(last_id);
  1062.                   sym_table[ii].typ = field_id_tok;
  1063.                   field_list[i++] = '!';
  1064.                   while (last_id[j])
  1065.                     field_list[i++] = last_id[j++];
  1066.                   field_list[i++] = 0;
  1067.                   field_list[i++] = 0;
  1068.                 } break;
  1069. case 78:
  1070. # line 455
  1071. { int i=0, j=0;
  1072.                   while (field_list[i] == '!')
  1073.                     while(field_list[i++]);
  1074.                   field_list[i++] = '!';
  1075.                   while (last_id[j])
  1076.                     field_list[i++] = last_id[j++];
  1077.                   field_list[i++] = 0;
  1078.                   field_list[i++] = 0;
  1079.                 } break;
  1080. case 79:
  1081. # line 467
  1082. { my_output("file_ptr /* of "); } break;
  1083. case 80:
  1084. # line 469
  1085. {my_output("*/");} break;
  1086. case 85:
  1087. # line 481
  1088. { var_list[0] = 0;
  1089.                   array_bounds[0] = 0;
  1090.                   array_offset[0] = 0;
  1091.                   var_formals = FALSE;
  1092.                   ids_typed = 0;
  1093.                 } break;
  1094. case 86:
  1095. # line 488
  1096. {
  1097.                   array_bounds[0] = 0;    
  1098.                   array_offset[0] = 0;
  1099.                 } break;
  1100. case 87:
  1101. # line 493
  1102. {fixup_var_list();} break;
  1103. case 90:
  1104. # line 501
  1105. { int i=0, j=0;
  1106.                   ii = add_to_table(last_id);
  1107.                   sym_table[ii].typ = var_id_tok;
  1108.                   sym_table[ii].var_formal = var_formals;
  1109.                   id_list[ids_typed++] = ii;
  1110.                     while (var_list[i] == '!')
  1111.                     while(var_list[i++]);
  1112.                   var_list[i++] = '!';
  1113.                   while (last_id[j])
  1114.                     var_list[i++] = last_id[j++];
  1115.                     var_list[i++] = 0;
  1116.                   var_list[i++] = 0;
  1117.                 } break;
  1118. case 91:
  1119. # line 515
  1120. { int i=0, j=0;
  1121.                   ii = add_to_table(last_id);
  1122.                     sym_table[ii].typ = var_id_tok;
  1123.                   sym_table[ii].var_formal = var_formals;
  1124.                   id_list[ids_typed++] = ii;
  1125.                     while (var_list[i] == '!')
  1126.                     while (var_list[i++]);
  1127.                     var_list[i++] = '!';
  1128.                   while (last_id[j])
  1129.                     var_list[i++] = last_id[j++];
  1130.                     var_list[i++] = 0;
  1131.                   var_list[i++] = 0;
  1132.                 } break;
  1133. case 92:
  1134. # line 529
  1135. { int i=0, j=0;
  1136.                   ii = add_to_table(last_id);
  1137.                     sym_table[ii].typ = var_id_tok;
  1138.                     while (var_list[i] == '!')
  1139.                     while(var_list[i++]);
  1140.                     var_list[i++] = '!';
  1141.                   while (last_id[j])
  1142.                     var_list[i++] = last_id[j++];
  1143.                   var_list[i++] = 0;
  1144.                   var_list[i++] = 0;
  1145.                 } break;
  1146. case 94:
  1147. # line 544
  1148. {my_output("main_body() {"); indent++; new_line();} break;
  1149. case 95:
  1150. # line 546
  1151. { indent--; my_output("}"); new_line(); } break;
  1152. case 98:
  1153. # line 554
  1154. { indent_line(); remove_locals(); } break;
  1155. case 99:
  1156. # line 556
  1157. { indent_line(); remove_locals(); } break;
  1158. case 101:
  1159. # line 563
  1160. { ii = add_to_table(last_id);
  1161.                   (void) fprintf(stderr, "%3d Procedure %s\n",
  1162.                     pf_count++, last_id);
  1163.                   sym_table[ii].typ = proc_id_tok;
  1164.                   (void) strcpy(my_routine, last_id);
  1165.                   uses_eqtb = uses_mem = 0;
  1166.                 } break;
  1167. case 103:
  1168. # line 572
  1169. { ii = l_s; 
  1170.                   (void) fprintf(stderr, "%3d Procedure %s\n",
  1171.                     pf_count++, last_id);
  1172.                 } break;
  1173. case 105:
  1174. # line 580
  1175. { (void) strcpy(z_id, last_id);
  1176.                   my_output(last_id); my_output("()");
  1177.                   mark();
  1178.                 } break;
  1179. case 106:
  1180. # line 585
  1181. { (void) sprintf(z_id, "z%s", last_id);
  1182.                   my_output(z_id);
  1183.                   (void) fprintf(coerce, "#define %s(",
  1184.                              last_id);
  1185.                   field_list[0] = 0;
  1186.                   my_output("(");
  1187.                   sym_table[ii].typ++;
  1188.                   f_l = 0;
  1189.                   mark();
  1190.                   first_param = 0;
  1191.                 } break;
  1192. case 107:
  1193. # line 597
  1194. { int i=0, jj;
  1195.                   field_list[f_l] = 0;
  1196.                   my_output(")");
  1197.                   indent_line();
  1198.                   (void) fprintf(coerce, ") %s(", z_id);
  1199.                   first_param = 0;
  1200.                   while (field_list[i++] == '.') {
  1201.                     my_output(field_list+i);
  1202.                     jj = i;
  1203.                     var_formals =
  1204.                         (index(field_list+jj, '*') != 0);
  1205.                     while (field_list[i++]);
  1206.                     while(field_list[i] == '!') {
  1207.                         my_output(field_list+(++i)); 
  1208.                         if (first_param)
  1209.                         (void) putc(',', coerce);
  1210.                         if (!var_formals)
  1211.                           (void) fprintf(coerce, "(%s)(%c)",
  1212.                         field_list+jj,
  1213.                         first_param++ +'a');
  1214.                         else
  1215.                           (void) fprintf(coerce, "(%s) &(%c)",
  1216.                         field_list+jj,
  1217.                         first_param++ +'a');
  1218.                         while (field_list[i++]); 
  1219.                         if (field_list[i] == '!') {
  1220.                         my_output(",");
  1221.                         if (var_formals)
  1222.                             (void) putchar('*');
  1223.                         }
  1224.                     }
  1225.                     semicolon();
  1226.                     }
  1227.                     (void) fprintf(coerce, ")\n");
  1228.                 } break;
  1229. case 110:
  1230. # line 638
  1231. { var_list[0] = 0; ids_typed = 0;} break;
  1232. case 111:
  1233. # line 640
  1234. { int i=0, id;
  1235.                   field_list[f_l++] = '.'; 
  1236.                   while (last_id[i])
  1237.                     field_list[f_l++] = last_id[i++];
  1238.                   if (var_formals) {
  1239.                     if (sym_table[l_s].var_not_needed) {
  1240.                         for (id=0; id<ids_typed; id++)
  1241.                           sym_table[id_list[id]].var_formal = FALSE;
  1242.                     }
  1243.                     else {
  1244.                         field_list[f_l++] = ' ';
  1245.                         field_list[f_l++] = '*';
  1246.                     }
  1247.                   }
  1248.                   field_list[f_l++] = 0;
  1249.                   i = 0;
  1250.                   while (var_list[i] == '!') {
  1251.                     if (first_param) {
  1252.                         my_output(",");
  1253.                         (void) putc(',', coerce);
  1254.                     }
  1255.                     (void) fprintf(coerce, "%c",
  1256.                             first_param++ +'a');
  1257.                     my_output(var_list+i+1);
  1258.                     while (var_list[i])
  1259.                         field_list[f_l++] = var_list[i++];
  1260.                     field_list[f_l++] = 0;
  1261.                     i++;
  1262.                   }
  1263.                 } break;
  1264. case 112:
  1265. # line 672
  1266. {var_formals = 0;} break;
  1267. case 114:
  1268. # line 673
  1269. {var_formals = 1;} break;
  1270. case 117:
  1271. # line 680
  1272. { push();
  1273.                   ii = add_to_table(last_id);
  1274.                   func_id = ii;
  1275.                   (void) fprintf(stderr, "%3d Function %s\n",
  1276.                     pf_count++, last_id);
  1277.                     sym_table[ii].typ = fun_id_tok;
  1278.                   (void) strcpy(my_routine, last_id);
  1279.                   uses_eqtb = uses_mem = 0;
  1280.                 } break;
  1281. case 118:
  1282. # line 690
  1283. { normal();
  1284.                   array_bounds[0] = 0;
  1285.                   array_offset[0] = 0;
  1286.                 } break;
  1287. case 119:
  1288. # line 695
  1289. {(void) strcpy(function_return_type, yytext);
  1290.                  (void) fprintf(coerce, "%s %s();\n",
  1291.                     function_return_type,
  1292.                     z_id);
  1293.                  pop();
  1294.                 } break;
  1295. case 123:
  1296. # line 711
  1297. {my_output("{"); indent++; new_line();} break;
  1298. case 124:
  1299. # line 713
  1300. { indent--; my_output("}"); new_line(); } break;
  1301. case 129:
  1302. # line 726
  1303. {if (!doreturn(temp)) {
  1304.                     (void) sprintf(safe_string, "lab%s:",
  1305.                     temp);
  1306.                     my_output(safe_string);
  1307.                  }
  1308.                 } break;
  1309. case 130:
  1310. # line 735
  1311. { semicolon(); } break;
  1312. case 131:
  1313. # line 737
  1314. { semicolon(); } break;
  1315. case 136:
  1316. # line 745
  1317. {my_output("break");} break;
  1318. case 137:
  1319. # line 749
  1320. { my_output("="); } break;
  1321. case 139:
  1322. # line 752
  1323. { my_output("Result ="); } break;
  1324. case 141:
  1325. # line 757
  1326. { if (strcmp(last_id, "mem") == 0)
  1327.                     uses_mem = 1;
  1328.                   else if (strcmp(last_id, "eqtb") == 0)
  1329.                     uses_eqtb = 1;
  1330.                   if (sym_table[l_s].var_formal)
  1331.                     (void) putchar('*');
  1332.                   my_output(last_id);
  1333.                   yyval = ex_32;
  1334.                 } break;
  1335. case 143:
  1336. # line 768
  1337. { if (sym_table[l_s].var_formal)
  1338.                     (void) putchar('*');
  1339.                   my_output(last_id); yyval = ex_32; } break;
  1340. case 144:
  1341. # line 774
  1342. { yyval = ex_32; } break;
  1343. case 145:
  1344. # line 776
  1345. { yyval = ex_32; } break;
  1346. case 148:
  1347. # line 784
  1348. { my_output("["); } break;
  1349. case 149:
  1350. # line 786
  1351. { my_output("]"); } break;
  1352. case 150:
  1353. # line 788
  1354. {if (tex || mf) {
  1355.                    if (strcmp(last_id, "int")==0)
  1356.                     my_output(".cint");
  1357.                    else if (strcmp(last_id, "lh")==0)
  1358.                     my_output(".v.LH");
  1359.                    else if (strcmp(last_id, "rh")==0)
  1360.                     my_output(".v.RH");
  1361.                    else {
  1362.                      (void)sprintf(safe_string, ".%s", last_id);
  1363.                      my_output(safe_string);
  1364.                    }
  1365.                  }
  1366.                  else {
  1367.                     (void) sprintf(safe_string, ".%s", last_id);
  1368.                     my_output(safe_string);
  1369.                  }
  1370.                 } break;
  1371. case 151:
  1372. # line 806
  1373. { my_output(".hh.b0");} break;
  1374. case 152:
  1375. # line 808
  1376. { my_output(".hh.b1");} break;
  1377. case 154:
  1378. # line 813
  1379. { my_output("][");} break;
  1380. case 156:
  1381. # line 818
  1382. { yyval = yypvt[-0]; } break;
  1383. case 157:
  1384. # line 819
  1385. {my_output("+");} break;
  1386. case 158:
  1387. # line 820
  1388. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1389. case 159:
  1390. # line 821
  1391. {my_output("-");} break;
  1392. case 160:
  1393. # line 822
  1394. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1395. case 161:
  1396. # line 823
  1397. {my_output("*");} break;
  1398. case 162:
  1399. # line 824
  1400. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1401. case 163:
  1402. # line 825
  1403. {my_output("/");} break;
  1404. case 164:
  1405. # line 826
  1406. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1407. case 165:
  1408. # line 827
  1409. {my_output("==");} break;
  1410. case 166:
  1411. # line 828
  1412. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1413. case 167:
  1414. # line 829
  1415. {my_output("!=");} break;
  1416. case 168:
  1417. # line 830
  1418. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1419. case 169:
  1420. # line 831
  1421. {my_output("%");} break;
  1422. case 170:
  1423. # line 832
  1424. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1425. case 171:
  1426. # line 833
  1427. {my_output("<");} break;
  1428. case 172:
  1429. # line 834
  1430. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1431. case 173:
  1432. # line 835
  1433. {my_output(">");} break;
  1434. case 174:
  1435. # line 836
  1436. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1437. case 175:
  1438. # line 837
  1439. {my_output("<=");} break;
  1440. case 176:
  1441. # line 838
  1442. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1443. case 177:
  1444. # line 839
  1445. {my_output(">=");} break;
  1446. case 178:
  1447. # line 840
  1448. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1449. case 179:
  1450. # line 841
  1451. {my_output("&&");} break;
  1452. case 180:
  1453. # line 842
  1454. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1455. case 181:
  1456. # line 843
  1457. {my_output("||");} break;
  1458. case 182:
  1459. # line 844
  1460. {yyval = max(yypvt[-3], yypvt[-0]);} break;
  1461. case 183:
  1462. # line 846
  1463. { my_output("/ ((double)"); } break;
  1464. case 184:
  1465. # line 848
  1466. {yyval = max(yypvt[-3], yypvt[-0]); my_output(")"); } break;
  1467. case 185:
  1468. # line 850
  1469. { yyval = yypvt[-0]; } break;
  1470. case 187:
  1471. # line 855
  1472. { my_output("- (integer)"); } break;
  1473. case 188:
  1474. # line 857
  1475. { my_output("!"); } break;
  1476. case 189:
  1477. # line 861
  1478. { my_output("("); } break;
  1479. case 190:
  1480. # line 863
  1481. { my_output(")"); yyval = yypvt[-3]; } break;
  1482. case 193:
  1483. # line 867
  1484. { my_output(last_id); my_output("()"); } break;
  1485. case 194:
  1486. # line 869
  1487. { my_output(last_id); } break;
  1488. case 196:
  1489. # line 874
  1490. { my_output("("); } break;
  1491. case 197:
  1492. # line 876
  1493. { my_output(")"); } break;
  1494. case 199:
  1495. # line 881
  1496. { my_output(","); } break;
  1497. case 204:
  1498. # line 894
  1499. { my_output(last_id); my_output("()"); } break;
  1500. case 205:
  1501. # line 896
  1502. { my_output(last_id);
  1503.                   ii = add_to_table(last_id);
  1504.                     sym_table[ii].typ = proc_id_tok;
  1505.                   my_output("()");
  1506.                 } break;
  1507. case 206:
  1508. # line 902
  1509. { my_output(last_id); } break;
  1510. case 208:
  1511. # line 907
  1512. {if (doreturn(temp)) {
  1513.                     if (function_return_type[0])
  1514.                     my_output("return(Result)");
  1515.                     else
  1516.                     my_output("return");
  1517.                  } else {
  1518.                      (void) sprintf(safe_string, "goto lab%s",
  1519.                     temp);
  1520.                      my_output(safe_string);
  1521.                  }
  1522.                 } break;
  1523. case 217:
  1524. # line 937
  1525. { my_output("if"); my_output("("); } break;
  1526. case 218:
  1527. # line 939
  1528. { my_output(")"); new_line();} break;
  1529. case 220:
  1530. # line 944
  1531. { my_output("else"); } break;
  1532. case 222:
  1533. # line 949
  1534. { my_output("switch"); my_output("("); } break;
  1535. case 223:
  1536. # line 951
  1537. { my_output(")"); indent_line();
  1538.                   my_output("{"); indent++;
  1539.                 } break;
  1540. case 224:
  1541. # line 955
  1542. { indent--; my_output("}"); new_line(); } break;
  1543. case 227:
  1544. # line 963
  1545. { my_output("break"); semicolon(); } break;
  1546. case 230:
  1547. # line 971
  1548. { my_output("case"); 
  1549.                   my_output(temp);
  1550.                   my_output(":"); indent_line();
  1551.                 } break;
  1552. case 231:
  1553. # line 976
  1554. { my_output("default:"); indent_line(); } break;
  1555. case 237:
  1556. # line 989
  1557. { my_output("while");
  1558.                   my_output("(");
  1559.                 } break;
  1560. case 238:
  1561. # line 993
  1562. { my_output(")"); } break;
  1563. case 240:
  1564. # line 998
  1565. { my_output("do"); my_output("{"); indent++; } break;
  1566. case 241:
  1567. # line 1000
  1568. { indent--; my_output("}"); 
  1569.                   my_output("while"); my_output("( ! (");
  1570.                 } break;
  1571. case 242:
  1572. # line 1004
  1573. { my_output(") )"); } break;
  1574. case 243:
  1575. # line 1008
  1576. {
  1577.                   my_output("{");
  1578.                   my_output("register");
  1579.                   my_output("integer");
  1580.                   if (strict_for)
  1581.                     my_output("for_begin,");
  1582.                   my_output("for_end;");
  1583.                  } break;
  1584. case 244:
  1585. # line 1017
  1586. { if (strict_for)
  1587.                     my_output("for_begin");
  1588.                   else
  1589.                     my_output(control_var);
  1590.                   my_output("="); } break;
  1591. case 245:
  1592. # line 1023
  1593. { my_output("; if (");
  1594.                   if (strict_for) my_output("for_begin");
  1595.                   else my_output(control_var);
  1596.                   my_output(relation);
  1597.                   my_output("for_end)");
  1598.                   if (strict_for) {
  1599.                     my_output("{");
  1600.                     my_output(control_var);
  1601.                     my_output("=");
  1602.                     my_output("for_begin");
  1603.                     semicolon();
  1604.                   }
  1605.                   my_output("do"); 
  1606.                   indent++; 
  1607.                   new_line();} break;
  1608. case 246:
  1609. # line 1039
  1610. {
  1611.                   char *top = rindex(for_stack, '#');
  1612.                   indent--; new_line();
  1613.                   my_output("while"); 
  1614.                   my_output("("); 
  1615.                   my_output(top+1); 
  1616.                   my_output(")"); 
  1617.                   my_output(";");
  1618.                   my_output("}");
  1619.                   if (strict_for)
  1620.                     my_output("}");
  1621.                   *top=0;
  1622.                   new_line();
  1623.                 } break;
  1624. case 247:
  1625. # line 1056
  1626. {(void) strcpy(control_var, last_id); } break;
  1627. case 248:
  1628. # line 1060
  1629. { my_output(";"); } break;
  1630. case 249:
  1631. # line 1062
  1632.                   (void) strcpy(relation, "<=");
  1633.                   my_output("for_end");
  1634.                   my_output("="); } break;
  1635. case 250:
  1636. # line 1067
  1637.                   (void) sprintf(for_stack + strlen(for_stack),
  1638.                     "#%s++ < for_end", control_var);
  1639.                 } break;
  1640. case 251:
  1641. # line 1072
  1642. { my_output(";"); } break;
  1643. case 252:
  1644. # line 1074
  1645. {
  1646.                   (void) strcpy(relation, ">=");
  1647.                   my_output("for_end");
  1648.                   my_output("="); } break;
  1649. case 253:
  1650. # line 1079
  1651.                   (void) sprintf(for_stack + strlen(for_stack),
  1652.                     "#%s-- > for_end", control_var);
  1653.                 } break;/* End of actions */
  1654.       }
  1655.    goto yystack;  /* stack new state and value */
  1656.  
  1657.    }
  1658.