home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / GAWKNT.ZIP / SRC.ZIP / AWKTAB.C < prev    next >
C/C++ Source or Header  |  1994-03-07  |  108KB  |  3,300 lines

  1.  
  2. /*  A Bison parser, made from awk.y  */
  3.  
  4. #define YYBISON 1  /* Identify Bison output.  */
  5.  
  6. #define    FUNC_CALL    258
  7. #define    NAME    259
  8. #define    REGEXP    260
  9. #define    ERROR    261
  10. #define    YNUMBER    262
  11. #define    YSTRING    263
  12. #define    RELOP    264
  13. #define    APPEND_OP    265
  14. #define    ASSIGNOP    266
  15. #define    MATCHOP    267
  16. #define    NEWLINE    268
  17. #define    CONCAT_OP    269
  18. #define    LEX_BEGIN    270
  19. #define    LEX_END    271
  20. #define    LEX_IF    272
  21. #define    LEX_ELSE    273
  22. #define    LEX_RETURN    274
  23. #define    LEX_DELETE    275
  24. #define    LEX_WHILE    276
  25. #define    LEX_DO    277
  26. #define    LEX_FOR    278
  27. #define    LEX_BREAK    279
  28. #define    LEX_CONTINUE    280
  29. #define    LEX_PRINT    281
  30. #define    LEX_PRINTF    282
  31. #define    LEX_NEXT    283
  32. #define    LEX_EXIT    284
  33. #define    LEX_FUNCTION    285
  34. #define    LEX_GETLINE    286
  35. #define    LEX_IN    287
  36. #define    LEX_AND    288
  37. #define    LEX_OR    289
  38. #define    INCREMENT    290
  39. #define    DECREMENT    291
  40. #define    LEX_BUILTIN    292
  41. #define    LEX_LENGTH    293
  42. #define    UNARY    294
  43.  
  44. #line 26 "awk.y"
  45.  
  46. #ifdef DEBUG
  47. #define YYDEBUG 12
  48. #endif
  49.  
  50. #include "awk.h"
  51.  
  52. static void yyerror (); /* va_alist */
  53. static char *get_src_buf P((void));
  54. static int yylex P((void));
  55. static NODE *node_common P((NODETYPE op));
  56. static NODE *snode P((NODE *subn, NODETYPE op, int sindex));
  57. static NODE *mkrangenode P((NODE *cpair));
  58. static NODE *make_for_loop P((NODE *init, NODE *cond, NODE *incr));
  59. static NODE *append_right P((NODE *list, NODE *new));
  60. static void func_install P((NODE *params, NODE *def));
  61. static void pop_var P((NODE *np, int freeit));
  62. static void pop_params P((NODE *params));
  63. static NODE *make_param P((char *name));
  64. static NODE *mk_rexp P((NODE *exp));
  65.  
  66. static int want_assign;        /* lexical scanning kludge */
  67. static int want_regexp;        /* lexical scanning kludge */
  68. static int can_return;        /* lexical scanning kludge */
  69. static int io_allowed = 1;    /* lexical scanning kludge */
  70. static char *lexptr;        /* pointer to next char during parsing */
  71. static char *lexend;
  72. static char *lexptr_begin;    /* keep track of where we were for error msgs */
  73. static char *lexeme;        /* beginning of lexeme for debugging */
  74. static char *thisline = NULL;
  75. #define YYDEBUG_LEXER_TEXT (lexeme)
  76. static int param_counter;
  77. static char *tokstart = NULL;
  78. static char *tok = NULL;
  79. static char *tokend;
  80.  
  81. #define HASHSIZE    1021    /* this constant only used here */
  82. NODE *variables[HASHSIZE];
  83.  
  84. extern char *source;
  85. extern int sourceline;
  86. extern struct src *srcfiles;
  87. extern int numfiles;
  88. extern int errcount;
  89. extern NODE *begin_block;
  90. extern NODE *end_block;
  91.  
  92. #line 74 "awk.y"
  93. typedef union {
  94.     long lval;
  95.     AWKNUM fval;
  96.     NODE *nodeval;
  97.     NODETYPE nodetypeval;
  98.     char *sval;
  99.     NODE *(*ptrval)();
  100. } YYSTYPE;
  101.  
  102. #ifndef YYLTYPE
  103. typedef
  104.   struct yyltype
  105.     {
  106.       int timestamp;
  107.       int first_line;
  108.       int first_column;
  109.       int last_line;
  110.       int last_column;
  111.       char *text;
  112.    }
  113.   yyltype;
  114.  
  115. #define YYLTYPE yyltype
  116. #endif
  117.  
  118. #include <stdio.h>
  119.  
  120. #ifndef __STDC__
  121. #define const
  122. #endif
  123.  
  124.  
  125.  
  126. #define    YYFINAL        307
  127. #define    YYFLAG        -32768
  128. #define    YYNTBASE    61
  129.  
  130. #define YYTRANSLATE(x) ((unsigned)(x) <= 294 ? yytranslate[x] : 106)
  131.  
  132. static const char yytranslate[] = {     0,
  133.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  134.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  135.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  136.      2,     2,    50,     2,     2,    53,    49,     2,     2,    54,
  137.     55,    47,    45,    41,    46,     2,    48,     2,     2,     2,
  138.      2,     2,     2,     2,     2,     2,     2,    40,    60,    42,
  139.      2,    43,    39,     2,     2,     2,     2,     2,     2,     2,
  140.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  141.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  142.     56,     2,    57,    52,     2,     2,     2,     2,     2,     2,
  143.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  144.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  145.      2,     2,    58,    44,    59,     2,     2,     2,     2,     2,
  146.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  147.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  148.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  149.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  150.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  151.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  152.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  153.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  154.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  155.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  156.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  157.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  158.      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
  159.      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
  160.     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
  161.     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
  162.     36,    37,    38,    51
  163. };
  164.  
  165. #if YYDEBUG != 0
  166. static const short yyprhs[] = {     0,
  167.      0,     4,     6,     9,    11,    14,    15,    19,    20,    24,
  168.     27,    30,    33,    35,    38,    41,    43,    45,    47,    49,
  169.     51,    52,    60,    65,    67,    71,    72,    77,    83,    88,
  170.     90,    93,    95,    98,   100,   103,   106,   109,   113,   115,
  171.    122,   131,   140,   151,   161,   164,   167,   174,   179,   183,
  172.    187,   188,   193,   200,   204,   207,   209,   211,   218,   228,
  173.    230,   233,   234,   236,   237,   240,   241,   244,   247,   250,
  174.    251,   253,   255,   259,   261,   264,   268,   269,   271,   272,
  175.    274,   276,   280,   282,   285,   289,   293,   294,   296,   298,
  176.    302,   304,   307,   311,   315,   316,   321,   327,   332,   336,
  177.    340,   344,   348,   350,   353,   357,   361,   365,   369,   375,
  178.    377,   380,   381,   386,   390,   394,   398,   400,   403,   407,
  179.    411,   415,   421,   423,   426,   428,   432,   436,   440,   444,
  180.    448,   452,   455,   458,   461,   465,   470,   475,   477,   482,
  181.    484,   487,   490,   492,   494,   497,   500,   501,   503,   505,
  182.    510,   513,   516,   519,   521,   522,   524,   526
  183. };
  184.  
  185. #endif
  186.  
  187. static const short yyrhs[] = {    82,
  188.     62,    82,     0,    63,     0,    62,    63,     0,     1,     0,
  189.     62,     1,     0,     0,    15,    64,    74,     0,     0,    16,
  190.     65,    74,     0,    15,    76,     0,    16,    76,     0,    71,
  191.     74,     0,    74,     0,    71,    76,     0,    68,    70,     0,
  192.      4,     0,     3,     0,    67,     0,    37,     0,    38,     0,
  193.      0,    30,    69,    66,    54,    85,   102,    82,     0,   100,
  194.     75,   101,   103,     0,    92,     0,    92,    41,    92,     0,
  195.      0,    48,    73,     5,    48,     0,   100,    75,   101,   103,
  196.     82,     0,   100,   101,   103,    82,     0,    77,     0,    75,
  197.     77,     0,     1,     0,    75,     1,     0,    81,     0,   104,
  198.     82,     0,   104,    82,     0,   100,   101,     0,   100,    75,
  199.    101,     0,    80,     0,    21,    54,    92,   102,    82,    77,
  200.      0,    22,    82,    77,    21,    54,    92,   102,    82,     0,
  201.     23,    54,     4,    32,     4,   102,    82,    77,     0,    23,
  202.     54,    87,   104,    92,   104,    87,   102,    82,    77,     0,
  203.     23,    54,    87,   104,   104,    87,   102,    82,    77,     0,
  204.     24,    76,     0,    25,    76,     0,    79,    54,    91,   102,
  205.     84,    76,     0,    79,    88,    84,    76,     0,    28,    87,
  206.     76,     0,    29,    87,    76,     0,     0,    19,    78,    87,
  207.     76,     0,    20,     4,    56,    91,    57,    76,     0,    20,
  208.      4,    76,     0,    92,    76,     0,    26,     0,    27,     0,
  209.     17,    54,    92,   102,    82,    77,     0,    17,    54,    92,
  210.    102,    82,    77,    18,    82,    77,     0,    13,     0,    81,
  211.     13,     0,     0,    81,     0,     0,    42,    96,     0,     0,
  212.     43,    92,     0,    10,    92,     0,    44,    92,     0,     0,
  213.     86,     0,     4,     0,    86,   105,     4,     0,     1,     0,
  214.     86,     1,     0,    86,   105,     1,     0,     0,    92,     0,
  215.      0,    89,     0,    94,     0,    89,   105,    94,     0,     1,
  216.      0,    89,     1,     0,    89,     1,    94,     0,    89,   105,
  217.      1,     0,     0,    91,     0,    92,     0,    91,   105,    92,
  218.      0,     1,     0,    91,     1,     0,    91,     1,    92,     0,
  219.     91,   105,     1,     0,     0,    99,    11,    93,    92,     0,
  220.     54,    91,   102,    32,     4,     0,    92,    44,    31,    98,
  221.      0,    31,    98,    83,     0,    92,    33,    92,     0,    92,
  222.     34,    92,     0,    92,    12,    92,     0,    72,     0,    50,
  223.     72,     0,    92,    32,     4,     0,    92,     9,    92,     0,
  224.     92,    42,    92,     0,    92,    43,    92,     0,    92,    39,
  225.     92,    40,    92,     0,    96,     0,    92,    96,     0,     0,
  226.     99,    11,    95,    94,     0,    94,    33,    94,     0,    94,
  227.     34,    94,     0,    31,    98,    83,     0,    72,     0,    50,
  228.     72,     0,    94,    12,    94,     0,    94,    32,     4,     0,
  229.     94,     9,    94,     0,    94,    39,    94,    40,    94,     0,
  230.     96,     0,    94,    96,     0,    97,     0,    96,    52,    96,
  231.      0,    96,    47,    96,     0,    96,    48,    96,     0,    96,
  232.     49,    96,     0,    96,    45,    96,     0,    96,    46,    96,
  233.      0,    99,    35,     0,    99,    36,     0,    50,    96,     0,
  234.     54,    92,   102,     0,    37,    54,    90,   102,     0,    38,
  235.     54,    90,   102,     0,    38,     0,     3,    54,    90,   102,
  236.      0,    99,     0,    35,    99,     0,    36,    99,     0,     7,
  237.      0,     8,     0,    46,    96,     0,    45,    96,     0,     0,
  238.     99,     0,     4,     0,     4,    56,    91,    57,     0,    53,
  239.     97,     0,    58,    82,     0,    59,    82,     0,    55,     0,
  240.      0,   104,     0,    60,     0,    41,    82,     0
  241. };
  242.  
  243. #if YYDEBUG != 0
  244. static const short yyrline[] = { 0,
  245.    135,   140,   148,   164,   165,   169,   171,   185,   187,   201,
  246.    207,   213,   215,   217,   230,   239,   241,   243,   253,   254,
  247.    258,   262,   270,   279,   281,   290,   292,   310,   312,   317,
  248.    319,   327,   329,   334,   335,   339,   341,   343,   345,   347,
  249.    349,   351,   356,   360,   365,   368,   371,   373,   384,   411,
  250.    413,   415,   417,   419,   433,   438,   440,   445,   450,   457,
  251.    459,   463,   464,   468,   470,   475,   477,   479,   481,   486,
  252.    488,   493,   495,   497,   499,   501,   507,   509,   514,   516,
  253.    521,   523,   529,   531,   533,   535,   540,   542,   547,   549,
  254.    555,   557,   559,   561,   566,   569,   574,   576,   581,   587,
  255.    589,   591,   597,   599,   607,   609,   615,   617,   619,   621,
  256.    623,   628,   631,   632,   634,   636,   642,   644,   646,   648,
  257.    650,   652,   654,   656,   661,   663,   665,   667,   669,   671,
  258.    673,   675,   677,   682,   684,   686,   689,   691,   699,   703,
  259.    704,   706,   708,   710,   713,   720,   725,   727,   732,   734,
  260.    742,   747,   751,   755,   759,   760,   764,   767
  261. };
  262.  
  263. static const char * const yytname[] = {   "$","error","$illegal.","FUNC_CALL",
  264. "NAME","REGEXP","ERROR","YNUMBER","YSTRING","RELOP","APPEND_OP","ASSIGNOP","MATCHOP",
  265. "NEWLINE","CONCAT_OP","LEX_BEGIN","LEX_END","LEX_IF","LEX_ELSE","LEX_RETURN",
  266. "LEX_DELETE","LEX_WHILE","LEX_DO","LEX_FOR","LEX_BREAK","LEX_CONTINUE","LEX_PRINT",
  267. "LEX_PRINTF","LEX_NEXT","LEX_EXIT","LEX_FUNCTION","LEX_GETLINE","LEX_IN","LEX_AND",
  268. "LEX_OR","INCREMENT","DECREMENT","LEX_BUILTIN","LEX_LENGTH","'?'","':'","','",
  269. "'<'","'>'","'|'","'+'","'-'","'*'","'/'","'%'","'!'","UNARY","'^'","'$'","'('",
  270. "')'","'['","']'","'{'","'}'","';'","start","program","rule","@1","@2","func_name",
  271. "lex_builtin","function_prologue","@3","function_body","pattern","regexp","@4",
  272. "action","statements","statement_term","statement","@5","print","if_statement",
  273. "nls","opt_nls","input_redir","output_redir","opt_param_list","param_list","opt_exp",
  274. "opt_rexpression_list","rexpression_list","opt_expression_list","expression_list",
  275. "exp","@6","rexp","@7","simp_exp","non_post_simp_exp","opt_variable","variable",
  276. "l_brace","r_brace","r_paren","opt_semi","semi","comma",""
  277. };
  278. #endif
  279.  
  280. static const short yyr1[] = {     0,
  281.     61,    62,    62,    62,    62,    64,    63,    65,    63,    63,
  282.     63,    63,    63,    63,    63,    66,    66,    66,    67,    67,
  283.     69,    68,    70,    71,    71,    73,    72,    74,    74,    75,
  284.     75,    75,    75,    76,    76,    77,    77,    77,    77,    77,
  285.     77,    77,    77,    77,    77,    77,    77,    77,    77,    77,
  286.     78,    77,    77,    77,    77,    79,    79,    80,    80,    81,
  287.     81,    82,    82,    83,    83,    84,    84,    84,    84,    85,
  288.     85,    86,    86,    86,    86,    86,    87,    87,    88,    88,
  289.     89,    89,    89,    89,    89,    89,    90,    90,    91,    91,
  290.     91,    91,    91,    91,    93,    92,    92,    92,    92,    92,
  291.     92,    92,    92,    92,    92,    92,    92,    92,    92,    92,
  292.     92,    95,    94,    94,    94,    94,    94,    94,    94,    94,
  293.     94,    94,    94,    94,    96,    96,    96,    96,    96,    96,
  294.     96,    96,    96,    97,    97,    97,    97,    97,    97,    97,
  295.     97,    97,    97,    97,    97,    97,    98,    98,    99,    99,
  296.     99,   100,   101,   102,   103,   103,   104,   105
  297. };
  298.  
  299. static const short yyr2[] = {     0,
  300.      3,     1,     2,     1,     2,     0,     3,     0,     3,     2,
  301.      2,     2,     1,     2,     2,     1,     1,     1,     1,     1,
  302.      0,     7,     4,     1,     3,     0,     4,     5,     4,     1,
  303.      2,     1,     2,     1,     2,     2,     2,     3,     1,     6,
  304.      8,     8,    10,     9,     2,     2,     6,     4,     3,     3,
  305.      0,     4,     6,     3,     2,     1,     1,     6,     9,     1,
  306.      2,     0,     1,     0,     2,     0,     2,     2,     2,     0,
  307.      1,     1,     3,     1,     2,     3,     0,     1,     0,     1,
  308.      1,     3,     1,     2,     3,     3,     0,     1,     1,     3,
  309.      1,     2,     3,     3,     0,     4,     5,     4,     3,     3,
  310.      3,     3,     1,     2,     3,     3,     3,     3,     5,     1,
  311.      2,     0,     4,     3,     3,     3,     1,     2,     3,     3,
  312.      3,     5,     1,     2,     1,     3,     3,     3,     3,     3,
  313.      3,     2,     2,     2,     3,     4,     4,     1,     4,     1,
  314.      2,     2,     1,     1,     2,     2,     0,     1,     1,     4,
  315.      2,     2,     2,     1,     0,     1,     1,     2
  316. };
  317.  
  318. static const short yydefact[] = {    62,
  319.     60,    63,     0,    61,     4,     0,   149,   143,   144,     6,
  320.      8,    21,   147,     0,     0,     0,   138,     0,     0,    26,
  321.      0,     0,     0,    62,     0,     2,     0,     0,   103,    13,
  322.     24,   110,   125,   140,     0,     0,     0,   157,     0,    10,
  323.     34,    62,     0,    11,     0,    64,   148,   141,   142,     0,
  324.      0,     0,     0,   146,   140,   145,     0,   104,   134,   151,
  325.    140,    91,     0,    89,   152,     5,     3,     1,    15,     0,
  326.     12,    14,     0,     0,     0,     0,     0,     0,     0,     0,
  327.      0,     0,   111,     0,     0,     0,     0,     0,     0,    95,
  328.    132,   133,    32,     0,    51,     0,     0,    62,     0,     0,
  329.      0,    56,    57,    77,    77,    62,     0,    30,     0,    39,
  330.      0,     0,   155,    62,     0,     0,    89,     0,     7,    35,
  331.      9,    17,    16,    19,    20,     0,    18,     0,    99,     0,
  332.      0,     0,     0,    92,    62,   154,     0,     0,   135,     0,
  333.    106,   102,   105,   100,   101,     0,    25,   107,   108,   147,
  334.    130,   131,   127,   128,   129,   126,     0,     0,    77,     0,
  335.      0,     0,    77,    45,    46,     0,    78,     0,   153,    33,
  336.     31,   155,    83,   147,     0,     0,   117,    66,     0,    81,
  337.    123,   140,    55,     0,    37,    62,   156,    36,   139,   150,
  338.      0,    65,   136,   137,    27,    93,   158,     0,    94,    90,
  339.    155,     0,    98,    96,     0,     0,     0,    54,     0,     0,
  340.    149,     0,    49,    50,    62,    64,   118,     0,     0,     0,
  341.      0,     0,    84,     0,     0,     0,     0,     0,     0,     0,
  342.    124,   112,    38,    29,    74,    72,     0,     0,    97,    23,
  343.    109,    62,    52,     0,    62,     0,     0,     0,    28,   116,
  344.     66,    68,    67,    69,    48,    85,    86,    82,   121,   119,
  345.    120,   114,   115,     0,     0,    62,    75,     0,     0,     0,
  346.      0,     0,     0,     0,    77,     0,     0,   113,    22,    76,
  347.     73,    58,    53,    40,     0,    62,    77,     0,    47,   122,
  348.     62,    62,     0,     0,    62,     0,    41,    42,    62,     0,
  349.     59,     0,    44,    43,     0,     0,     0
  350. };
  351.  
  352. static const short yydefgoto[] = {   305,
  353.     25,    26,    39,    43,   126,   127,    27,    45,    69,    28,
  354.     29,    57,    30,   107,    40,   108,   159,   109,   110,     2,
  355.      3,   129,   222,   237,   238,   166,   178,   179,   115,   116,
  356.    111,   157,   180,   265,    32,    33,    46,    34,   112,   113,
  357.    139,   186,    42,   138
  358. };
  359.  
  360. static const short yypact[] = {     6,
  361. -32768,    10,  1082,-32768,-32768,   -33,   -16,-32768,-32768,     4,
  362.      4,-32768,    31,    31,    31,    14,    44,  1746,  1746,-32768,
  363.   1740,  1746,  1155,     6,   874,-32768,    46,     0,-32768,-32768,
  364.   1324,   284,-32768,    18,   654,   433,  1155,-32768,    46,-32768,
  365.     10,     6,    46,-32768,    88,    65,-32768,-32768,-32768,   433,
  366.    433,  1746,  1536,    59,    58,    59,   111,-32768,    59,-32768,
  367. -32768,-32768,    40,  1271,-32768,-32768,-32768,-32768,-32768,   790,
  368. -32768,-32768,  1536,  1536,   117,  1536,  1536,  1536,  1536,  1536,
  369.   1536,    99,   284,  1746,  1746,  1746,  1746,  1746,  1746,-32768,
  370. -32768,-32768,-32768,    69,-32768,   132,    79,     6,    83,     4,
  371.      4,-32768,-32768,  1536,  1536,     6,   742,-32768,   848,-32768,
  372.    980,   654,    80,     6,    84,    42,  1420,     8,-32768,-32768,
  373. -32768,-32768,-32768,-32768,-32768,    90,-32768,  1746,-32768,    84,
  374.     84,  1271,    97,  1536,     6,-32768,   106,  1175,-32768,   742,
  375.   1807,  1794,-32768,  1556,  1468,  1372,  1420,  1807,  1807,    31,
  376.    129,   129,    59,    59,    59,    59,  1536,  1536,  1536,    50,
  377.   1536,   922,  1664,-32768,-32768,     4,  1420,     4,-32768,-32768,
  378. -32768,    80,-32768,    31,  1740,  1155,-32768,    75,     1,  1604,
  379.    284,    92,-32768,   742,-32768,     6,-32768,-32768,-32768,-32768,
  380.     11,   284,-32768,-32768,-32768,  1420,-32768,   145,-32768,  1420,
  381.     80,  1536,-32768,  1420,  1271,     4,  1155,-32768,  1271,   138,
  382.     57,    80,-32768,-32768,     6,    65,-32768,    40,  1536,  1536,
  383.   1536,     4,  1720,  1223,  1720,  1720,   146,  1720,  1720,  1720,
  384.    284,-32768,-32768,-32768,-32768,-32768,    84,    45,-32768,-32768,
  385.   1420,     6,-32768,    15,     6,   110,   149,  1107,-32768,-32768,
  386.     75,  1420,  1420,  1420,-32768,  1604,-32768,  1604,   549,   139,
  387. -32768,  1684,  1644,  1516,  1720,     6,-32768,    35,   922,     4,
  388.    922,  1536,    84,  1034,  1536,     4,  1720,  1604,-32768,-32768,
  389. -32768,   147,-32768,-32768,  1271,     6,  1536,    84,-32768,  1604,
  390.      6,     6,   922,    84,     6,   922,-32768,-32768,     6,   922,
  391. -32768,   922,-32768,-32768,   172,   180,-32768
  392. };
  393.  
  394. static const short yypgoto[] = {-32768,
  395. -32768,   157,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
  396.     78,-32768,    81,    17,    94,   -50,-32768,-32768,-32768,    41,
  397.    -18,   -26,   -60,-32768,-32768,  -104,-32768,-32768,    64,   -19,
  398.     -3,-32768,  -198,-32768,   363,   174,   -42,   148,   183,  -102,
  399.    324,  -164,   458,  -176
  400. };
  401.  
  402.  
  403. #define    YYLAST        1861
  404.  
  405.  
  406. static const short yytable[] = {    31,
  407.    168,   223,   224,    63,   172,    65,    68,   215,   134,   185,
  408.    -80,   235,     1,   -80,   236,   134,     1,   118,     1,    64,
  409.     36,    31,     4,   120,   256,   258,   259,   260,    90,   262,
  410.    263,   264,   117,   117,     7,   280,   240,   201,   281,    37,
  411.    134,   135,   134,   -80,   -80,   267,   117,   117,   135,   132,
  412.     41,    41,    91,    92,   206,   135,   171,    24,   212,    38,
  413.    -80,   268,     1,    38,   190,   -70,   278,    50,    41,   141,
  414.    142,   270,   144,   145,   146,   147,   148,   149,   290,   162,
  415.    135,   233,   135,    22,   219,   135,   140,   169,   247,   171,
  416.    122,   123,    91,    92,   136,   188,   -88,    51,    58,   -71,
  417.    167,   167,   232,    24,    44,   207,   128,   203,    71,    38,
  418.     89,   210,    37,   130,   131,   133,   197,   220,   221,   119,
  419.    143,    72,   158,   121,   124,   125,    91,    92,   184,   150,
  420.    196,   216,   161,   171,   200,   160,   163,   198,   136,    38,
  421.     41,    41,     7,   191,   195,     8,     9,   225,   239,   261,
  422. -32768,    41,   273,   204,   205,   167,   218,   209,   246,   167,
  423.     47,    48,    49,   272,   291,    55,    55,   234,    55,    61,
  424.    288,   306,    64,    14,    15,    86,    87,    88,    55,   307,
  425.     89,    67,   294,    18,    19,    35,   177,   244,    52,   250,
  426.    276,    22,    53,   164,   165,    60,   249,     0,   241,    55,
  427.     41,     0,     0,   117,   183,     0,    41,    35,    41,    70,
  428.     35,    55,     0,     0,     0,   252,   253,   254,   282,     0,
  429.    284,    35,     0,   269,     0,    35,   271,     0,     0,     0,
  430.      0,    55,    55,    55,    55,    55,    55,     0,     0,     0,
  431.      0,     0,   298,     0,   274,   301,    41,   279,     0,   303,
  432.      0,   304,   217,   208,     0,     0,   182,     0,    55,   213,
  433.      0,   214,    41,     0,    55,     0,     0,   293,   285,     0,
  434.      0,   167,   296,   297,     0,    55,   300,     0,     0,    55,
  435.    302,     0,     0,   167,     0,     0,     0,     0,    55,    55,
  436.      0,    55,    55,    55,    55,    55,    55,    47,     0,   243,
  437.    177,   177,   177,   177,     0,   177,   177,   177,     0,     0,
  438.     41,     0,     0,     0,    55,   255,    41,     0,     0,     0,
  439.      0,    47,    55,     0,     0,     0,     0,    55,    84,    85,
  440.     86,    87,    88,     0,     0,    89,     0,     0,     0,     0,
  441.      0,     0,   177,    55,     0,     0,     0,    55,     0,     0,
  442.      0,    55,    55,     0,   177,     0,    55,     0,     0,     0,
  443.      0,     0,     0,   283,     0,     0,     0,     0,     0,   289,
  444.    182,   182,   182,   182,     0,   182,   182,   182,     0,     0,
  445.     54,    56,     0,    59,     0,     0,   137,     0,    55,     0,
  446.      0,     0,     0,    83,     0,     0,     0,     0,     0,    55,
  447.     55,    55,     0,    55,     0,    55,    55,    55,     0,    55,
  448.     55,    55,   182,     0,    59,     0,     0,     0,     0,     0,
  449.      0,    55,     0,     0,   182,    55,    83,     0,     0,     0,
  450.      0,     0,    55,    62,     0,     6,     7,    55,   189,     8,
  451.      9,     0,     0,     0,     0,     0,   151,   152,   153,   154,
  452.    155,   156,     0,   193,   194,     0,     0,     0,     0,     0,
  453.      0,     0,     0,    13,     0,     0,     0,    14,    15,    16,
  454.     17,   181,     0,    83,     0,     0,     0,    18,    19,    83,
  455.     20,     0,    21,     0,     0,    22,    23,   -87,     0,     0,
  456.    192,     0,   114,     0,    83,     0,     0,     0,     0,     0,
  457.      0,     0,     0,    83,    83,     0,    83,    83,    83,    83,
  458.     83,    83,     0,     0,     0,     0,     0,     0,     0,     0,
  459.      0,     0,     0,     0,     0,     0,     0,   114,   242,    83,
  460.      0,     0,   245,     0,     0,     0,     0,    59,     0,     0,
  461.      0,   251,   231,     0,     0,     0,     0,     0,     0,     0,
  462.      0,     0,     7,     0,     0,     8,     9,-32768,    83,     0,
  463.    266,     0,    83,     0,   114,     0,    83,    83,     0,   114,
  464.    187,    83,     0,     0,     0,     0,     0,     0,     0,     0,
  465.      0,     0,     0,    14,    15,   181,   181,   181,   181,     0,
  466.    181,   181,   181,    18,    19,     0,   286,   114,    52,     0,
  467.      0,    22,    53,    83,     0,     0,     0,     0,   292,     0,
  468.      0,   295,     0,     0,    83,    83,    83,   299,   231,   114,
  469.    231,   231,   231,     0,   231,   231,   231,   181,     0,   187,
  470.      0,     0,     0,     0,     0,     0,    83,     0,     0,   181,
  471.    231,   114,     0,     0,     0,     0,     0,    83,     0,     0,
  472.      0,     0,   231,     0,    93,     0,     6,     7,   187,     0,
  473.      8,     9,     0,     0,     0,     0,     0,     0,     0,   248,
  474.     94,     0,    95,    96,    97,    98,    99,   100,   101,   102,
  475.    103,   104,   105,     0,    13,     0,     0,     0,    14,    15,
  476.     16,    17,     0,     0,     0,     0,     0,     0,    18,    19,
  477.      0,    20,     0,    21,     0,   275,    22,    23,     0,     0,
  478.      0,    24,   106,    38,     0,     0,     0,     0,     0,     0,
  479.      0,     0,     0,     0,     0,     0,   114,     0,   114,     0,
  480.      0,   287,     0,     0,     0,     0,     0,     0,     0,     0,
  481.      0,     0,   170,     0,     6,     7,     0,     0,     8,     9,
  482.    114,     0,     0,   114,     0,     0,     0,   114,    94,   114,
  483.     95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
  484.    105,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  485.      0,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  486.     93,    21,     6,     7,    22,    23,     8,     9,     0,    24,
  487.    106,    38,     0,     0,     0,     0,    94,     0,    95,    96,
  488.     97,    98,    99,   100,   101,   102,   103,   104,   105,     0,
  489.     13,     0,     0,     0,    14,    15,    16,    17,     0,     0,
  490.      0,     0,     0,     0,    18,    19,     0,    20,     0,    21,
  491.      0,     0,    22,    23,     0,     0,     0,    24,   173,    38,
  492.      6,     7,     0,     0,     8,     9,     0,   -79,     0,     0,
  493.    -79,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  494.      0,     0,     0,   -62,    66,     0,     6,     7,   174,     0,
  495.      8,     9,    14,    15,    16,    17,     1,     0,    10,    11,
  496.    -79,   -79,    18,    19,     0,    20,     0,   175,     0,     0,
  497.     22,   176,     0,    12,    13,     0,     0,   -79,    14,    15,
  498.     16,    17,     0,     0,     0,     0,     0,     0,    18,    19,
  499.      0,    20,     0,    21,     6,     7,    22,    23,     8,     9,
  500.      0,    24,     0,     0,     0,     0,     0,     0,    94,     0,
  501.     95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
  502.    105,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  503.      0,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  504.      0,    21,     0,     0,    22,    23,     0,     0,     0,    24,
  505.      0,    38,     6,     7,     0,     0,     8,     9,    73,     0,
  506.      0,    74,     1,     0,     0,     0,     0,     0,     0,     0,
  507.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  508.      0,    75,    76,    77,    14,    15,    16,    17,    78,     0,
  509.      0,    80,    81,    82,    18,    19,     0,     0,     0,    52,
  510.      0,     0,    22,    53,     0,     0,     6,     7,     0,    38,
  511.      8,     9,    73,     0,     0,    74,     0,     0,     0,     0,
  512.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  513.      0,     0,     0,     0,     0,    75,    76,    77,    14,    15,
  514.     16,    17,    78,     0,     0,    80,    81,    82,    18,    19,
  515.      0,     0,     5,    52,     6,     7,    22,    53,     8,     9,
  516.      0,     0,     0,    38,     0,     0,    10,    11,     0,     0,
  517.      0,     0,     0,     0,     0,     0,     0,     0,     0,     6,
  518.      7,    12,    13,     8,     9,     0,    14,    15,    16,    17,
  519.      0,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  520.      0,    21,     0,     0,    22,    23,     0,    13,     0,    24,
  521.      0,    14,    15,    16,    17,     0,     0,     0,     0,     0,
  522.      0,    18,    19,     0,    20,    62,    21,     6,     7,    22,
  523.     23,     8,     9,     0,     0,     0,    38,     0,     0,     0,
  524.      0,     0,     0,     0,     0,   199,     0,     6,     7,     0,
  525.      0,     8,     9,     0,     0,    13,     0,     0,     0,    14,
  526.     15,    16,    17,     0,     0,     0,     0,     0,     0,    18,
  527.     19,     0,    20,     0,    21,    13,     0,    22,    23,    14,
  528.     15,    16,    17,     0,     0,     0,     0,     0,     0,    18,
  529.     19,     0,    20,   257,    21,     6,     7,    22,    23,     8,
  530.      9,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  531.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  532.      0,     0,     0,   174,     0,     0,     0,    14,    15,    16,
  533.     17,     0,     0,     0,     0,     0,     0,    18,    19,     0,
  534.     20,     0,   175,     6,     7,    22,    53,     8,     9,    73,
  535.      0,     0,    74,     0,     0,     0,     0,     0,     0,     0,
  536.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  537.      0,     0,    75,    76,    77,    14,    15,    16,    17,    78,
  538.      0,     0,    80,    81,    82,    18,    19,     0,     0,     0,
  539.     52,     0,     0,    22,    53,   136,     6,     7,     0,     0,
  540.      8,     9,    73,     0,     0,    74,     0,     0,     0,     0,
  541.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  542.      0,     0,     0,     0,     0,    75,    76,    77,    14,    15,
  543.     16,    17,    78,     0,    79,    80,    81,    82,    18,    19,
  544.      0,     0,     0,    52,     6,     7,    22,    53,     8,     9,
  545.     73,     0,     0,    74,     0,     0,     0,     0,     0,     0,
  546.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  547.      0,     0,     0,    75,    76,    77,    14,    15,    16,    17,
  548.     78,   202,     0,    80,    81,    82,    18,    19,     0,     0,
  549.      0,    52,     6,     7,    22,    53,     8,     9,    73,     0,
  550.      0,    74,     0,     0,     0,     0,     0,     0,     0,     0,
  551.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  552.      0,    75,    76,    77,    14,    15,    16,    17,    78,     0,
  553.      0,    80,    81,    82,    18,    19,     0,     0,     0,    52,
  554.      6,     7,    22,    53,     8,     9,    73,     0,     0,    74,
  555.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  556.      0,     0,     0,     0,     0,     0,     0,     0,     0,    75,
  557.     76,     0,    14,    15,    16,    17,     0,     0,     0,    80,
  558.     81,    82,    18,    19,     0,     0,     0,    52,     6,     7,
  559.     22,    53,     8,     9,   225,     0,     0,   226,     0,     0,
  560.      0,     0,     0,     0,     0,     0,     0,     0,     6,     7,
  561.      0,     0,     8,     9,     0,     0,     0,   227,   228,   229,
  562.     14,    15,    16,    17,   230,   277,     0,     0,     6,     7,
  563.     18,    19,     8,     9,    73,    52,    13,    74,    22,    53,
  564.     14,    15,    16,    17,     0,     0,     0,     0,     0,     0,
  565.     18,    19,     0,    20,     0,    21,     0,    75,    22,    23,
  566.     14,    15,    16,    17,     0,     0,     0,    80,    81,    82,
  567.     18,    19,     0,     0,     0,    52,     6,     7,    22,    53,
  568.      8,     9,   225,     0,     0,   226,     0,     0,     0,     0,
  569.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  570.      0,     0,     0,     0,     0,   227,   228,   229,    14,    15,
  571.     16,    17,   230,     0,     0,     0,     6,     7,    18,    19,
  572.      8,     9,   225,    52,     0,   226,    22,    53,     0,     0,
  573.      0,     0,     0,     0,     0,     0,     6,   211,     0,     0,
  574.      8,     9,     0,     0,     0,   227,   228,     0,    14,    15,
  575.     16,    17,     0,     0,     0,     0,     6,     7,    18,    19,
  576.      8,     9,   225,    52,    13,   226,    22,    53,    14,    15,
  577.     16,    17,     0,     0,     0,     0,     0,     0,    18,    19,
  578.      0,    20,     0,    21,     0,   227,    22,    23,    14,    15,
  579.     16,    17,     6,     7,     0,     0,     8,     9,    18,    19,
  580.      0,     0,     0,    52,     0,     0,    22,    53,     0,     0,
  581.      0,     0,     6,     7,     0,     0,     8,     9,     6,     7,
  582.    174,     0,     8,     9,    14,    15,    16,    17,     0,     0,
  583.      0,     0,     0,     0,    18,    19,     0,    20,     0,   175,
  584.      0,     0,    22,    53,    14,    15,    16,    17,     0,     0,
  585.     14,    15,    16,    17,    18,    19,     0,    20,     0,    52,
  586.     18,    19,    22,    53,     0,    52,     0,     7,    22,    53,
  587.      8,     9,    73,     0,     0,-32768,     0,     0,     0,     0,
  588.      7,     0,     0,     8,     9,-32768,     0,     0,     0,     0,
  589.      0,     0,     0,     0,     0,     0,     0,     0,    14,    15,
  590.      0,     0,     0,     0,     0,    80,    81,    82,    18,    19,
  591.      0,    14,    15,    52,     0,     0,    22,    53,-32768,-32768,
  592. -32768,    18,    19,     0,     0,     0,    52,     0,     0,    22,
  593.     53
  594. };
  595.  
  596. static const short yycheck[] = {     3,
  597.    105,     1,   179,    23,   107,    24,    25,   172,     1,   112,
  598.     10,     1,    13,    13,     4,     1,    13,    37,    13,    23,
  599.     54,    25,    13,    42,   223,   224,   225,   226,    11,   228,
  600.    229,   230,    36,    37,     4,     1,   201,   140,     4,    56,
  601.      1,    41,     1,    43,    44,     1,    50,    51,    41,    53,
  602.     10,    11,    35,    36,   159,    41,   107,    58,   163,    60,
  603.     60,   238,    13,    60,    57,    55,   265,    54,    28,    73,
  604.     74,    57,    76,    77,    78,    79,    80,    81,   277,    98,
  605.     41,   184,    41,    53,    10,    41,    70,   106,    32,   140,
  606.      3,     4,    35,    36,    55,   114,    55,    54,    21,    55,
  607.    104,   105,    11,    58,    11,    56,    42,   150,    28,    60,
  608.     52,   162,    56,    50,    51,     5,   135,    43,    44,    39,
  609.      4,    28,    54,    43,    37,    38,    35,    36,   112,    31,
  610.    134,   174,    54,   184,   138,     4,    54,    32,    55,    60,
  611.    100,   101,     4,    54,    48,     7,     8,     9,     4,     4,
  612.     12,   111,     4,   157,   158,   159,   176,   161,    21,   163,
  613.     13,    14,    15,    54,    18,    18,    19,   186,    21,    22,
  614.    275,     0,   176,    35,    36,    47,    48,    49,    31,     0,
  615.     52,    25,   287,    45,    46,     3,   109,   207,    50,   216,
  616.    251,    53,    54,   100,   101,    22,   215,    -1,   202,    52,
  617.    160,    -1,    -1,   207,   111,    -1,   166,    25,   168,    27,
  618.     28,    64,    -1,    -1,    -1,   219,   220,   221,   269,    -1,
  619.    271,    39,    -1,   242,    -1,    43,   245,    -1,    -1,    -1,
  620.     -1,    84,    85,    86,    87,    88,    89,    -1,    -1,    -1,
  621.     -1,    -1,   293,    -1,   248,   296,   206,   266,    -1,   300,
  622.     -1,   302,   175,   160,    -1,    -1,   109,    -1,   111,   166,
  623.     -1,   168,   222,    -1,   117,    -1,    -1,   286,   272,    -1,
  624.     -1,   275,   291,   292,    -1,   128,   295,    -1,    -1,   132,
  625.    299,    -1,    -1,   287,    -1,    -1,    -1,    -1,   141,   142,
  626.     -1,   144,   145,   146,   147,   148,   149,   150,    -1,   206,
  627.    223,   224,   225,   226,    -1,   228,   229,   230,    -1,    -1,
  628.    270,    -1,    -1,    -1,   167,   222,   276,    -1,    -1,    -1,
  629.     -1,   174,   175,    -1,    -1,    -1,    -1,   180,    45,    46,
  630.     47,    48,    49,    -1,    -1,    52,    -1,    -1,    -1,    -1,
  631.     -1,    -1,   265,   196,    -1,    -1,    -1,   200,    -1,    -1,
  632.     -1,   204,   205,    -1,   277,    -1,   209,    -1,    -1,    -1,
  633.     -1,    -1,    -1,   270,    -1,    -1,    -1,    -1,    -1,   276,
  634.    223,   224,   225,   226,    -1,   228,   229,   230,    -1,    -1,
  635.     18,    19,    -1,    21,    -1,    -1,    63,    -1,   241,    -1,
  636.     -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,    -1,   252,
  637.    253,   254,    -1,   256,    -1,   258,   259,   260,    -1,   262,
  638.    263,   264,   265,    -1,    52,    -1,    -1,    -1,    -1,    -1,
  639.     -1,   274,    -1,    -1,   277,   278,    64,    -1,    -1,    -1,
  640.     -1,    -1,   285,     1,    -1,     3,     4,   290,   115,     7,
  641.      8,    -1,    -1,    -1,    -1,    -1,    84,    85,    86,    87,
  642.     88,    89,    -1,   130,   131,    -1,    -1,    -1,    -1,    -1,
  643.     -1,    -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  644.     38,   109,    -1,   111,    -1,    -1,    -1,    45,    46,   117,
  645.     48,    -1,    50,    -1,    -1,    53,    54,    55,    -1,    -1,
  646.    128,    -1,    35,    -1,   132,    -1,    -1,    -1,    -1,    -1,
  647.     -1,    -1,    -1,   141,   142,    -1,   144,   145,   146,   147,
  648.    148,   149,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  649.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    70,   205,   167,
  650.     -1,    -1,   209,    -1,    -1,    -1,    -1,   175,    -1,    -1,
  651.     -1,   218,   180,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  652.     -1,    -1,     4,    -1,    -1,     7,     8,     9,   196,    -1,
  653.    237,    -1,   200,    -1,   107,    -1,   204,   205,    -1,   112,
  654.    113,   209,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  655.     -1,    -1,    -1,    35,    36,   223,   224,   225,   226,    -1,
  656.    228,   229,   230,    45,    46,    -1,   273,   140,    50,    -1,
  657.     -1,    53,    54,   241,    -1,    -1,    -1,    -1,   285,    -1,
  658.     -1,   288,    -1,    -1,   252,   253,   254,   294,   256,   162,
  659.    258,   259,   260,    -1,   262,   263,   264,   265,    -1,   172,
  660.     -1,    -1,    -1,    -1,    -1,    -1,   274,    -1,    -1,   277,
  661.    278,   184,    -1,    -1,    -1,    -1,    -1,   285,    -1,    -1,
  662.     -1,    -1,   290,    -1,     1,    -1,     3,     4,   201,    -1,
  663.      7,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   212,
  664.     17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
  665.     27,    28,    29,    -1,    31,    -1,    -1,    -1,    35,    36,
  666.     37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,
  667.     -1,    48,    -1,    50,    -1,   248,    53,    54,    -1,    -1,
  668.     -1,    58,    59,    60,    -1,    -1,    -1,    -1,    -1,    -1,
  669.     -1,    -1,    -1,    -1,    -1,    -1,   269,    -1,   271,    -1,
  670.     -1,   274,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  671.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  672.    293,    -1,    -1,   296,    -1,    -1,    -1,   300,    17,   302,
  673.     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
  674.     29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  675.     -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    -1,    48,
  676.      1,    50,     3,     4,    53,    54,     7,     8,    -1,    58,
  677.     59,    60,    -1,    -1,    -1,    -1,    17,    -1,    19,    20,
  678.     21,    22,    23,    24,    25,    26,    27,    28,    29,    -1,
  679.     31,    -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,
  680.     -1,    -1,    -1,    -1,    45,    46,    -1,    48,    -1,    50,
  681.     -1,    -1,    53,    54,    -1,    -1,    -1,    58,     1,    60,
  682.      3,     4,    -1,    -1,     7,     8,    -1,    10,    -1,    -1,
  683.     13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  684.     -1,    -1,    -1,     0,     1,    -1,     3,     4,    31,    -1,
  685.      7,     8,    35,    36,    37,    38,    13,    -1,    15,    16,
  686.     43,    44,    45,    46,    -1,    48,    -1,    50,    -1,    -1,
  687.     53,    54,    -1,    30,    31,    -1,    -1,    60,    35,    36,
  688.     37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,
  689.     -1,    48,    -1,    50,     3,     4,    53,    54,     7,     8,
  690.     -1,    58,    -1,    -1,    -1,    -1,    -1,    -1,    17,    -1,
  691.     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
  692.     29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  693.     -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    -1,    48,
  694.     -1,    50,    -1,    -1,    53,    54,    -1,    -1,    -1,    58,
  695.     -1,    60,     3,     4,    -1,    -1,     7,     8,     9,    -1,
  696.     -1,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  697.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  698.     -1,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
  699.     -1,    42,    43,    44,    45,    46,    -1,    -1,    -1,    50,
  700.     -1,    -1,    53,    54,    -1,    -1,     3,     4,    -1,    60,
  701.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  702.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  703.     -1,    -1,    -1,    -1,    -1,    32,    33,    34,    35,    36,
  704.     37,    38,    39,    -1,    -1,    42,    43,    44,    45,    46,
  705.     -1,    -1,     1,    50,     3,     4,    53,    54,     7,     8,
  706.     -1,    -1,    -1,    60,    -1,    -1,    15,    16,    -1,    -1,
  707.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
  708.      4,    30,    31,     7,     8,    -1,    35,    36,    37,    38,
  709.     -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    -1,    48,
  710.     -1,    50,    -1,    -1,    53,    54,    -1,    31,    -1,    58,
  711.     -1,    35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,
  712.     -1,    45,    46,    -1,    48,     1,    50,     3,     4,    53,
  713.     54,     7,     8,    -1,    -1,    -1,    60,    -1,    -1,    -1,
  714.     -1,    -1,    -1,    -1,    -1,     1,    -1,     3,     4,    -1,
  715.     -1,     7,     8,    -1,    -1,    31,    -1,    -1,    -1,    35,
  716.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    45,
  717.     46,    -1,    48,    -1,    50,    31,    -1,    53,    54,    35,
  718.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    45,
  719.     46,    -1,    48,     1,    50,     3,     4,    53,    54,     7,
  720.      8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  721.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  722.     -1,    -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  723.     38,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    -1,
  724.     48,    -1,    50,     3,     4,    53,    54,     7,     8,     9,
  725.     -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  726.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  727.     -1,    -1,    32,    33,    34,    35,    36,    37,    38,    39,
  728.     -1,    -1,    42,    43,    44,    45,    46,    -1,    -1,    -1,
  729.     50,    -1,    -1,    53,    54,    55,     3,     4,    -1,    -1,
  730.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  731.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  732.     -1,    -1,    -1,    -1,    -1,    32,    33,    34,    35,    36,
  733.     37,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
  734.     -1,    -1,    -1,    50,     3,     4,    53,    54,     7,     8,
  735.      9,    -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,
  736.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  737.     -1,    -1,    -1,    32,    33,    34,    35,    36,    37,    38,
  738.     39,    40,    -1,    42,    43,    44,    45,    46,    -1,    -1,
  739.     -1,    50,     3,     4,    53,    54,     7,     8,     9,    -1,
  740.     -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  741.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  742.     -1,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
  743.     -1,    42,    43,    44,    45,    46,    -1,    -1,    -1,    50,
  744.      3,     4,    53,    54,     7,     8,     9,    -1,    -1,    12,
  745.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  746.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    32,
  747.     33,    -1,    35,    36,    37,    38,    -1,    -1,    -1,    42,
  748.     43,    44,    45,    46,    -1,    -1,    -1,    50,     3,     4,
  749.     53,    54,     7,     8,     9,    -1,    -1,    12,    -1,    -1,
  750.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
  751.     -1,    -1,     7,     8,    -1,    -1,    -1,    32,    33,    34,
  752.     35,    36,    37,    38,    39,    40,    -1,    -1,     3,     4,
  753.     45,    46,     7,     8,     9,    50,    31,    12,    53,    54,
  754.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,
  755.     45,    46,    -1,    48,    -1,    50,    -1,    32,    53,    54,
  756.     35,    36,    37,    38,    -1,    -1,    -1,    42,    43,    44,
  757.     45,    46,    -1,    -1,    -1,    50,     3,     4,    53,    54,
  758.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  759.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  760.     -1,    -1,    -1,    -1,    -1,    32,    33,    34,    35,    36,
  761.     37,    38,    39,    -1,    -1,    -1,     3,     4,    45,    46,
  762.      7,     8,     9,    50,    -1,    12,    53,    54,    -1,    -1,
  763.     -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,
  764.      7,     8,    -1,    -1,    -1,    32,    33,    -1,    35,    36,
  765.     37,    38,    -1,    -1,    -1,    -1,     3,     4,    45,    46,
  766.      7,     8,     9,    50,    31,    12,    53,    54,    35,    36,
  767.     37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,
  768.     -1,    48,    -1,    50,    -1,    32,    53,    54,    35,    36,
  769.     37,    38,     3,     4,    -1,    -1,     7,     8,    45,    46,
  770.     -1,    -1,    -1,    50,    -1,    -1,    53,    54,    -1,    -1,
  771.     -1,    -1,     3,     4,    -1,    -1,     7,     8,     3,     4,
  772.     31,    -1,     7,     8,    35,    36,    37,    38,    -1,    -1,
  773.     -1,    -1,    -1,    -1,    45,    46,    -1,    48,    -1,    50,
  774.     -1,    -1,    53,    54,    35,    36,    37,    38,    -1,    -1,
  775.     35,    36,    37,    38,    45,    46,    -1,    48,    -1,    50,
  776.     45,    46,    53,    54,    -1,    50,    -1,     4,    53,    54,
  777.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  778.      4,    -1,    -1,     7,     8,     9,    -1,    -1,    -1,    -1,
  779.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    35,    36,
  780.     -1,    -1,    -1,    -1,    -1,    42,    43,    44,    45,    46,
  781.     -1,    35,    36,    50,    -1,    -1,    53,    54,    42,    43,
  782.     44,    45,    46,    -1,    -1,    -1,    50,    -1,    -1,    53,
  783.     54
  784. };
  785. /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
  786. #line 3 "/usr/local/lib/bison.simple"
  787.  
  788. /* Skeleton output parser for bison,
  789.    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
  790.  
  791.    This program is free software; you can redistribute it and/or modify
  792.    it under the terms of the GNU General Public License as published by
  793.    the Free Software Foundation; either version 1, or (at your option)
  794.    any later version.
  795.  
  796.    This program is distributed in the hope that it will be useful,
  797.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  798.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  799.    GNU General Public License for more details.
  800.  
  801.    You should have received a copy of the GNU General Public License
  802.    along with this program; if not, write to the Free Software
  803.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  804.  
  805.  
  806. #ifndef alloca
  807. #ifdef __GNUC__
  808. #define alloca __builtin_alloca
  809. #else /* not GNU C.  */
  810. #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
  811. #include <alloca.h>
  812. #else /* not sparc */
  813. #if defined (MSDOS) && !defined (__TURBOC__)
  814. #include <malloc.h>
  815. #else /* not MSDOS, or __TURBOC__ */
  816. #if defined(_AIX)
  817. #include <malloc.h>
  818.  #pragma alloca
  819. #endif /* not _AIX */
  820. #endif /* not MSDOS, or __TURBOC__ */
  821. #endif /* not sparc.  */
  822. #endif /* not GNU C.  */
  823. #endif /* alloca not defined.  */
  824.  
  825. /* This is the parser code that is written into each bison parser
  826.   when the %semantic_parser declaration is not specified in the grammar.
  827.   It was written by Richard Stallman by simplifying the hairy parser
  828.   used when %semantic_parser is specified.  */
  829.  
  830. /* Note: there must be only one dollar sign in this file.
  831.    It is replaced by the list of actions, each action
  832.    as one case of the switch.  */
  833.  
  834. #define yyerrok        (yyerrstatus = 0)
  835. #define yyclearin    (yychar = YYEMPTY)
  836. #define YYEMPTY        -2
  837. #define YYEOF        0
  838. #define YYACCEPT    return(0)
  839. #define YYABORT     return(1)
  840. #define YYERROR        goto yyerrlab1
  841. /* Like YYERROR except do call yyerror.
  842.    This remains here temporarily to ease the
  843.    transition to the new meaning of YYERROR, for GCC.
  844.    Once GCC version 2 has supplanted version 1, this can go.  */
  845. #define YYFAIL        goto yyerrlab
  846. #define YYRECOVERING()  (!!yyerrstatus)
  847. #define YYBACKUP(token, value) \
  848. do                                \
  849.   if (yychar == YYEMPTY && yylen == 1)                \
  850.     { yychar = (token), yylval = (value);            \
  851.       yychar1 = YYTRANSLATE (yychar);                \
  852.       YYPOPSTACK;                        \
  853.       goto yybackup;                        \
  854.     }                                \
  855.   else                                \
  856.     { yyerror ("syntax error: cannot back up"); YYERROR; }    \
  857. while (0)
  858.  
  859. #define YYTERROR    1
  860. #define YYERRCODE    256
  861.  
  862. #ifndef YYPURE
  863. #define YYLEX        yylex()
  864. #endif
  865.  
  866. #ifdef YYPURE
  867. #ifdef YYLSP_NEEDED
  868. #define YYLEX        yylex(&yylval, &yylloc)
  869. #else
  870. #define YYLEX        yylex(&yylval)
  871. #endif
  872. #endif
  873.  
  874. /* If nonreentrant, generate the variables here */
  875.  
  876. #ifndef YYPURE
  877.  
  878. int    yychar;            /*  the lookahead symbol        */
  879. YYSTYPE    yylval;            /*  the semantic value of the        */
  880.                 /*  lookahead symbol            */
  881.  
  882. #ifdef YYLSP_NEEDED
  883. YYLTYPE yylloc;            /*  location data for the lookahead    */
  884.                 /*  symbol                */
  885. #endif
  886.  
  887. int yynerrs;            /*  number of parse errors so far       */
  888. #endif  /* not YYPURE */
  889.  
  890. #if YYDEBUG != 0
  891. int yydebug;            /*  nonzero means print parse trace    */
  892. /* Since this is uninitialized, it does not stop multiple parsers
  893.    from coexisting.  */
  894. #endif
  895.  
  896. /*  YYINITDEPTH indicates the initial size of the parser's stacks    */
  897.  
  898. #ifndef    YYINITDEPTH
  899. #define YYINITDEPTH 200
  900. #endif
  901.  
  902. /*  YYMAXDEPTH is the maximum size the stacks can grow to
  903.     (effective only if the built-in stack extension method is used).  */
  904.  
  905. #if YYMAXDEPTH == 0
  906. #undef YYMAXDEPTH
  907. #endif
  908.  
  909. #ifndef YYMAXDEPTH
  910. #define YYMAXDEPTH 10000
  911. #endif
  912.  
  913. #if __GNUC__ > 1        /* GNU C and GNU C++ define this.  */
  914. #define __yy_bcopy(FROM,TO,COUNT)    __builtin_memcpy(TO,FROM,COUNT)
  915. #else                /* not GNU C or C++ */
  916. #ifndef __cplusplus
  917.  
  918. /* This is the most reliable way to avoid incompatibilities
  919.    in available built-in functions on various systems.  */
  920. static void
  921. __yy_bcopy (from, to, count)
  922.      char *from;
  923.      char *to;
  924.      int count;
  925. {
  926.   register char *f = from;
  927.   register char *t = to;
  928.   register int i = count;
  929.  
  930.   while (i-- > 0)
  931.     *t++ = *f++;
  932. }
  933.  
  934. #else /* __cplusplus */
  935.  
  936. /* This is the most reliable way to avoid incompatibilities
  937.    in available built-in functions on various systems.  */
  938. static void
  939. __yy_bcopy (char *from, char *to, int count)
  940. {
  941.   register char *f = from;
  942.   register char *t = to;
  943.   register int i = count;
  944.  
  945.   while (i-- > 0)
  946.     *t++ = *f++;
  947. }
  948.  
  949. #endif
  950. #endif
  951.  
  952. #line 169 "/usr/local/lib/bison.simple"
  953. int
  954. yyparse()
  955. {
  956.   register int yystate;
  957.   register int yyn;
  958.   register short *yyssp;
  959.   register YYSTYPE *yyvsp;
  960.   int yyerrstatus;    /*  number of tokens to shift before error messages enabled */
  961.   int yychar1;        /*  lookahead token as an internal (translated) token number */
  962.  
  963.   short    yyssa[YYINITDEPTH];    /*  the state stack            */
  964.   YYSTYPE yyvsa[YYINITDEPTH];    /*  the semantic value stack        */
  965.  
  966.   short *yyss = yyssa;        /*  refer to the stacks thru separate pointers */
  967.   YYSTYPE *yyvs = yyvsa;    /*  to allow yyoverflow to reallocate them elsewhere */
  968.  
  969. #ifdef YYLSP_NEEDED
  970.   YYLTYPE yylsa[YYINITDEPTH];    /*  the location stack            */
  971.   YYLTYPE *yyls = yylsa;
  972.   YYLTYPE *yylsp;
  973.  
  974. #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
  975. #else
  976. #define YYPOPSTACK   (yyvsp--, yyssp--)
  977. #endif
  978.  
  979.   int yystacksize = YYINITDEPTH;
  980.  
  981. #ifdef YYPURE
  982.   int yychar;
  983.   YYSTYPE yylval;
  984.   int yynerrs;
  985. #ifdef YYLSP_NEEDED
  986.   YYLTYPE yylloc;
  987. #endif
  988. #endif
  989.  
  990.   YYSTYPE yyval;        /*  the variable used to return        */
  991.                 /*  semantic values from the action    */
  992.                 /*  routines                */
  993.  
  994.   int yylen;
  995.  
  996. #if YYDEBUG != 0
  997.   if (yydebug)
  998.     fprintf(stderr, "Starting parse\n");
  999. #endif
  1000.  
  1001.   yystate = 0;
  1002.   yyerrstatus = 0;
  1003.   yynerrs = 0;
  1004.   yychar = YYEMPTY;        /* Cause a token to be read.  */
  1005.  
  1006.   /* Initialize stack pointers.
  1007.      Waste one element of value and location stack
  1008.      so that they stay on the same level as the state stack.  */
  1009.  
  1010.   yyssp = yyss - 1;
  1011.   yyvsp = yyvs;
  1012. #ifdef YYLSP_NEEDED
  1013.   yylsp = yyls;
  1014. #endif
  1015.  
  1016. /* Push a new state, which is found in  yystate  .  */
  1017. /* In all cases, when you get here, the value and location stacks
  1018.    have just been pushed. so pushing a state here evens the stacks.  */
  1019. yynewstate:
  1020.  
  1021.   *++yyssp = yystate;
  1022.  
  1023.   if (yyssp >= yyss + yystacksize - 1)
  1024.     {
  1025.       /* Give user a chance to reallocate the stack */
  1026.       /* Use copies of these so that the &'s don't force the real ones into memory. */
  1027.       YYSTYPE *yyvs1 = yyvs;
  1028.       short *yyss1 = yyss;
  1029. #ifdef YYLSP_NEEDED
  1030.       YYLTYPE *yyls1 = yyls;
  1031. #endif
  1032.  
  1033.       /* Get the current used size of the three stacks, in elements.  */
  1034.       int size = yyssp - yyss + 1;
  1035.  
  1036. #ifdef yyoverflow
  1037.       /* Each stack pointer address is followed by the size of
  1038.      the data in use in that stack, in bytes.  */
  1039.       yyoverflow("parser stack overflow",
  1040.          &yyss1, size * sizeof (*yyssp),
  1041.          &yyvs1, size * sizeof (*yyvsp),
  1042. #ifdef YYLSP_NEEDED
  1043.          &yyls1, size * sizeof (*yylsp),
  1044. #endif
  1045.          &yystacksize);
  1046.  
  1047.       yyss = yyss1; yyvs = yyvs1;
  1048. #ifdef YYLSP_NEEDED
  1049.       yyls = yyls1;
  1050. #endif
  1051. #else /* no yyoverflow */
  1052.       /* Extend the stack our own way.  */
  1053.       if (yystacksize >= YYMAXDEPTH)
  1054.     {
  1055.       yyerror("parser stack overflow");
  1056.       return 2;
  1057.     }
  1058.       yystacksize *= 2;
  1059.       if (yystacksize > YYMAXDEPTH)
  1060.     yystacksize = YYMAXDEPTH;
  1061.       yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
  1062.       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
  1063.       yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
  1064.       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  1065. #ifdef YYLSP_NEEDED
  1066.       yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
  1067.       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  1068. #endif
  1069. #endif /* no yyoverflow */
  1070.  
  1071.       yyssp = yyss + size - 1;
  1072.       yyvsp = yyvs + size - 1;
  1073. #ifdef YYLSP_NEEDED
  1074.       yylsp = yyls + size - 1;
  1075. #endif
  1076.  
  1077. #if YYDEBUG != 0
  1078.       if (yydebug)
  1079.     fprintf(stderr, "Stack size increased to %d\n", yystacksize);
  1080. #endif
  1081.  
  1082.       if (yyssp >= yyss + yystacksize - 1)
  1083.     YYABORT;
  1084.     }
  1085.  
  1086. #if YYDEBUG != 0
  1087.   if (yydebug)
  1088.     fprintf(stderr, "Entering state %d\n", yystate);
  1089. #endif
  1090.  
  1091.  yybackup:
  1092.  
  1093. /* Do appropriate processing given the current state.  */
  1094. /* Read a lookahead token if we need one and don't already have one.  */
  1095. /* yyresume: */
  1096.  
  1097.   /* First try to decide what to do without reference to lookahead token.  */
  1098.  
  1099.   yyn = yypact[yystate];
  1100.   if (yyn == YYFLAG)
  1101.     goto yydefault;
  1102.  
  1103.   /* Not known => get a lookahead token if don't already have one.  */
  1104.  
  1105.   /* yychar is either YYEMPTY or YYEOF
  1106.      or a valid token in external form.  */
  1107.  
  1108.   if (yychar == YYEMPTY)
  1109.     {
  1110. #if YYDEBUG != 0
  1111.       if (yydebug)
  1112.     fprintf(stderr, "Reading a token: ");
  1113. #endif
  1114.       yychar = YYLEX;
  1115.     }
  1116.  
  1117.   /* Convert token to internal form (in yychar1) for indexing tables with */
  1118.  
  1119.   if (yychar <= 0)        /* This means end of input. */
  1120.     {
  1121.       yychar1 = 0;
  1122.       yychar = YYEOF;        /* Don't call YYLEX any more */
  1123.  
  1124. #if YYDEBUG != 0
  1125.       if (yydebug)
  1126.     fprintf(stderr, "Now at end of input.\n");
  1127. #endif
  1128.     }
  1129.   else
  1130.     {
  1131.       yychar1 = YYTRANSLATE(yychar);
  1132.  
  1133. #if YYDEBUG != 0
  1134.       if (yydebug)
  1135.     {
  1136.       fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
  1137.       /* Give the individual parser a way to print the precise meaning
  1138.          of a token, for further debugging info.  */
  1139. #ifdef YYPRINT
  1140.       YYPRINT (stderr, yychar, yylval);
  1141. #endif
  1142.       fprintf (stderr, ")\n");
  1143.     }
  1144. #endif
  1145.     }
  1146.  
  1147.   yyn += yychar1;
  1148.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
  1149.     goto yydefault;
  1150.  
  1151.   yyn = yytable[yyn];
  1152.  
  1153.   /* yyn is what to do for this token type in this state.
  1154.      Negative => reduce, -yyn is rule number.
  1155.      Positive => shift, yyn is new state.
  1156.        New state is final state => don't bother to shift,
  1157.        just return success.
  1158.      0, or most negative number => error.  */
  1159.  
  1160.   if (yyn < 0)
  1161.     {
  1162.       if (yyn == YYFLAG)
  1163.     goto yyerrlab;
  1164.       yyn = -yyn;
  1165.       goto yyreduce;
  1166.     }
  1167.   else if (yyn == 0)
  1168.     goto yyerrlab;
  1169.  
  1170.   if (yyn == YYFINAL)
  1171.     YYACCEPT;
  1172.  
  1173.   /* Shift the lookahead token.  */
  1174.  
  1175. #if YYDEBUG != 0
  1176.   if (yydebug)
  1177.     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
  1178. #endif
  1179.  
  1180.   /* Discard the token being shifted unless it is eof.  */
  1181.   if (yychar != YYEOF)
  1182.     yychar = YYEMPTY;
  1183.  
  1184.   *++yyvsp = yylval;
  1185. #ifdef YYLSP_NEEDED
  1186.   *++yylsp = yylloc;
  1187. #endif
  1188.  
  1189.   /* count tokens shifted since error; after three, turn off error status.  */
  1190.   if (yyerrstatus) yyerrstatus--;
  1191.  
  1192.   yystate = yyn;
  1193.   goto yynewstate;
  1194.  
  1195. /* Do the default action for the current state.  */
  1196. yydefault:
  1197.  
  1198.   yyn = yydefact[yystate];
  1199.   if (yyn == 0)
  1200.     goto yyerrlab;
  1201.  
  1202. /* Do a reduction.  yyn is the number of a rule to reduce with.  */
  1203. yyreduce:
  1204.   yylen = yyr2[yyn];
  1205.   yyval = yyvsp[1-yylen]; /* implement default value of the action */
  1206.  
  1207. #if YYDEBUG != 0
  1208.   if (yydebug)
  1209.     {
  1210.       int i;
  1211.  
  1212.       fprintf (stderr, "Reducing via rule %d (line %d), ",
  1213.            yyn, yyrline[yyn]);
  1214.  
  1215.       /* Print the symboles being reduced, and their result.  */
  1216.       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
  1217.     fprintf (stderr, "%s ", yytname[yyrhs[i]]);
  1218.       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
  1219.     }
  1220. #endif
  1221.  
  1222.  
  1223.   switch (yyn) {
  1224.  
  1225. case 1:
  1226. #line 136 "awk.y"
  1227. { expression_value = yyvsp[-1].nodeval; ;
  1228.     break;}
  1229. case 2:
  1230. #line 141 "awk.y"
  1231.             if (yyvsp[0].nodeval != NULL)
  1232.                 yyval.nodeval = yyvsp[0].nodeval;
  1233.             else
  1234.                 yyval.nodeval = NULL;
  1235.             yyerrok;
  1236.         ;
  1237.     break;}
  1238. case 3:
  1239. #line 150 "awk.y"
  1240. {
  1241.             if (yyvsp[0].nodeval == NULL)
  1242.                 yyval.nodeval = yyvsp[-1].nodeval;
  1243.             else if (yyvsp[-1].nodeval == NULL)
  1244.                 yyval.nodeval = yyvsp[0].nodeval;
  1245.             else {
  1246.                 if (yyvsp[-1].nodeval->type != Node_rule_list)
  1247.                     yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_rule_list,
  1248.                         (NODE*)NULL);
  1249.                 yyval.nodeval = append_right (yyvsp[-1].nodeval,
  1250.                    node(yyvsp[0].nodeval, Node_rule_list,(NODE *) NULL));
  1251.             }
  1252.             yyerrok;
  1253.         ;
  1254.     break;}
  1255. case 4:
  1256. #line 164 "awk.y"
  1257. { yyval.nodeval = NULL; ;
  1258.     break;}
  1259. case 5:
  1260. #line 165 "awk.y"
  1261. { yyval.nodeval = NULL; ;
  1262.     break;}
  1263. case 6:
  1264. #line 169 "awk.y"
  1265. { io_allowed = 0; ;
  1266.     break;}
  1267. case 7:
  1268. #line 171 "awk.y"
  1269. {
  1270.         if (begin_block) {
  1271.             if (begin_block->type != Node_rule_list)
  1272.                 begin_block = node(begin_block, Node_rule_list,
  1273.                     (NODE *)NULL);
  1274.             (void) append_right (begin_block, node(
  1275.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1276.                 Node_rule_list, (NODE *)NULL) );
  1277.         } else
  1278.             begin_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1279.         yyval.nodeval = NULL;
  1280.         io_allowed = 1;
  1281.         yyerrok;
  1282.       ;
  1283.     break;}
  1284. case 8:
  1285. #line 185 "awk.y"
  1286. { io_allowed = 0; ;
  1287.     break;}
  1288. case 9:
  1289. #line 187 "awk.y"
  1290. {
  1291.         if (end_block) {
  1292.             if (end_block->type != Node_rule_list)
  1293.                 end_block = node(end_block, Node_rule_list,
  1294.                     (NODE *)NULL);
  1295.             (void) append_right (end_block, node(
  1296.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1297.                 Node_rule_list, (NODE *)NULL));
  1298.         } else
  1299.             end_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1300.         yyval.nodeval = NULL;
  1301.         io_allowed = 1;
  1302.         yyerrok;
  1303.       ;
  1304.     break;}
  1305. case 10:
  1306. #line 202 "awk.y"
  1307. {
  1308.         warning("BEGIN blocks must have an action part");
  1309.         errcount++;
  1310.         yyerrok;
  1311.       ;
  1312.     break;}
  1313. case 11:
  1314. #line 208 "awk.y"
  1315. {
  1316.         warning("END blocks must have an action part");
  1317.         errcount++;
  1318.         yyerrok;
  1319.       ;
  1320.     break;}
  1321. case 12:
  1322. #line 214 "awk.y"
  1323. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1324.     break;}
  1325. case 13:
  1326. #line 216 "awk.y"
  1327. { yyval.nodeval = node ((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1328.     break;}
  1329. case 14:
  1330. #line 218 "awk.y"
  1331. {
  1332.           yyval.nodeval = node (yyvsp[-1].nodeval,
  1333.                  Node_rule_node,
  1334.                  node(node(node(make_number(0.0),
  1335.                         Node_field_spec,
  1336.                         (NODE *) NULL),
  1337.                     Node_expression_list,
  1338.                     (NODE *) NULL),
  1339.                   Node_K_print,
  1340.                   (NODE *) NULL));
  1341.           yyerrok;
  1342.         ;
  1343.     break;}
  1344. case 15:
  1345. #line 231 "awk.y"
  1346. {
  1347.             func_install(yyvsp[-1].nodeval, yyvsp[0].nodeval);
  1348.             yyval.nodeval = NULL;
  1349.             yyerrok;
  1350.         ;
  1351.     break;}
  1352. case 16:
  1353. #line 240 "awk.y"
  1354. { yyval.sval = yyvsp[0].sval; ;
  1355.     break;}
  1356. case 17:
  1357. #line 242 "awk.y"
  1358. { yyval.sval = yyvsp[0].sval; ;
  1359.     break;}
  1360. case 18:
  1361. #line 244 "awk.y"
  1362. {
  1363.         yyerror("%s() is a built-in function, it cannot be redefined",
  1364.             tokstart);
  1365.         errcount++;
  1366.         /* yyerrok; */
  1367.       ;
  1368.     break;}
  1369. case 21:
  1370. #line 259 "awk.y"
  1371. {
  1372.             param_counter = 0;
  1373.         ;
  1374.     break;}
  1375. case 22:
  1376. #line 263 "awk.y"
  1377. {
  1378.             yyval.nodeval = append_right(make_param(yyvsp[-4].sval), yyvsp[-2].nodeval);
  1379.             can_return = 1;
  1380.         ;
  1381.     break;}
  1382. case 23:
  1383. #line 271 "awk.y"
  1384. {
  1385.         yyval.nodeval = yyvsp[-2].nodeval;
  1386.         can_return = 0;
  1387.       ;
  1388.     break;}
  1389. case 24:
  1390. #line 280 "awk.y"
  1391. { yyval.nodeval = yyvsp[0].nodeval; ;
  1392.     break;}
  1393. case 25:
  1394. #line 282 "awk.y"
  1395. { yyval.nodeval = mkrangenode ( node(yyvsp[-2].nodeval, Node_cond_pair, yyvsp[0].nodeval) ); ;
  1396.     break;}
  1397. case 26:
  1398. #line 291 "awk.y"
  1399. { ++want_regexp; ;
  1400.     break;}
  1401. case 27:
  1402. #line 293 "awk.y"
  1403. {
  1404.           NODE *n;
  1405.           size_t len;
  1406.  
  1407.           getnode(n);
  1408.           n->type = Node_regex;
  1409.           len = strlen(yyvsp[-1].sval);
  1410.           n->re_exp = make_string(yyvsp[-1].sval, len);
  1411.           n->re_reg = make_regexp(yyvsp[-1].sval, len, 0, 1);
  1412.           n->re_text = NULL;
  1413.           n->re_flags = CONST;
  1414.           n->re_cnt = 1;
  1415.           yyval.nodeval = n;
  1416.         ;
  1417.     break;}
  1418. case 28:
  1419. #line 311 "awk.y"
  1420. { yyval.nodeval = yyvsp[-3].nodeval ; ;
  1421.     break;}
  1422. case 29:
  1423. #line 313 "awk.y"
  1424. { yyval.nodeval = NULL; ;
  1425.     break;}
  1426. case 30:
  1427. #line 318 "awk.y"
  1428. { yyval.nodeval = yyvsp[0].nodeval; ;
  1429.     break;}
  1430. case 31:
  1431. #line 320 "awk.y"
  1432. {
  1433.             if (yyvsp[-1].nodeval == NULL || yyvsp[-1].nodeval->type != Node_statement_list)
  1434.                 yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_statement_list,(NODE *)NULL);
  1435.                 yyval.nodeval = append_right(yyvsp[-1].nodeval,
  1436.                 node( yyvsp[0].nodeval, Node_statement_list, (NODE *)NULL));
  1437.                 yyerrok;
  1438.         ;
  1439.     break;}
  1440. case 32:
  1441. #line 328 "awk.y"
  1442. { yyval.nodeval = NULL; ;
  1443.     break;}
  1444. case 33:
  1445. #line 330 "awk.y"
  1446. { yyval.nodeval = NULL; ;
  1447.     break;}
  1448. case 36:
  1449. #line 340 "awk.y"
  1450. { yyval.nodeval = NULL; ;
  1451.     break;}
  1452. case 37:
  1453. #line 342 "awk.y"
  1454. { yyval.nodeval = NULL; ;
  1455.     break;}
  1456. case 38:
  1457. #line 344 "awk.y"
  1458. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1459.     break;}
  1460. case 39:
  1461. #line 346 "awk.y"
  1462. { yyval.nodeval = yyvsp[0].nodeval; ;
  1463.     break;}
  1464. case 40:
  1465. #line 348 "awk.y"
  1466. { yyval.nodeval = node (yyvsp[-3].nodeval, Node_K_while, yyvsp[0].nodeval); ;
  1467.     break;}
  1468. case 41:
  1469. #line 350 "awk.y"
  1470. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_K_do, yyvsp[-5].nodeval); ;
  1471.     break;}
  1472. case 42:
  1473. #line 352 "awk.y"
  1474. {
  1475.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_arrayfor, make_for_loop(variable(yyvsp[-5].sval,1),
  1476.             (NODE *)NULL, variable(yyvsp[-3].sval,1)));
  1477.       ;
  1478.     break;}
  1479. case 43:
  1480. #line 357 "awk.y"
  1481. {
  1482.         yyval.nodeval = node(yyvsp[0].nodeval, Node_K_for, (NODE *)make_for_loop(yyvsp[-7].nodeval, yyvsp[-5].nodeval, yyvsp[-3].nodeval));
  1483.       ;
  1484.     break;}
  1485. case 44:
  1486. #line 361 "awk.y"
  1487. {
  1488.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_for,
  1489.             (NODE *)make_for_loop(yyvsp[-6].nodeval, (NODE *)NULL, yyvsp[-3].nodeval));
  1490.       ;
  1491.     break;}
  1492. case 45:
  1493. #line 367 "awk.y"
  1494. { yyval.nodeval = node ((NODE *)NULL, Node_K_break, (NODE *)NULL); ;
  1495.     break;}
  1496. case 46:
  1497. #line 370 "awk.y"
  1498. { yyval.nodeval = node ((NODE *)NULL, Node_K_continue, (NODE *)NULL); ;
  1499.     break;}
  1500. case 47:
  1501. #line 372 "awk.y"
  1502. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-5].nodetypeval, yyvsp[-1].nodeval); ;
  1503.     break;}
  1504. case 48:
  1505. #line 374 "awk.y"
  1506. {
  1507.             if (yyvsp[-3].nodetypeval == Node_K_print && yyvsp[-2].nodeval == NULL)
  1508.                 yyvsp[-2].nodeval = node(node(make_number(0.0),
  1509.                            Node_field_spec,
  1510.                            (NODE *) NULL),
  1511.                       Node_expression_list,
  1512.                       (NODE *) NULL);
  1513.  
  1514.             yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-3].nodetypeval, yyvsp[-1].nodeval);
  1515.         ;
  1516.     break;}
  1517. case 49:
  1518. #line 385 "awk.y"
  1519. { NODETYPE type;
  1520.  
  1521.           if (yyvsp[-1].nodeval && yyvsp[-1].nodeval == lookup("file")) {
  1522.             if (do_lint)
  1523.                 warning("`next file' is a gawk extension");
  1524.             if (do_unix || do_posix) {
  1525.                 /*
  1526.                  * can't use yyerror, since may have overshot
  1527.                  * the source line
  1528.                  */
  1529.                 errcount++;
  1530.                 msg("`next file' is a gawk extension");
  1531.             }
  1532.             if (! io_allowed) {
  1533.                 /* same thing */
  1534.                 errcount++;
  1535.                 msg("`next file' used in BEGIN or END action");
  1536.             }
  1537.             type = Node_K_nextfile;
  1538.           } else {
  1539.             if (! io_allowed)
  1540.                 yyerror("next used in BEGIN or END action");
  1541.             type = Node_K_next;
  1542.         }
  1543.           yyval.nodeval = node ((NODE *)NULL, type, (NODE *)NULL);
  1544.         ;
  1545.     break;}
  1546. case 50:
  1547. #line 412 "awk.y"
  1548. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_exit, (NODE *)NULL); ;
  1549.     break;}
  1550. case 51:
  1551. #line 414 "awk.y"
  1552. { if (! can_return) yyerror("return used outside function context"); ;
  1553.     break;}
  1554. case 52:
  1555. #line 416 "awk.y"
  1556. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_return, (NODE *)NULL); ;
  1557.     break;}
  1558. case 53:
  1559. #line 418 "awk.y"
  1560. { yyval.nodeval = node (variable(yyvsp[-4].sval,1), Node_K_delete, yyvsp[-2].nodeval); ;
  1561.     break;}
  1562. case 54:
  1563. #line 420 "awk.y"
  1564. {
  1565.           if (do_lint)
  1566.             warning("`delete array' is a gawk extension");
  1567.           if (do_unix || do_posix) {
  1568.             /*
  1569.              * can't use yyerror, since may have overshot
  1570.              * the source line
  1571.              */
  1572.             errcount++;
  1573.             msg("`delete array' is a gawk extension");
  1574.           }
  1575.           yyval.nodeval = node (variable(yyvsp[-1].sval,1), Node_K_delete, (NODE *) NULL);
  1576.         ;
  1577.     break;}
  1578. case 55:
  1579. #line 434 "awk.y"
  1580. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1581.     break;}
  1582. case 56:
  1583. #line 439 "awk.y"
  1584. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1585.     break;}
  1586. case 57:
  1587. #line 441 "awk.y"
  1588. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1589.     break;}
  1590. case 58:
  1591. #line 446 "awk.y"
  1592. {
  1593.         yyval.nodeval = node(yyvsp[-3].nodeval, Node_K_if, 
  1594.             node(yyvsp[0].nodeval, Node_if_branches, (NODE *)NULL));
  1595.       ;
  1596.     break;}
  1597. case 59:
  1598. #line 452 "awk.y"
  1599. { yyval.nodeval = node (yyvsp[-6].nodeval, Node_K_if,
  1600.                 node (yyvsp[-3].nodeval, Node_if_branches, yyvsp[0].nodeval)); ;
  1601.     break;}
  1602. case 60:
  1603. #line 458 "awk.y"
  1604. { want_assign = 0; ;
  1605.     break;}
  1606. case 64:
  1607. #line 469 "awk.y"
  1608. { yyval.nodeval = NULL; ;
  1609.     break;}
  1610. case 65:
  1611. #line 471 "awk.y"
  1612. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_input, (NODE *)NULL); ;
  1613.     break;}
  1614. case 66:
  1615. #line 476 "awk.y"
  1616. { yyval.nodeval = NULL; ;
  1617.     break;}
  1618. case 67:
  1619. #line 478 "awk.y"
  1620. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_output, (NODE *)NULL); ;
  1621.     break;}
  1622. case 68:
  1623. #line 480 "awk.y"
  1624. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_append, (NODE *)NULL); ;
  1625.     break;}
  1626. case 69:
  1627. #line 482 "awk.y"
  1628. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_pipe, (NODE *)NULL); ;
  1629.     break;}
  1630. case 70:
  1631. #line 487 "awk.y"
  1632. { yyval.nodeval = NULL; ;
  1633.     break;}
  1634. case 71:
  1635. #line 489 "awk.y"
  1636. { yyval.nodeval = yyvsp[0].nodeval; ;
  1637.     break;}
  1638. case 72:
  1639. #line 494 "awk.y"
  1640. { yyval.nodeval = make_param(yyvsp[0].sval); ;
  1641.     break;}
  1642. case 73:
  1643. #line 496 "awk.y"
  1644. { yyval.nodeval = append_right(yyvsp[-2].nodeval, make_param(yyvsp[0].sval)); yyerrok; ;
  1645.     break;}
  1646. case 74:
  1647. #line 498 "awk.y"
  1648. { yyval.nodeval = NULL; ;
  1649.     break;}
  1650. case 75:
  1651. #line 500 "awk.y"
  1652. { yyval.nodeval = NULL; ;
  1653.     break;}
  1654. case 76:
  1655. #line 502 "awk.y"
  1656. { yyval.nodeval = NULL; ;
  1657.     break;}
  1658. case 77:
  1659. #line 508 "awk.y"
  1660. { yyval.nodeval = NULL; ;
  1661.     break;}
  1662. case 78:
  1663. #line 510 "awk.y"
  1664. { yyval.nodeval = yyvsp[0].nodeval; ;
  1665.     break;}
  1666. case 79:
  1667. #line 515 "awk.y"
  1668. { yyval.nodeval = NULL; ;
  1669.     break;}
  1670. case 80:
  1671. #line 517 "awk.y"
  1672. { yyval.nodeval = yyvsp[0].nodeval; ;
  1673.     break;}
  1674. case 81:
  1675. #line 522 "awk.y"
  1676. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1677.     break;}
  1678. case 82:
  1679. #line 524 "awk.y"
  1680. {
  1681.         yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1682.             node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1683.         yyerrok;
  1684.       ;
  1685.     break;}
  1686. case 83:
  1687. #line 530 "awk.y"
  1688. { yyval.nodeval = NULL; ;
  1689.     break;}
  1690. case 84:
  1691. #line 532 "awk.y"
  1692. { yyval.nodeval = NULL; ;
  1693.     break;}
  1694. case 85:
  1695. #line 534 "awk.y"
  1696. { yyval.nodeval = NULL; ;
  1697.     break;}
  1698. case 86:
  1699. #line 536 "awk.y"
  1700. { yyval.nodeval = NULL; ;
  1701.     break;}
  1702. case 87:
  1703. #line 541 "awk.y"
  1704. { yyval.nodeval = NULL; ;
  1705.     break;}
  1706. case 88:
  1707. #line 543 "awk.y"
  1708. { yyval.nodeval = yyvsp[0].nodeval; ;
  1709.     break;}
  1710. case 89:
  1711. #line 548 "awk.y"
  1712. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1713.     break;}
  1714. case 90:
  1715. #line 550 "awk.y"
  1716. {
  1717.             yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1718.                 node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1719.             yyerrok;
  1720.         ;
  1721.     break;}
  1722. case 91:
  1723. #line 556 "awk.y"
  1724. { yyval.nodeval = NULL; ;
  1725.     break;}
  1726. case 92:
  1727. #line 558 "awk.y"
  1728. { yyval.nodeval = NULL; ;
  1729.     break;}
  1730. case 93:
  1731. #line 560 "awk.y"
  1732. { yyval.nodeval = NULL; ;
  1733.     break;}
  1734. case 94:
  1735. #line 562 "awk.y"
  1736. { yyval.nodeval = NULL; ;
  1737.     break;}
  1738. case 95:
  1739. #line 567 "awk.y"
  1740. { want_assign = 0; ;
  1741.     break;}
  1742. case 96:
  1743. #line 569 "awk.y"
  1744. {
  1745.           if (do_lint && yyvsp[0].nodeval->type == Node_regex)
  1746.             warning("Regular expression on left of assignment.");
  1747.           yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval);
  1748.         ;
  1749.     break;}
  1750. case 97:
  1751. #line 575 "awk.y"
  1752. { yyval.nodeval = node (variable(yyvsp[0].sval,1), Node_in_array, yyvsp[-3].nodeval); ;
  1753.     break;}
  1754. case 98:
  1755. #line 577 "awk.y"
  1756. {
  1757.           yyval.nodeval = node (yyvsp[0].nodeval, Node_K_getline,
  1758.              node (yyvsp[-3].nodeval, Node_redirect_pipein, (NODE *)NULL));
  1759.         ;
  1760.     break;}
  1761. case 99:
  1762. #line 582 "awk.y"
  1763. {
  1764.           if (do_lint && ! io_allowed && yyvsp[0].nodeval == NULL)
  1765.             warning("non-redirected getline undefined inside BEGIN or END action");
  1766.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1767.         ;
  1768.     break;}
  1769. case 100:
  1770. #line 588 "awk.y"
  1771. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1772.     break;}
  1773. case 101:
  1774. #line 590 "awk.y"
  1775. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1776.     break;}
  1777. case 102:
  1778. #line 592 "awk.y"
  1779. {
  1780.           if (yyvsp[-2].nodeval->type == Node_regex)
  1781.             warning("Regular expression on left of MATCH operator.");
  1782.           yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, mk_rexp(yyvsp[0].nodeval));
  1783.         ;
  1784.     break;}
  1785. case 103:
  1786. #line 598 "awk.y"
  1787. { yyval.nodeval = yyvsp[0].nodeval; ;
  1788.     break;}
  1789. case 104:
  1790. #line 600 "awk.y"
  1791. {
  1792.           yyval.nodeval = node(node(make_number(0.0),
  1793.                  Node_field_spec,
  1794.                  (NODE *) NULL),
  1795.                     Node_nomatch,
  1796.                 yyvsp[0].nodeval);
  1797.         ;
  1798.     break;}
  1799. case 105:
  1800. #line 608 "awk.y"
  1801. { yyval.nodeval = node (variable(yyvsp[0].sval,1), Node_in_array, yyvsp[-2].nodeval); ;
  1802.     break;}
  1803. case 106:
  1804. #line 610 "awk.y"
  1805. {
  1806.           if (do_lint && yyvsp[0].nodeval->type == Node_regex)
  1807.             warning("Regular expression on left of comparison.");
  1808.           yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval);
  1809.         ;
  1810.     break;}
  1811. case 107:
  1812. #line 616 "awk.y"
  1813. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_less, yyvsp[0].nodeval); ;
  1814.     break;}
  1815. case 108:
  1816. #line 618 "awk.y"
  1817. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_greater, yyvsp[0].nodeval); ;
  1818.     break;}
  1819. case 109:
  1820. #line 620 "awk.y"
  1821. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1822.     break;}
  1823. case 110:
  1824. #line 622 "awk.y"
  1825. { yyval.nodeval = yyvsp[0].nodeval; ;
  1826.     break;}
  1827. case 111:
  1828. #line 624 "awk.y"
  1829. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1830.     break;}
  1831. case 112:
  1832. #line 629 "awk.y"
  1833. { want_assign = 0; ;
  1834.     break;}
  1835. case 113:
  1836. #line 631 "awk.y"
  1837. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1838.     break;}
  1839. case 114:
  1840. #line 633 "awk.y"
  1841. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1842.     break;}
  1843. case 115:
  1844. #line 635 "awk.y"
  1845. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1846.     break;}
  1847. case 116:
  1848. #line 637 "awk.y"
  1849. {
  1850.           if (do_lint && ! io_allowed && yyvsp[0].nodeval == NULL)
  1851.             warning("non-redirected getline undefined inside BEGIN or END action");
  1852.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1853.         ;
  1854.     break;}
  1855. case 117:
  1856. #line 643 "awk.y"
  1857. { yyval.nodeval = yyvsp[0].nodeval; ;
  1858.     break;}
  1859. case 118:
  1860. #line 645 "awk.y"
  1861. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1862.     break;}
  1863. case 119:
  1864. #line 647 "awk.y"
  1865. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, mk_rexp(yyvsp[0].nodeval)); ;
  1866.     break;}
  1867. case 120:
  1868. #line 649 "awk.y"
  1869. { yyval.nodeval = node (variable(yyvsp[0].sval,1), Node_in_array, yyvsp[-2].nodeval); ;
  1870.     break;}
  1871. case 121:
  1872. #line 651 "awk.y"
  1873. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1874.     break;}
  1875. case 122:
  1876. #line 653 "awk.y"
  1877. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1878.     break;}
  1879. case 123:
  1880. #line 655 "awk.y"
  1881. { yyval.nodeval = yyvsp[0].nodeval; ;
  1882.     break;}
  1883. case 124:
  1884. #line 657 "awk.y"
  1885. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1886.     break;}
  1887. case 126:
  1888. #line 664 "awk.y"
  1889. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_exp, yyvsp[0].nodeval); ;
  1890.     break;}
  1891. case 127:
  1892. #line 666 "awk.y"
  1893. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_times, yyvsp[0].nodeval); ;
  1894.     break;}
  1895. case 128:
  1896. #line 668 "awk.y"
  1897. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_quotient, yyvsp[0].nodeval); ;
  1898.     break;}
  1899. case 129:
  1900. #line 670 "awk.y"
  1901. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_mod, yyvsp[0].nodeval); ;
  1902.     break;}
  1903. case 130:
  1904. #line 672 "awk.y"
  1905. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_plus, yyvsp[0].nodeval); ;
  1906.     break;}
  1907. case 131:
  1908. #line 674 "awk.y"
  1909. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_minus, yyvsp[0].nodeval); ;
  1910.     break;}
  1911. case 132:
  1912. #line 676 "awk.y"
  1913. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postincrement, (NODE *)NULL); ;
  1914.     break;}
  1915. case 133:
  1916. #line 678 "awk.y"
  1917. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postdecrement, (NODE *)NULL); ;
  1918.     break;}
  1919. case 134:
  1920. #line 683 "awk.y"
  1921. { yyval.nodeval = node (yyvsp[0].nodeval, Node_not,(NODE *) NULL); ;
  1922.     break;}
  1923. case 135:
  1924. #line 685 "awk.y"
  1925. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1926.     break;}
  1927. case 136:
  1928. #line 688 "awk.y"
  1929. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, (int) yyvsp[-3].lval); ;
  1930.     break;}
  1931. case 137:
  1932. #line 690 "awk.y"
  1933. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, (int) yyvsp[-3].lval); ;
  1934.     break;}
  1935. case 138:
  1936. #line 692 "awk.y"
  1937. {
  1938.         if (do_lint)
  1939.             warning("call of `length' without parentheses is not portable");
  1940.         yyval.nodeval = snode ((NODE *)NULL, Node_builtin, (int) yyvsp[0].lval);
  1941.         if (do_posix)
  1942.             warning( "call of `length' without parentheses is deprecated by POSIX");
  1943.       ;
  1944.     break;}
  1945. case 139:
  1946. #line 700 "awk.y"
  1947. {
  1948.         yyval.nodeval = node (yyvsp[-1].nodeval, Node_func_call, make_string(yyvsp[-3].sval, strlen(yyvsp[-3].sval)));
  1949.       ;
  1950.     break;}
  1951. case 141:
  1952. #line 705 "awk.y"
  1953. { yyval.nodeval = node (yyvsp[0].nodeval, Node_preincrement, (NODE *)NULL); ;
  1954.     break;}
  1955. case 142:
  1956. #line 707 "awk.y"
  1957. { yyval.nodeval = node (yyvsp[0].nodeval, Node_predecrement, (NODE *)NULL); ;
  1958.     break;}
  1959. case 143:
  1960. #line 709 "awk.y"
  1961. { yyval.nodeval = yyvsp[0].nodeval; ;
  1962.     break;}
  1963. case 144:
  1964. #line 711 "awk.y"
  1965. { yyval.nodeval = yyvsp[0].nodeval; ;
  1966.     break;}
  1967. case 145:
  1968. #line 714 "awk.y"
  1969. { if (yyvsp[0].nodeval->type == Node_val) {
  1970.             yyvsp[0].nodeval->numbr = -(force_number(yyvsp[0].nodeval));
  1971.             yyval.nodeval = yyvsp[0].nodeval;
  1972.           } else
  1973.             yyval.nodeval = node (yyvsp[0].nodeval, Node_unary_minus, (NODE *)NULL);
  1974.         ;
  1975.     break;}
  1976. case 146:
  1977. #line 721 "awk.y"
  1978. { yyval.nodeval = yyvsp[0].nodeval; ;
  1979.     break;}
  1980. case 147:
  1981. #line 726 "awk.y"
  1982. { yyval.nodeval = NULL; ;
  1983.     break;}
  1984. case 148:
  1985. #line 728 "awk.y"
  1986. { yyval.nodeval = yyvsp[0].nodeval; ;
  1987.     break;}
  1988. case 149:
  1989. #line 733 "awk.y"
  1990. { yyval.nodeval = variable(yyvsp[0].sval,1); ;
  1991.     break;}
  1992. case 150:
  1993. #line 735 "awk.y"
  1994. {
  1995.         if (yyvsp[-1].nodeval->rnode == NULL) {
  1996.             yyval.nodeval = node (variable(yyvsp[-3].sval,1), Node_subscript, yyvsp[-1].nodeval->lnode);
  1997.             freenode(yyvsp[-1].nodeval);
  1998.         } else
  1999.             yyval.nodeval = node (variable(yyvsp[-3].sval,1), Node_subscript, yyvsp[-1].nodeval);
  2000.         ;
  2001.     break;}
  2002. case 151:
  2003. #line 743 "awk.y"
  2004. { yyval.nodeval = node (yyvsp[0].nodeval, Node_field_spec, (NODE *)NULL); ;
  2005.     break;}
  2006. case 153:
  2007. #line 751 "awk.y"
  2008. { yyerrok; ;
  2009.     break;}
  2010. case 154:
  2011. #line 755 "awk.y"
  2012. { yyerrok; ;
  2013.     break;}
  2014. case 157:
  2015. #line 764 "awk.y"
  2016. { yyerrok; want_assign = 0; ;
  2017.     break;}
  2018. case 158:
  2019. #line 767 "awk.y"
  2020. { yyerrok; ;
  2021.     break;}
  2022. }
  2023.    /* the action file gets copied in in place of this dollarsign */
  2024. #line 440 "/usr/local/lib/bison.simple"
  2025.  
  2026.   yyvsp -= yylen;
  2027.   yyssp -= yylen;
  2028. #ifdef YYLSP_NEEDED
  2029.   yylsp -= yylen;
  2030. #endif
  2031.  
  2032. #if YYDEBUG != 0
  2033.   if (yydebug)
  2034.     {
  2035.       short *ssp1 = yyss - 1;
  2036.       fprintf (stderr, "state stack now");
  2037.       while (ssp1 != yyssp)
  2038.     fprintf (stderr, " %d", *++ssp1);
  2039.       fprintf (stderr, "\n");
  2040.     }
  2041. #endif
  2042.  
  2043.   *++yyvsp = yyval;
  2044.  
  2045. #ifdef YYLSP_NEEDED
  2046.   yylsp++;
  2047.   if (yylen == 0)
  2048.     {
  2049.       yylsp->first_line = yylloc.first_line;
  2050.       yylsp->first_column = yylloc.first_column;
  2051.       yylsp->last_line = (yylsp-1)->last_line;
  2052.       yylsp->last_column = (yylsp-1)->last_column;
  2053.       yylsp->text = 0;
  2054.     }
  2055.   else
  2056.     {
  2057.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  2058.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  2059.     }
  2060. #endif
  2061.  
  2062.   /* Now "shift" the result of the reduction.
  2063.      Determine what state that goes to,
  2064.      based on the state we popped back to
  2065.      and the rule number reduced by.  */
  2066.  
  2067.   yyn = yyr1[yyn];
  2068.  
  2069.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  2070.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  2071.     yystate = yytable[yystate];
  2072.   else
  2073.     yystate = yydefgoto[yyn - YYNTBASE];
  2074.  
  2075.   goto yynewstate;
  2076.  
  2077. yyerrlab:   /* here on detecting error */
  2078.  
  2079.   if (! yyerrstatus)
  2080.     /* If not already recovering from an error, report this error.  */
  2081.     {
  2082.       ++yynerrs;
  2083.  
  2084. #ifdef YYERROR_VERBOSE
  2085.       yyn = yypact[yystate];
  2086.  
  2087.       if (yyn > YYFLAG && yyn < YYLAST)
  2088.     {
  2089.       int size = 0;
  2090.       char *msg;
  2091.       int x, count;
  2092.  
  2093.       count = 0;
  2094.       for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
  2095.         if (yycheck[x + yyn] == x)
  2096.           size += strlen(yytname[x]) + 15, count++;
  2097.       msg = (char *) malloc(size + 15);
  2098.       if (msg != 0)
  2099.         {
  2100.           strcpy(msg, "parse error");
  2101.  
  2102.           if (count < 5)
  2103.         {
  2104.           count = 0;
  2105.           for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
  2106.             if (yycheck[x + yyn] == x)
  2107.               {
  2108.             strcat(msg, count == 0 ? ", expecting `" : " or `");
  2109.             strcat(msg, yytname[x]);
  2110.             strcat(msg, "'");
  2111.             count++;
  2112.               }
  2113.         }
  2114.           yyerror(msg);
  2115.           free(msg);
  2116.         }
  2117.       else
  2118.         yyerror ("parse error; also virtual memory exceeded");
  2119.     }
  2120.       else
  2121. #endif /* YYERROR_VERBOSE */
  2122.     yyerror("parse error");
  2123.     }
  2124.  
  2125. yyerrlab1:   /* here on error raised explicitly by an action */
  2126.  
  2127.   if (yyerrstatus == 3)
  2128.     {
  2129.       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
  2130.  
  2131.       /* return failure if at end of input */
  2132.       if (yychar == YYEOF)
  2133.     YYABORT;
  2134.  
  2135. #if YYDEBUG != 0
  2136.       if (yydebug)
  2137.     fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
  2138. #endif
  2139.  
  2140.       yychar = YYEMPTY;
  2141.     }
  2142.  
  2143.   /* Else will try to reuse lookahead token
  2144.      after shifting the error token.  */
  2145.  
  2146.   yyerrstatus = 3;        /* Each real token shifted decrements this */
  2147.  
  2148.   goto yyerrhandle;
  2149.  
  2150. yyerrdefault:  /* current state does not do anything special for the error token. */
  2151.  
  2152. #if 0
  2153.   /* This is wrong; only states that explicitly want error tokens
  2154.      should shift them.  */
  2155.   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  2156.   if (yyn) goto yydefault;
  2157. #endif
  2158.  
  2159. yyerrpop:   /* pop the current state because it cannot handle the error token */
  2160.  
  2161.   if (yyssp == yyss) YYABORT;
  2162.   yyvsp--;
  2163.   yystate = *--yyssp;
  2164. #ifdef YYLSP_NEEDED
  2165.   yylsp--;
  2166. #endif
  2167.  
  2168. #if YYDEBUG != 0
  2169.   if (yydebug)
  2170.     {
  2171.       short *ssp1 = yyss - 1;
  2172.       fprintf (stderr, "Error: state stack now");
  2173.       while (ssp1 != yyssp)
  2174.     fprintf (stderr, " %d", *++ssp1);
  2175.       fprintf (stderr, "\n");
  2176.     }
  2177. #endif
  2178.  
  2179. yyerrhandle:
  2180.  
  2181.   yyn = yypact[yystate];
  2182.   if (yyn == YYFLAG)
  2183.     goto yyerrdefault;
  2184.  
  2185.   yyn += YYTERROR;
  2186.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
  2187.     goto yyerrdefault;
  2188.  
  2189.   yyn = yytable[yyn];
  2190.   if (yyn < 0)
  2191.     {
  2192.       if (yyn == YYFLAG)
  2193.     goto yyerrpop;
  2194.       yyn = -yyn;
  2195.       goto yyreduce;
  2196.     }
  2197.   else if (yyn == 0)
  2198.     goto yyerrpop;
  2199.  
  2200.   if (yyn == YYFINAL)
  2201.     YYACCEPT;
  2202.  
  2203. #if YYDEBUG != 0
  2204.   if (yydebug)
  2205.     fprintf(stderr, "Shifting error token, ");
  2206. #endif
  2207.  
  2208.   *++yyvsp = yylval;
  2209. #ifdef YYLSP_NEEDED
  2210.   *++yylsp = yylloc;
  2211. #endif
  2212.  
  2213.   yystate = yyn;
  2214.   goto yynewstate;
  2215. }
  2216. #line 770 "awk.y"
  2217.  
  2218.  
  2219. struct token {
  2220.     const char *operator;        /* text to match */
  2221.     NODETYPE value;        /* node type */
  2222.     int class;        /* lexical class */
  2223.     unsigned flags;        /* # of args. allowed and compatability */
  2224. #    define    ARGS    0xFF    /* 0, 1, 2, 3 args allowed (any combination */
  2225. #    define    A(n)    (1<<(n))
  2226. #    define    VERSION    0xFF00    /* old awk is zero */
  2227. #    define    NOT_OLD        0x0100    /* feature not in old awk */
  2228. #    define    NOT_POSIX    0x0200    /* feature not in POSIX */
  2229. #    define    GAWKX        0x0400    /* gawk extension */
  2230.     NODE *(*ptr) ();    /* function that implements this keyword */
  2231. };
  2232.  
  2233. extern NODE
  2234.     *do_exp(),    *do_getline(),    *do_index(),    *do_length(),
  2235.     *do_sqrt(),    *do_log(),    *do_sprintf(),    *do_substr(),
  2236.     *do_split(),    *do_system(),    *do_int(),    *do_close(),
  2237.     *do_atan2(),    *do_sin(),    *do_cos(),    *do_rand(),
  2238.     *do_srand(),    *do_match(),    *do_tolower(),    *do_toupper(),
  2239.     *do_sub(),    *do_gsub(),    *do_strftime(),    *do_systime();
  2240.  
  2241. /* Tokentab is sorted ascii ascending order, so it can be binary searched. */
  2242.  
  2243. static struct token tokentab[] = {
  2244. {"BEGIN",    Node_illegal,     LEX_BEGIN,    0,        0},
  2245. {"END",        Node_illegal,     LEX_END,    0,        0},
  2246. {"atan2",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(2),    do_atan2},
  2247. {"break",    Node_K_break,     LEX_BREAK,    0,        0},
  2248. {"close",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_close},
  2249. {"continue",    Node_K_continue, LEX_CONTINUE,    0,        0},
  2250. {"cos",        Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_cos},
  2251. {"delete",    Node_K_delete,     LEX_DELETE,    NOT_OLD,    0},
  2252. {"do",        Node_K_do,     LEX_DO,    NOT_OLD,    0},
  2253. {"else",    Node_illegal,     LEX_ELSE,    0,        0},
  2254. {"exit",    Node_K_exit,     LEX_EXIT,    0,        0},
  2255. {"exp",        Node_builtin,     LEX_BUILTIN,    A(1),        do_exp},
  2256. {"for",        Node_K_for,     LEX_FOR,    0,        0},
  2257. {"func",    Node_K_function, LEX_FUNCTION,    NOT_POSIX|NOT_OLD,    0},
  2258. {"function",    Node_K_function, LEX_FUNCTION,    NOT_OLD,    0},
  2259. {"getline",    Node_K_getline,     LEX_GETLINE,    NOT_OLD,    0},
  2260. {"gsub",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(2)|A(3), do_gsub},
  2261. {"if",        Node_K_if,     LEX_IF,    0,        0},
  2262. {"in",        Node_illegal,     LEX_IN,    0,        0},
  2263. {"index",    Node_builtin,     LEX_BUILTIN,    A(2),        do_index},
  2264. {"int",        Node_builtin,     LEX_BUILTIN,    A(1),        do_int},
  2265. {"length",    Node_builtin,     LEX_LENGTH,    A(0)|A(1),    do_length},
  2266. {"log",        Node_builtin,     LEX_BUILTIN,    A(1),        do_log},
  2267. {"match",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(2),    do_match},
  2268. {"next",    Node_K_next,     LEX_NEXT,    0,        0},
  2269. {"print",    Node_K_print,     LEX_PRINT,    0,        0},
  2270. {"printf",    Node_K_printf,     LEX_PRINTF,    0,        0},
  2271. {"rand",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(0),    do_rand},
  2272. {"return",    Node_K_return,     LEX_RETURN,    NOT_OLD,    0},
  2273. {"sin",        Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_sin},
  2274. {"split",    Node_builtin,     LEX_BUILTIN,    A(2)|A(3),    do_split},
  2275. {"sprintf",    Node_builtin,     LEX_BUILTIN,    0,        do_sprintf},
  2276. {"sqrt",    Node_builtin,     LEX_BUILTIN,    A(1),        do_sqrt},
  2277. {"srand",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(0)|A(1), do_srand},
  2278. {"strftime",    Node_builtin,     LEX_BUILTIN,    GAWKX|A(1)|A(2), do_strftime},
  2279. {"sub",        Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(2)|A(3), do_sub},
  2280. {"substr",    Node_builtin,     LEX_BUILTIN,    A(2)|A(3),    do_substr},
  2281. {"system",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_system},
  2282. {"systime",    Node_builtin,     LEX_BUILTIN,    GAWKX|A(0),    do_systime},
  2283. {"tolower",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_tolower},
  2284. {"toupper",    Node_builtin,     LEX_BUILTIN,    NOT_OLD|A(1),    do_toupper},
  2285. {"while",    Node_K_while,     LEX_WHILE,    0,        0},
  2286. };
  2287.  
  2288. /* VARARGS0 */
  2289. static void
  2290. yyerror(va_alist)
  2291. va_dcl
  2292. {
  2293.     va_list args;
  2294.     const char *mesg = NULL;
  2295.     register char *bp, *cp;
  2296.     char *scan;
  2297.     char buf[120];
  2298.     static char end_of_file_line[] = "(END OF FILE)";
  2299.  
  2300.     errcount++;
  2301.     /* Find the current line in the input file */
  2302.     if (lexptr) {
  2303.         if (!thisline) {
  2304.             cp = lexeme;
  2305.             if (*cp == '\n') {
  2306.                 cp--;
  2307.                 mesg = "unexpected newline";
  2308.             }
  2309.             for ( ; cp != lexptr_begin && *cp != '\n'; --cp)
  2310.                 ;
  2311.             if (*cp == '\n')
  2312.                 cp++;
  2313.             thisline = cp;
  2314.         }
  2315.         /* NL isn't guaranteed */
  2316.         bp = lexeme;
  2317.         while (bp < lexend && *bp && *bp != '\n')
  2318.             bp++;
  2319.     } else {
  2320.         thisline = end_of_file_line;
  2321.         bp = thisline + strlen(thisline);
  2322.     }
  2323.     msg("%.*s", (int) (bp - thisline), thisline);
  2324.     bp = buf;
  2325.     cp = buf + sizeof(buf) - 24;    /* 24 more than longest msg. input */
  2326.     if (lexptr) {
  2327.         scan = thisline;
  2328.         while (bp < cp && scan < lexeme)
  2329.             if (*scan++ == '\t')
  2330.                 *bp++ = '\t';
  2331.             else
  2332.                 *bp++ = ' ';
  2333.         *bp++ = '^';
  2334.         *bp++ = ' ';
  2335.     }
  2336.     va_start(args);
  2337.     if (mesg == NULL)
  2338.         mesg = va_arg(args, char *);
  2339.     strcpy(bp, mesg);
  2340.     err("", buf, args);
  2341.     va_end(args);
  2342.     exit(2);
  2343. }
  2344.  
  2345. static char *
  2346. get_src_buf()
  2347. {
  2348.     static int samefile = 0;
  2349.     static int nextfile = 0;
  2350.     static char *buf = NULL;
  2351.     static int fd;
  2352.     int n;
  2353.     register char *scan;
  2354.     static int len = 0;
  2355.     static int did_newline = 0;
  2356. #    define    SLOP    128    /* enough space to hold most source lines */
  2357.  
  2358.     if (nextfile > numfiles)
  2359.         return NULL;
  2360.  
  2361.     if (srcfiles[nextfile].stype == CMDLINE) {
  2362.         if (len == 0) {
  2363.             len = strlen(srcfiles[nextfile].val);
  2364.             sourceline = 1;
  2365.             lexptr = lexptr_begin = srcfiles[nextfile].val;
  2366.             lexend = lexptr + len;
  2367.         } else if (!did_newline && *(lexptr-1) != '\n') {
  2368.             /*
  2369.              * The following goop is to ensure that the source
  2370.              * ends with a newline and that the entire current
  2371.              * line is available for error messages.
  2372.              */
  2373.             int offset;
  2374.  
  2375.             did_newline = 1;
  2376.             offset = lexptr - lexeme;
  2377.             for (scan = lexeme; scan > lexptr_begin; scan--)
  2378.                 if (*scan == '\n') {
  2379.                     scan++;
  2380.                     break;
  2381.                 }
  2382.             len = lexptr - scan;
  2383.             emalloc(buf, char *, len+1, "get_src_buf");
  2384.             memcpy(buf, scan, len);
  2385.             thisline = buf;
  2386.             lexptr = buf + len;
  2387.             *lexptr = '\n';
  2388.             lexeme = lexptr - offset;
  2389.             lexptr_begin = buf;
  2390.             lexend = lexptr + 1;
  2391.         } else {
  2392.             len = 0;
  2393.             lexeme = lexptr = lexptr_begin = NULL;
  2394.         }
  2395.         if (lexptr == NULL && ++nextfile <= numfiles)
  2396.             return get_src_buf();
  2397.         return lexptr;
  2398.     }
  2399.     if (!samefile) {
  2400.         source = srcfiles[nextfile].val;
  2401.         if (source == NULL) {
  2402.             if (buf) {
  2403.                 free(buf);
  2404.                 buf = NULL;
  2405.             }
  2406.             len = 0;
  2407.             return lexeme = lexptr = lexptr_begin = NULL;
  2408.         }
  2409.         fd = pathopen(source);
  2410.         if (fd == -1)
  2411.             fatal("can't open source file \"%s\" for reading (%s)",
  2412.                 source, strerror(errno));
  2413.         len = optimal_bufsize(fd);
  2414.         if (buf)
  2415.             free(buf);
  2416.         emalloc(buf, char *, len + SLOP, "get_src_buf");
  2417.         lexptr_begin = buf + SLOP;
  2418.         samefile = 1;
  2419.         sourceline = 1;
  2420.     } else {
  2421.         /*
  2422.          * Here, we retain the current source line (up to length SLOP)
  2423.          * in the beginning of the buffer that was overallocated above
  2424.          */
  2425.         int offset;
  2426.         int linelen;
  2427.  
  2428.         offset = lexptr - lexeme;
  2429.         for (scan = lexeme; scan > lexptr_begin; scan--)
  2430.             if (*scan == '\n') {
  2431.                 scan++;
  2432.                 break;
  2433.             }
  2434.         linelen = lexptr - scan;
  2435.         if (linelen > SLOP)
  2436.             linelen = SLOP;
  2437.         thisline = buf + SLOP - linelen;
  2438.         memcpy(thisline, scan, linelen);
  2439.         lexeme = buf + SLOP - offset;
  2440.         lexptr_begin = thisline;
  2441.     }
  2442.     n = read(fd, buf + SLOP, len);
  2443.     if (n == -1)
  2444.         fatal("can't read sourcefile \"%s\" (%s)",
  2445.             source, strerror(errno));
  2446.     if (n == 0) {
  2447.         samefile = 0;
  2448.         nextfile++;
  2449.         len = 0;
  2450.         return get_src_buf();
  2451.     }
  2452.     lexptr = buf + SLOP;
  2453.     lexend = lexptr + n;
  2454.     return buf;
  2455. }
  2456.  
  2457. #define    tokadd(x) (*tok++ = (x), tok == tokend ? tokexpand() : tok)
  2458.  
  2459. char *
  2460. tokexpand()
  2461. {
  2462.     static int toksize = 60;
  2463.     int tokoffset;
  2464.  
  2465.     tokoffset = tok - tokstart;
  2466.     toksize *= 2;
  2467.     if (tokstart)
  2468.         erealloc(tokstart, char *, toksize, "tokexpand");
  2469.     else
  2470.         emalloc(tokstart, char *, toksize, "tokexpand");
  2471.     tokend = tokstart + toksize;
  2472.     tok = tokstart + tokoffset;
  2473.     return tok;
  2474. }
  2475.  
  2476. #if DEBUG
  2477. char
  2478. nextc() {
  2479.     if (lexptr && lexptr < lexend)
  2480.         return *lexptr++;
  2481.     else if (get_src_buf())
  2482.         return *lexptr++;
  2483.     else
  2484.         return '\0';
  2485. }
  2486. #else
  2487. #define    nextc()    ((lexptr && lexptr < lexend) ? \
  2488.             *lexptr++ : \
  2489.             (get_src_buf() ? *lexptr++ : '\0') \
  2490.         )
  2491. #endif
  2492. #define pushback() (lexptr && lexptr > lexptr_begin ? lexptr-- : lexptr)
  2493.  
  2494. /*
  2495.  * Read the input and turn it into tokens.
  2496.  */
  2497.  
  2498. static int
  2499. yylex()
  2500. {
  2501.     register int c;
  2502.     int seen_e = 0;        /* These are for numbers */
  2503.     int seen_point = 0;
  2504.     int esc_seen;        /* for literal strings */
  2505.     int low, mid, high;
  2506.     static int did_newline = 0;
  2507.     char *tokkey;
  2508.  
  2509.     if (!nextc())
  2510.         return 0;
  2511.     pushback();
  2512. #ifdef OS2
  2513.     /*
  2514.      * added for OS/2's extproc feature of cmd.exe
  2515.      * (like #! in BSD sh)
  2516.      */
  2517.     if (strncasecmp(lexptr, "extproc ", 8) == 0) {
  2518.         while (*lexptr && *lexptr != '\n')
  2519.             lexptr++;
  2520.     }
  2521. #endif
  2522.     lexeme = lexptr;
  2523.     thisline = NULL;
  2524.     if (want_regexp) {
  2525.         int in_brack = 0;
  2526.  
  2527.         want_regexp = 0;
  2528.         tok = tokstart;
  2529.         while ((c = nextc()) != 0) {
  2530.             switch (c) {
  2531.             case '[':
  2532.                 in_brack = 1;
  2533.                 break;
  2534.             case ']':
  2535.                 in_brack = 0;
  2536.                 break;
  2537.             case '\\':
  2538.                 if ((c = nextc()) == '\0') {
  2539.                     yyerror("unterminated regexp ends with \\ at end of file");
  2540.                 } else if (c == '\n') {
  2541.                     sourceline++;
  2542.                     continue;
  2543.                 } else
  2544.                     tokadd('\\');
  2545.                 break;
  2546.             case '/':    /* end of the regexp */
  2547.                 if (in_brack)
  2548.                     break;
  2549.  
  2550.                 pushback();
  2551.                 tokadd('\0');
  2552.                 yylval.sval = tokstart;
  2553.                 return REGEXP;
  2554.             case '\n':
  2555.                 pushback();
  2556.                 yyerror("unterminated regexp");
  2557.             case '\0':
  2558.                 yyerror("unterminated regexp at end of file");
  2559.             }
  2560.             tokadd(c);
  2561.         }
  2562.     }
  2563. retry:
  2564.     while ((c = nextc()) == ' ' || c == '\t')
  2565.         ;
  2566.  
  2567.     lexeme = lexptr ? lexptr - 1 : lexptr;
  2568.     thisline = NULL;
  2569.     tok = tokstart;
  2570.     yylval.nodetypeval = Node_illegal;
  2571.  
  2572.     switch (c) {
  2573.     case 0:
  2574.         return 0;
  2575.  
  2576.     case '\n':
  2577.         sourceline++;
  2578.         return NEWLINE;
  2579.  
  2580.     case '#':        /* it's a comment */
  2581.         while ((c = nextc()) != '\n') {
  2582.             if (c == '\0')
  2583.                 return 0;
  2584.         }
  2585.         sourceline++;
  2586.         return NEWLINE;
  2587.  
  2588.     case '\\':
  2589. #ifdef RELAXED_CONTINUATION
  2590.         /*
  2591.          * This code puports to allow comments and/or whitespace
  2592.          * after the `\' at the end of a line used for continuation.
  2593.          * Use it at your own risk. We think it's a bad idea, which
  2594.          * is why it's not on by default.
  2595.          */
  2596.         if (!do_unix) {
  2597.             /* strip trailing white-space and/or comment */
  2598.             while ((c = nextc()) == ' ' || c == '\t')
  2599.                 continue;
  2600.             if (c == '#')
  2601.                 while ((c = nextc()) != '\n')
  2602.                     if (c == '\0')
  2603.                         break;
  2604.             pushback();
  2605.         }
  2606. #endif /* RELAXED_CONTINUATION */
  2607.         if (nextc() == '\n') {
  2608.             sourceline++;
  2609.             goto retry;
  2610.         } else
  2611.             yyerror("backslash not last character on line");
  2612.         break;
  2613.  
  2614.     case '$':
  2615.         want_assign = 1;
  2616.         return '$';
  2617.  
  2618.     case ')':
  2619.     case ']':
  2620.     case '(':    
  2621.     case '[':
  2622.     case ';':
  2623.     case ':':
  2624.     case '?':
  2625.     case '{':
  2626.     case ',':
  2627.         return c;
  2628.  
  2629.     case '*':
  2630.         if ((c = nextc()) == '=') {
  2631.             yylval.nodetypeval = Node_assign_times;
  2632.             return ASSIGNOP;
  2633.         } else if (do_posix) {
  2634.             pushback();
  2635.             return '*';
  2636.         } else if (c == '*') {
  2637.             /* make ** and **= aliases for ^ and ^= */
  2638.             static int did_warn_op = 0, did_warn_assgn = 0;
  2639.  
  2640.             if (nextc() == '=') {
  2641.                 if (do_lint && ! did_warn_assgn) {
  2642.                     did_warn_assgn = 1;
  2643.                     warning("**= is not allowed by POSIX");
  2644.                 }
  2645.                 yylval.nodetypeval = Node_assign_exp;
  2646.                 return ASSIGNOP;
  2647.             } else {
  2648.                 pushback();
  2649.                 if (do_lint && ! did_warn_op) {
  2650.                     did_warn_op = 1;
  2651.                     warning("** is not allowed by POSIX");
  2652.                 }
  2653.                 return '^';
  2654.             }
  2655.         }
  2656.         pushback();
  2657.         return '*';
  2658.  
  2659.     case '/':
  2660.         if (want_assign) {
  2661.             if (nextc() == '=') {
  2662.                 yylval.nodetypeval = Node_assign_quotient;
  2663.                 return ASSIGNOP;
  2664.             }
  2665.             pushback();
  2666.         }
  2667.         return '/';
  2668.  
  2669.     case '%':
  2670.         if (nextc() == '=') {
  2671.             yylval.nodetypeval = Node_assign_mod;
  2672.             return ASSIGNOP;
  2673.         }
  2674.         pushback();
  2675.         return '%';
  2676.  
  2677.     case '^':
  2678.     {
  2679.         static int did_warn_op = 0, did_warn_assgn = 0;
  2680.  
  2681.         if (nextc() == '=') {
  2682.  
  2683.             if (do_lint && ! did_warn_assgn) {
  2684.                 did_warn_assgn = 1;
  2685.                 warning("operator `^=' is not supported in old awk");
  2686.             }
  2687.             yylval.nodetypeval = Node_assign_exp;
  2688.             return ASSIGNOP;
  2689.         }
  2690.         pushback();
  2691.         if (do_lint && ! did_warn_op) {
  2692.             did_warn_op = 1;
  2693.             warning("operator `^' is not supported in old awk");
  2694.         }
  2695.         return '^';
  2696.     }
  2697.  
  2698.     case '+':
  2699.         if ((c = nextc()) == '=') {
  2700.             yylval.nodetypeval = Node_assign_plus;
  2701.             return ASSIGNOP;
  2702.         }
  2703.         if (c == '+')
  2704.             return INCREMENT;
  2705.         pushback();
  2706.         return '+';
  2707.  
  2708.     case '!':
  2709.         if ((c = nextc()) == '=') {
  2710.             yylval.nodetypeval = Node_notequal;
  2711.             return RELOP;
  2712.         }
  2713.         if (c == '~') {
  2714.             yylval.nodetypeval = Node_nomatch;
  2715.             want_assign = 0;
  2716.             return MATCHOP;
  2717.         }
  2718.         pushback();
  2719.         return '!';
  2720.  
  2721.     case '<':
  2722.         if (nextc() == '=') {
  2723.             yylval.nodetypeval = Node_leq;
  2724.             return RELOP;
  2725.         }
  2726.         yylval.nodetypeval = Node_less;
  2727.         pushback();
  2728.         return '<';
  2729.  
  2730.     case '=':
  2731.         if (nextc() == '=') {
  2732.             yylval.nodetypeval = Node_equal;
  2733.             return RELOP;
  2734.         }
  2735.         yylval.nodetypeval = Node_assign;
  2736.         pushback();
  2737.         return ASSIGNOP;
  2738.  
  2739.     case '>':
  2740.         if ((c = nextc()) == '=') {
  2741.             yylval.nodetypeval = Node_geq;
  2742.             return RELOP;
  2743.         } else if (c == '>') {
  2744.             yylval.nodetypeval = Node_redirect_append;
  2745.             return APPEND_OP;
  2746.         }
  2747.         yylval.nodetypeval = Node_greater;
  2748.         pushback();
  2749.         return '>';
  2750.  
  2751.     case '~':
  2752.         yylval.nodetypeval = Node_match;
  2753.         want_assign = 0;
  2754.         return MATCHOP;
  2755.  
  2756.     case '}':
  2757.         /*
  2758.          * Added did newline stuff.  Easier than
  2759.          * hacking the grammar
  2760.          */
  2761.         if (did_newline) {
  2762.             did_newline = 0;
  2763.             return c;
  2764.         }
  2765.         did_newline++;
  2766.         --lexptr;    /* pick up } next time */
  2767.         return NEWLINE;
  2768.  
  2769.     case '"':
  2770.         esc_seen = 0;
  2771.         while ((c = nextc()) != '"') {
  2772.             if (c == '\n') {
  2773.                 pushback();
  2774.                 yyerror("unterminated string");
  2775.             }
  2776.             if (c == '\\') {
  2777.                 c = nextc();
  2778.                 if (c == '\n') {
  2779.                     sourceline++;
  2780.                     continue;
  2781.                 }
  2782.                 esc_seen = 1;
  2783.                 tokadd('\\');
  2784.             }
  2785.             if (c == '\0') {
  2786.                 pushback();
  2787.                 yyerror("unterminated string");
  2788.             }
  2789.             tokadd(c);
  2790.         }
  2791.         yylval.nodeval = make_str_node(tokstart,
  2792.                     tok - tokstart, esc_seen ? SCAN : 0);
  2793.         yylval.nodeval->flags |= PERM;
  2794.         return YSTRING;
  2795.  
  2796.     case '-':
  2797.         if ((c = nextc()) == '=') {
  2798.             yylval.nodetypeval = Node_assign_minus;
  2799.             return ASSIGNOP;
  2800.         }
  2801.         if (c == '-')
  2802.             return DECREMENT;
  2803.         pushback();
  2804.         return '-';
  2805.  
  2806.     case '.':
  2807.         c = nextc();
  2808.         pushback();
  2809.         if (!isdigit(c))
  2810.             return '.';
  2811.         else
  2812.             c = '.';    /* FALL THROUGH */
  2813.     case '0':
  2814.     case '1':
  2815.     case '2':
  2816.     case '3':
  2817.     case '4':
  2818.     case '5':
  2819.     case '6':
  2820.     case '7':
  2821.     case '8':
  2822.     case '9':
  2823.         /* It's a number */
  2824.         for (;;) {
  2825.             int gotnumber = 0;
  2826.  
  2827.             tokadd(c);
  2828.             switch (c) {
  2829.             case '.':
  2830.                 if (seen_point) {
  2831.                     gotnumber++;
  2832.                     break;
  2833.                 }
  2834.                 ++seen_point;
  2835.                 break;
  2836.             case 'e':
  2837.             case 'E':
  2838.                 if (seen_e) {
  2839.                     gotnumber++;
  2840.                     break;
  2841.                 }
  2842.                 ++seen_e;
  2843.                 if ((c = nextc()) == '-' || c == '+')
  2844.                     tokadd(c);
  2845.                 else
  2846.                     pushback();
  2847.                 break;
  2848.             case '0':
  2849.             case '1':
  2850.             case '2':
  2851.             case '3':
  2852.             case '4':
  2853.             case '5':
  2854.             case '6':
  2855.             case '7':
  2856.             case '8':
  2857.             case '9':
  2858.                 break;
  2859.             default:
  2860.                 gotnumber++;
  2861.             }
  2862.             if (gotnumber)
  2863.                 break;
  2864.             c = nextc();
  2865.         }
  2866.         pushback();
  2867.         yylval.nodeval = make_number(atof(tokstart));
  2868.         yylval.nodeval->flags |= PERM;
  2869.         return YNUMBER;
  2870.  
  2871.     case '&':
  2872.         if ((c = nextc()) == '&') {
  2873.             yylval.nodetypeval = Node_and;
  2874.             for (;;) {
  2875.                 c = nextc();
  2876.                 if (c == '\0')
  2877.                     break;
  2878.                 if (c == '#') {
  2879.                     while ((c = nextc()) != '\n' && c != '\0')
  2880.                         ;
  2881.                     if (c == '\0')
  2882.                         break;
  2883.                 }
  2884.                 if (c == '\n')
  2885.                     sourceline++;
  2886.                 if (! isspace(c)) {
  2887.                     pushback();
  2888.                     break;
  2889.                 }
  2890.             }
  2891.             want_assign = 0;
  2892.             return LEX_AND;
  2893.         }
  2894.         pushback();
  2895.         return '&';
  2896.  
  2897.     case '|':
  2898.         if ((c = nextc()) == '|') {
  2899.             yylval.nodetypeval = Node_or;
  2900.             for (;;) {
  2901.                 c = nextc();
  2902.                 if (c == '\0')
  2903.                     break;
  2904.                 if (c == '#') {
  2905.                     while ((c = nextc()) != '\n' && c != '\0')
  2906.                         ;
  2907.                     if (c == '\0')
  2908.                         break;
  2909.                 }
  2910.                 if (c == '\n')
  2911.                     sourceline++;
  2912.                 if (! isspace(c)) {
  2913.                     pushback();
  2914.                     break;
  2915.                 }
  2916.             }
  2917.             want_assign = 0;
  2918.             return LEX_OR;
  2919.         }
  2920.         pushback();
  2921.         return '|';
  2922.     }
  2923.  
  2924.     if (c != '_' && ! isalpha(c))
  2925.         yyerror("Invalid char '%c' in expression\n", c);
  2926.  
  2927.     /* it's some type of name-type-thing.  Find its length */
  2928.     tok = tokstart;
  2929.     while (is_identchar(c)) {
  2930.         tokadd(c);
  2931.         c = nextc();
  2932.     }
  2933.     tokadd('\0');
  2934.     emalloc(tokkey, char *, tok - tokstart, "yylex");
  2935.     memcpy(tokkey, tokstart, tok - tokstart);
  2936.     pushback();
  2937.  
  2938.     /* See if it is a special token.  */
  2939.     low = 0;
  2940.     high = (sizeof (tokentab) / sizeof (tokentab[0])) - 1;
  2941.     while (low <= high) {
  2942.         int i/* , c */;
  2943.  
  2944.         mid = (low + high) / 2;
  2945.         c = *tokstart - tokentab[mid].operator[0];
  2946.         i = c ? c : strcmp (tokstart, tokentab[mid].operator);
  2947.  
  2948.         if (i < 0) {        /* token < mid */
  2949.             high = mid - 1;
  2950.         } else if (i > 0) {    /* token > mid */
  2951.             low = mid + 1;
  2952.         } else {
  2953.             if (do_lint) {
  2954.                 if (tokentab[mid].flags & GAWKX)
  2955.                     warning("%s() is a gawk extension",
  2956.                         tokentab[mid].operator);
  2957.                 if (tokentab[mid].flags & NOT_POSIX)
  2958.                     warning("POSIX does not allow %s",
  2959.                         tokentab[mid].operator);
  2960.                 if (tokentab[mid].flags & NOT_OLD)
  2961.                     warning("%s is not supported in old awk",
  2962.                         tokentab[mid].operator);
  2963.             }
  2964.             if ((do_unix && (tokentab[mid].flags & GAWKX))
  2965.                 || (do_posix && (tokentab[mid].flags & NOT_POSIX)))
  2966.                 break;
  2967.             if (tokentab[mid].class == LEX_BUILTIN
  2968.                 || tokentab[mid].class == LEX_LENGTH
  2969.                )
  2970.                 yylval.lval = mid;
  2971.             else
  2972.                 yylval.nodetypeval = tokentab[mid].value;
  2973.  
  2974.             return tokentab[mid].class;
  2975.         }
  2976.     }
  2977.  
  2978.     yylval.sval = tokkey;
  2979.     if (*lexptr == '(')
  2980.         return FUNC_CALL;
  2981.     else {
  2982.         want_assign = 1;
  2983.         return NAME;
  2984.     }
  2985. }
  2986.  
  2987. static NODE *
  2988. node_common(op)
  2989. NODETYPE op;
  2990. {
  2991.     register NODE *r;
  2992.  
  2993.     getnode(r);
  2994.     r->type = op;
  2995.     r->flags = MALLOC;
  2996.     /* if lookahead is NL, lineno is 1 too high */
  2997.     if (lexeme && *lexeme == '\n')
  2998.         r->source_line = sourceline - 1;
  2999.     else
  3000.         r->source_line = sourceline;
  3001.     r->source_file = source;
  3002.     return r;
  3003. }
  3004.  
  3005. /*
  3006.  * This allocates a node with defined lnode and rnode. 
  3007.  */
  3008. NODE *
  3009. node(left, op, right)
  3010. NODE *left, *right;
  3011. NODETYPE op;
  3012. {
  3013.     register NODE *r;
  3014.  
  3015.     r = node_common(op);
  3016.     r->lnode = left;
  3017.     r->rnode = right;
  3018.     return r;
  3019. }
  3020.  
  3021. /*
  3022.  * This allocates a node with defined subnode and proc for builtin functions
  3023.  * Checks for arg. count and supplies defaults where possible.
  3024.  */
  3025. static NODE *
  3026. snode(subn, op, idx)
  3027. NODETYPE op;
  3028. int idx;
  3029. NODE *subn;
  3030. {
  3031.     register NODE *r;
  3032.     register NODE *n;
  3033.     int nexp = 0;
  3034.     int args_allowed;
  3035.  
  3036.     r = node_common(op);
  3037.  
  3038.     /* traverse expression list to see how many args. given */
  3039.     for (n= subn; n; n= n->rnode) {
  3040.         nexp++;
  3041.         if (nexp > 3)
  3042.             break;
  3043.     }
  3044.  
  3045.     /* check against how many args. are allowed for this builtin */
  3046.     args_allowed = tokentab[idx].flags & ARGS;
  3047.     if (args_allowed && !(args_allowed & A(nexp)))
  3048.         fatal("%s() cannot have %d argument%c",
  3049.             tokentab[idx].operator, nexp, nexp == 1 ? ' ' : 's');
  3050.  
  3051.     r->proc = tokentab[idx].ptr;
  3052.  
  3053.     /* special case processing for a few builtins */
  3054.     if (nexp == 0 && r->proc == do_length) {
  3055.         subn = node(node(make_number(0.0),Node_field_spec,(NODE *)NULL),
  3056.                     Node_expression_list,
  3057.                 (NODE *) NULL);
  3058.     } else if (r->proc == do_match) {
  3059.         if (subn->rnode->lnode->type != Node_regex)
  3060.             subn->rnode->lnode = mk_rexp(subn->rnode->lnode);
  3061.     } else if (r->proc == do_sub || r->proc == do_gsub) {
  3062.         if (subn->lnode->type != Node_regex)
  3063.             subn->lnode = mk_rexp(subn->lnode);
  3064.         if (nexp == 2)
  3065.             append_right(subn, node(node(make_number(0.0),
  3066.                              Node_field_spec,
  3067.                              (NODE *) NULL),
  3068.                             Node_expression_list,
  3069.                         (NODE *) NULL));
  3070.         else if (do_lint && subn->rnode->rnode->lnode->type == Node_val)
  3071.             warning("string literal as last arg of substitute");
  3072.     } else if (r->proc == do_split) {
  3073.         if (nexp == 2)
  3074.             append_right(subn,
  3075.                 node(FS_node, Node_expression_list, (NODE *) NULL));
  3076.         n = subn->rnode->rnode->lnode;
  3077.         if (n->type != Node_regex)
  3078.             subn->rnode->rnode->lnode = mk_rexp(n);
  3079.         if (nexp == 2)
  3080.             subn->rnode->rnode->lnode->re_flags |= FS_DFLT;
  3081.     }
  3082.  
  3083.     r->subnode = subn;
  3084.     return r;
  3085. }
  3086.  
  3087. /*
  3088.  * This allocates a Node_line_range node with defined condpair and
  3089.  * zeroes the trigger word to avoid the temptation of assuming that calling
  3090.  * 'node( foo, Node_line_range, 0)' will properly initialize 'triggered'. 
  3091.  */
  3092. /* Otherwise like node() */
  3093. static NODE *
  3094. mkrangenode(cpair)
  3095. NODE *cpair;
  3096. {
  3097.     register NODE *r;
  3098.  
  3099.     getnode(r);
  3100.     r->type = Node_line_range;
  3101.     r->condpair = cpair;
  3102.     r->triggered = 0;
  3103.     return r;
  3104. }
  3105.  
  3106. /* Build a for loop */
  3107. static NODE *
  3108. make_for_loop(init, cond, incr)
  3109. NODE *init, *cond, *incr;
  3110. {
  3111.     register FOR_LOOP_HEADER *r;
  3112.     NODE *n;
  3113.  
  3114.     emalloc(r, FOR_LOOP_HEADER *, sizeof(FOR_LOOP_HEADER), "make_for_loop");
  3115.     getnode(n);
  3116.     n->type = Node_illegal;
  3117.     r->init = init;
  3118.     r->cond = cond;
  3119.     r->incr = incr;
  3120.     n->sub.nodep.r.hd = r;
  3121.     return n;
  3122. }
  3123.  
  3124. /*
  3125.  * Install a name in the symbol table, even if it is already there.
  3126.  * Caller must check against redefinition if that is desired. 
  3127.  */
  3128. NODE *
  3129. install(name, value)
  3130. char *name;
  3131. NODE *value;
  3132. {
  3133.     register NODE *hp;
  3134.     register size_t len;
  3135.     register int bucket;
  3136.  
  3137.     len = strlen(name);
  3138.     bucket = hash(name, len, (unsigned long) HASHSIZE);
  3139.     getnode(hp);
  3140.     hp->type = Node_hashnode;
  3141.     hp->hnext = variables[bucket];
  3142.     variables[bucket] = hp;
  3143.     hp->hlength = len;
  3144.     hp->hvalue = value;
  3145.     hp->hname = name;
  3146.     hp->hvalue->vname = name;
  3147.     return hp->hvalue;
  3148. }
  3149.  
  3150. /* find the most recent hash node for name installed by install */
  3151. NODE *
  3152. lookup(name)
  3153. const char *name;
  3154. {
  3155.     register NODE *bucket;
  3156.     register size_t len;
  3157.  
  3158.     len = strlen(name);
  3159.     bucket = variables[hash(name, len, (unsigned long) HASHSIZE)];
  3160.     while (bucket) {
  3161.         if (bucket->hlength == len && STREQN(bucket->hname, name, len))
  3162.             return bucket->hvalue;
  3163.         bucket = bucket->hnext;
  3164.     }
  3165.     return NULL;
  3166. }
  3167.  
  3168. /*
  3169.  * Add new to the rightmost branch of LIST.  This uses n^2 time, so we make
  3170.  * a simple attempt at optimizing it.
  3171.  */
  3172. static NODE *
  3173. append_right(list, new)
  3174. NODE *list, *new;
  3175. {
  3176.     register NODE *oldlist;
  3177.     static NODE *savefront = NULL, *savetail = NULL;
  3178.  
  3179.     oldlist = list;
  3180.     if (savefront == oldlist) {
  3181.         savetail = savetail->rnode = new;
  3182.         return oldlist;
  3183.     } else
  3184.         savefront = oldlist;
  3185.     while (list->rnode != NULL)
  3186.         list = list->rnode;
  3187.     savetail = list->rnode = new;
  3188.     return oldlist;
  3189. }
  3190.  
  3191. /*
  3192.  * check if name is already installed;  if so, it had better have Null value,
  3193.  * in which case def is added as the value. Otherwise, install name with def
  3194.  * as value. 
  3195.  */
  3196. static void
  3197. func_install(params, def)
  3198. NODE *params;
  3199. NODE *def;
  3200. {
  3201.     NODE *r;
  3202.  
  3203.     pop_params(params->rnode);
  3204.     pop_var(params, 0);
  3205.     r = lookup(params->param);
  3206.     if (r != NULL) {
  3207.         fatal("function name `%s' previously defined", params->param);
  3208.     } else
  3209.         (void) install(params->param, node(params, Node_func, def));
  3210. }
  3211.  
  3212. static void
  3213. pop_var(np, freeit)
  3214. NODE *np;
  3215. int freeit;
  3216. {
  3217.     register NODE *bucket, **save;
  3218.     register size_t len;
  3219.     char *name;
  3220.  
  3221.     name = np->param;
  3222.     len = strlen(name);
  3223.     save = &(variables[hash(name, len, (unsigned long) HASHSIZE)]);
  3224.     for (bucket = *save; bucket; bucket = bucket->hnext) {
  3225.         if (len == bucket->hlength && STREQN(bucket->hname, name, len)) {
  3226.             *save = bucket->hnext;
  3227.             freenode(bucket);
  3228.             if (freeit)
  3229.                 free(np->param);
  3230.             return;
  3231.         }
  3232.         save = &(bucket->hnext);
  3233.     }
  3234. }
  3235.  
  3236. static void
  3237. pop_params(params)
  3238. NODE *params;
  3239. {
  3240.     register NODE *np;
  3241.  
  3242.     for (np = params; np != NULL; np = np->rnode)
  3243.         pop_var(np, 1);
  3244. }
  3245.  
  3246. static NODE *
  3247. make_param(name)
  3248. char *name;
  3249. {
  3250.     NODE *r;
  3251.  
  3252.     getnode(r);
  3253.     r->type = Node_param_list;
  3254.     r->rnode = NULL;
  3255.     r->param = name;
  3256.     r->param_cnt = param_counter++;
  3257.     return (install(name, r));
  3258. }
  3259.  
  3260. /* Name points to a variable name.  Make sure its in the symbol table */
  3261. NODE *
  3262. variable(name, can_free)
  3263. char *name;
  3264. int can_free;
  3265. {
  3266.     register NODE *r;
  3267.     static int env_loaded = 0;
  3268.  
  3269.     if (!env_loaded && STREQ(name, "ENVIRON")) {
  3270.         load_environ();
  3271.         env_loaded = 1;
  3272.     }
  3273.     if ((r = lookup(name)) == NULL)
  3274.         r = install(name, node(Nnull_string, Node_var, (NODE *) NULL));
  3275.     else if (can_free)
  3276.         free(name);
  3277.     return r;
  3278. }
  3279.  
  3280. static NODE *
  3281. mk_rexp(exp)
  3282. NODE *exp;
  3283. {
  3284.     if (exp->type == Node_regex)
  3285.         return exp;
  3286.     else {
  3287.         NODE *n;
  3288.  
  3289.         getnode(n);
  3290.         n->type = Node_regex;
  3291.         n->re_exp = exp;
  3292.         n->re_text = NULL;
  3293.         n->re_reg = NULL;
  3294.         n->re_flags = 0;
  3295.         n->re_cnt = 1;
  3296.         return n;
  3297.     }
  3298. }
  3299.