home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gawk-2.15.6-src.tgz / tar.out / fsf / gawk / awktab.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  108KB  |  3,455 lines

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