home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / languages / gnuawk / src / awktab.c < prev    next >
C/C++ Source or Header  |  1990-09-27  |  96KB  |  3,038 lines

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