Annotation of gcc/cexp.c, revision 1.1

1.1     ! root        1: 
        !             2: /*  A Bison parser, made from cexp.y  */
        !             3: 
        !             4: #define YYBISON 1  /* Identify Bison output.  */
        !             5: 
        !             6: #define        INT     258
        !             7: #define        CHAR    259
        !             8: #define        NAME    260
        !             9: #define        ERROR   261
        !            10: #define        OR      262
        !            11: #define        AND     263
        !            12: #define        EQUAL   264
        !            13: #define        NOTEQUAL        265
        !            14: #define        LEQ     266
        !            15: #define        GEQ     267
        !            16: #define        LSH     268
        !            17: #define        RSH     269
        !            18: #define        UNARY   270
        !            19: 
        !            20: #line 26 "cexp.y"
        !            21: 
        !            22: #include "config.h"
        !            23: #include <setjmp.h>
        !            24: /* #define YYDEBUG 1 */
        !            25: 
        !            26: #ifdef MULTIBYTE_CHARS
        !            27: #include <stdlib.h>
        !            28: #include <locale.h>
        !            29: #endif
        !            30: 
        !            31: typedef unsigned char U_CHAR;
        !            32: 
        !            33: /* This is used for communicating lists of keywords with cccp.c.  */
        !            34: struct arglist {
        !            35:   struct arglist *next;
        !            36:   U_CHAR *name;
        !            37:   int length;
        !            38:   int argno;
        !            39: };
        !            40: 
        !            41: int yylex ();
        !            42: void yyerror ();
        !            43: int expression_value;
        !            44: 
        !            45: static jmp_buf parse_return_error;
        !            46: 
        !            47: /* Nonzero means count most punctuation as part of a name.  */
        !            48: static int keyword_parsing = 0;
        !            49: 
        !            50: /* some external tables of character types */
        !            51: extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
        !            52: 
        !            53: /* Flag for -pedantic.  */
        !            54: extern int pedantic;
        !            55: 
        !            56: /* Flag for -traditional.  */
        !            57: extern int traditional;
        !            58: 
        !            59: #ifndef CHAR_TYPE_SIZE
        !            60: #define CHAR_TYPE_SIZE BITS_PER_UNIT
        !            61: #endif
        !            62: 
        !            63: #ifndef INT_TYPE_SIZE
        !            64: #define INT_TYPE_SIZE BITS_PER_WORD
        !            65: #endif
        !            66: 
        !            67: #ifndef LONG_TYPE_SIZE
        !            68: #define LONG_TYPE_SIZE BITS_PER_WORD
        !            69: #endif
        !            70: 
        !            71: #ifndef WCHAR_TYPE_SIZE
        !            72: #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
        !            73: #endif
        !            74: 
        !            75: #line 81 "cexp.y"
        !            76: typedef union {
        !            77:   struct constant {long value; int unsignedp;} integer;
        !            78:   struct name {U_CHAR *address; int length;} name;
        !            79:   struct arglist *keywords;
        !            80:   int voidval;
        !            81:   char *sval;
        !            82: } YYSTYPE;
        !            83: 
        !            84: #ifndef YYLTYPE
        !            85: typedef
        !            86:   struct yyltype
        !            87:     {
        !            88:       int timestamp;
        !            89:       int first_line;
        !            90:       int first_column;
        !            91:       int last_line;
        !            92:       int last_column;
        !            93:       char *text;
        !            94:    }
        !            95:   yyltype;
        !            96: 
        !            97: #define YYLTYPE yyltype
        !            98: #endif
        !            99: 
        !           100: #include <stdio.h>
        !           101: 
        !           102: #ifndef __STDC__
        !           103: #define const
        !           104: #endif
        !           105: 
        !           106: 
        !           107: 
        !           108: #define        YYFINAL         73
        !           109: #define        YYFLAG          -32768
        !           110: #define        YYNTBASE        34
        !           111: 
        !           112: #define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 39)
        !           113: 
        !           114: static const char yytranslate[] = {     0,
        !           115:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           116:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           117:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           118:      2,     2,    29,     2,    31,     2,    27,    14,     2,    32,
        !           119:     33,    25,    23,     9,    24,     2,    26,     2,     2,     2,
        !           120:      2,     2,     2,     2,     2,     2,     2,     8,     2,    17,
        !           121:      2,    18,     7,     2,     2,     2,     2,     2,     2,     2,
        !           122:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           123:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           124:      2,     2,     2,    13,     2,     2,     2,     2,     2,     2,
        !           125:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           126:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           127:      2,     2,     2,    12,     2,    30,     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,     2,     2,     2,     2,     2,     2,     2,     2,
        !           131:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           132:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           133:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           134:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           135:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           136:      2,     2,     2,     2,     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,     2,     2,     2,     2,     2,     2,     2,     2,
        !           140:      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
        !           141:      6,    10,    11,    15,    16,    19,    20,    21,    22,    28
        !           142: };
        !           143: 
        !           144: static const short yyprhs[] = {     0,
        !           145:      0,     2,     4,     8,    11,    14,    17,    20,    23,    24,
        !           146:     31,    35,    39,    43,    47,    51,    55,    59,    63,    67,
        !           147:     71,    75,    79,    83,    87,    91,    95,    99,   103,   107,
        !           148:    113,   115,   117,   119,   120,   125
        !           149: };
        !           150: 
        !           151: static const short yyrhs[] = {    35,
        !           152:      0,    36,     0,    35,     9,    36,     0,    24,    36,     0,
        !           153:     29,    36,     0,    23,    36,     0,    30,    36,     0,    31,
        !           154:      5,     0,     0,    31,     5,    37,    32,    38,    33,     0,
        !           155:     32,    35,    33,     0,    36,    25,    36,     0,    36,    26,
        !           156:     36,     0,    36,    27,    36,     0,    36,    23,    36,     0,
        !           157:     36,    24,    36,     0,    36,    21,    36,     0,    36,    22,
        !           158:     36,     0,    36,    15,    36,     0,    36,    16,    36,     0,
        !           159:     36,    19,    36,     0,    36,    20,    36,     0,    36,    17,
        !           160:     36,     0,    36,    18,    36,     0,    36,    14,    36,     0,
        !           161:     36,    13,    36,     0,    36,    12,    36,     0,    36,    11,
        !           162:     36,     0,    36,    10,    36,     0,    36,     7,    36,     8,
        !           163:     36,     0,     3,     0,     4,     0,     5,     0,     0,    32,
        !           164:     38,    33,    38,     0,     5,    38,     0
        !           165: };
        !           166: 
        !           167: #if YYDEBUG != 0
        !           168: static const short yyrline[] = { 0,
        !           169:    113,   118,   119,   126,   129,   132,   134,   137,   141,   143,
        !           170:    148,   153,   159,   170,   181,   184,   187,   193,   199,   202,
        !           171:    205,   211,   217,   223,   229,   232,   235,   238,   241,   244,
        !           172:    247,   249,   251,   256,   258,   271
        !           173: };
        !           174: 
        !           175: static const char * const yytname[] = {   "$","error","$illegal.","INT","CHAR",
        !           176: "NAME","ERROR","'?'","':'","','","OR","AND","'|'","'^'","'&'","EQUAL","NOTEQUAL",
        !           177: "'<'","'>'","LEQ","GEQ","LSH","RSH","'+'","'-'","'*'","'/'","'%'","UNARY","'!'",
        !           178: "'~'","'#'","'('","')'","start","exp1","exp","@1","keywords",""
        !           179: };
        !           180: #endif
        !           181: 
        !           182: static const short yyr1[] = {     0,
        !           183:     34,    35,    35,    36,    36,    36,    36,    36,    37,    36,
        !           184:     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
        !           185:     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
        !           186:     36,    36,    36,    38,    38,    38
        !           187: };
        !           188: 
        !           189: static const short yyr2[] = {     0,
        !           190:      1,     1,     3,     2,     2,     2,     2,     2,     0,     6,
        !           191:      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
        !           192:      3,     3,     3,     3,     3,     3,     3,     3,     3,     5,
        !           193:      1,     1,     1,     0,     4,     2
        !           194: };
        !           195: 
        !           196: static const short yydefact[] = {     0,
        !           197:     31,    32,    33,     0,     0,     0,     0,     0,     0,     1,
        !           198:      2,     6,     4,     5,     7,     8,     0,     0,     0,     0,
        !           199:      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        !           200:      0,     0,     0,     0,     0,     0,     0,     0,    11,     3,
        !           201:      0,    29,    28,    27,    26,    25,    19,    20,    23,    24,
        !           202:     21,    22,    17,    18,    15,    16,    12,    13,    14,    34,
        !           203:      0,    34,    34,     0,    30,    36,     0,    10,    34,    35,
        !           204:      0,     0,     0
        !           205: };
        !           206: 
        !           207: static const short yydefgoto[] = {    71,
        !           208:     10,    11,    38,    64
        !           209: };
        !           210: 
        !           211: static const short yypact[] = {    31,
        !           212: -32768,-32768,-32768,    31,    31,    31,    31,     4,    31,     3,
        !           213:     80,-32768,-32768,-32768,-32768,     6,    32,    31,    31,    31,
        !           214:     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
        !           215:     31,    31,    31,    31,    31,    31,    31,     7,-32768,    80,
        !           216:     59,    97,   113,   128,   142,   155,    25,    25,   162,   162,
        !           217:    162,   162,   167,   167,   -19,   -19,-32768,-32768,-32768,     5,
        !           218:     31,     5,     5,   -20,    80,-32768,    20,-32768,     5,-32768,
        !           219:     40,    56,-32768
        !           220: };
        !           221: 
        !           222: static const short yypgoto[] = {-32768,
        !           223:     49,    -4,-32768,   -58
        !           224: };
        !           225: 
        !           226: 
        !           227: #define        YYLAST          194
        !           228: 
        !           229: 
        !           230: static const short yytable[] = {    12,
        !           231:     13,    14,    15,    66,    67,    35,    36,    37,    16,    62,
        !           232:     70,    18,    68,    40,    41,    42,    43,    44,    45,    46,
        !           233:     47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
        !           234:     57,    58,    59,     1,     2,     3,    63,    -9,    60,    72,
        !           235:     18,    27,    28,    29,    30,    31,    32,    33,    34,    35,
        !           236:     36,    37,    69,     4,     5,    73,    65,    17,     0,     6,
        !           237:      7,     8,     9,     0,    39,    19,    61,     0,    20,    21,
        !           238:     22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
        !           239:     32,    33,    34,    35,    36,    37,    19,     0,     0,    20,
        !           240:     21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
        !           241:     31,    32,    33,    34,    35,    36,    37,    21,    22,    23,
        !           242:     24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
        !           243:     34,    35,    36,    37,    22,    23,    24,    25,    26,    27,
        !           244:     28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
        !           245:     23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
        !           246:     33,    34,    35,    36,    37,    24,    25,    26,    27,    28,
        !           247:     29,    30,    31,    32,    33,    34,    35,    36,    37,    25,
        !           248:     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
        !           249:     36,    37,    31,    32,    33,    34,    35,    36,    37,    33,
        !           250:     34,    35,    36,    37
        !           251: };
        !           252: 
        !           253: static const short yycheck[] = {     4,
        !           254:      5,     6,     7,    62,    63,    25,    26,    27,     5,     5,
        !           255:     69,     9,    33,    18,    19,    20,    21,    22,    23,    24,
        !           256:     25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
        !           257:     35,    36,    37,     3,     4,     5,    32,    32,    32,     0,
        !           258:      9,    17,    18,    19,    20,    21,    22,    23,    24,    25,
        !           259:     26,    27,    33,    23,    24,     0,    61,     9,    -1,    29,
        !           260:     30,    31,    32,    -1,    33,     7,     8,    -1,    10,    11,
        !           261:     12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
        !           262:     22,    23,    24,    25,    26,    27,     7,    -1,    -1,    10,
        !           263:     11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
        !           264:     21,    22,    23,    24,    25,    26,    27,    11,    12,    13,
        !           265:     14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
        !           266:     24,    25,    26,    27,    12,    13,    14,    15,    16,    17,
        !           267:     18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
        !           268:     13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
        !           269:     23,    24,    25,    26,    27,    14,    15,    16,    17,    18,
        !           270:     19,    20,    21,    22,    23,    24,    25,    26,    27,    15,
        !           271:     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
        !           272:     26,    27,    21,    22,    23,    24,    25,    26,    27,    23,
        !           273:     24,    25,    26,    27
        !           274: };
        !           275: /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
        !           276: #line 3 "bison.simple"
        !           277: 
        !           278: /* Skeleton output parser for bison,
        !           279:    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
        !           280: 
        !           281:    This program is free software; you can redistribute it and/or modify
        !           282:    it under the terms of the GNU General Public License as published by
        !           283:    the Free Software Foundation; either version 1, or (at your option)
        !           284:    any later version.
        !           285: 
        !           286:    This program is distributed in the hope that it will be useful,
        !           287:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !           288:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !           289:    GNU General Public License for more details.
        !           290: 
        !           291:    You should have received a copy of the GNU General Public License
        !           292:    along with this program; if not, write to the Free Software
        !           293:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !           294: 
        !           295: 
        !           296: #ifndef alloca
        !           297: #ifdef __GNUC__
        !           298: #define alloca __builtin_alloca
        !           299: #else /* not GNU C.  */
        !           300: #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
        !           301: #include <alloca.h>
        !           302: #else /* not sparc */
        !           303: #if defined (MSDOS) && !defined (__TURBOC__)
        !           304: #include <malloc.h>
        !           305: #else /* not MSDOS, or __TURBOC__ */
        !           306: #if defined(_AIX)
        !           307: #include <malloc.h>
        !           308:  #pragma alloca
        !           309: #endif /* not _AIX */
        !           310: #endif /* not MSDOS, or __TURBOC__ */
        !           311: #endif /* not sparc.  */
        !           312: #endif /* not GNU C.  */
        !           313: #endif /* alloca not defined.  */
        !           314: 
        !           315: /* This is the parser code that is written into each bison parser
        !           316:   when the %semantic_parser declaration is not specified in the grammar.
        !           317:   It was written by Richard Stallman by simplifying the hairy parser
        !           318:   used when %semantic_parser is specified.  */
        !           319: 
        !           320: /* Note: there must be only one dollar sign in this file.
        !           321:    It is replaced by the list of actions, each action
        !           322:    as one case of the switch.  */
        !           323: 
        !           324: #define yyerrok                (yyerrstatus = 0)
        !           325: #define yyclearin      (yychar = YYEMPTY)
        !           326: #define YYEMPTY                -2
        !           327: #define YYEOF          0
        !           328: #define YYACCEPT       return(0)
        !           329: #define YYABORT        return(1)
        !           330: #define YYERROR                goto yyerrlab1
        !           331: /* Like YYERROR except do call yyerror.
        !           332:    This remains here temporarily to ease the
        !           333:    transition to the new meaning of YYERROR, for GCC.
        !           334:    Once GCC version 2 has supplanted version 1, this can go.  */
        !           335: #define YYFAIL         goto yyerrlab
        !           336: #define YYRECOVERING()  (!!yyerrstatus)
        !           337: #define YYBACKUP(token, value) \
        !           338: do                                                             \
        !           339:   if (yychar == YYEMPTY && yylen == 1)                         \
        !           340:     { yychar = (token), yylval = (value);                      \
        !           341:       yychar1 = YYTRANSLATE (yychar);                          \
        !           342:       YYPOPSTACK;                                              \
        !           343:       goto yybackup;                                           \
        !           344:     }                                                          \
        !           345:   else                                                         \
        !           346:     { yyerror ("syntax error: cannot back up"); YYERROR; }     \
        !           347: while (0)
        !           348: 
        !           349: #define YYTERROR       1
        !           350: #define YYERRCODE      256
        !           351: 
        !           352: #ifndef YYPURE
        !           353: #define YYLEX          yylex()
        !           354: #endif
        !           355: 
        !           356: #ifdef YYPURE
        !           357: #ifdef YYLSP_NEEDED
        !           358: #define YYLEX          yylex(&yylval, &yylloc)
        !           359: #else
        !           360: #define YYLEX          yylex(&yylval)
        !           361: #endif
        !           362: #endif
        !           363: 
        !           364: /* If nonreentrant, generate the variables here */
        !           365: 
        !           366: #ifndef YYPURE
        !           367: 
        !           368: int    yychar;                 /*  the lookahead symbol                */
        !           369: YYSTYPE        yylval;                 /*  the semantic value of the           */
        !           370:                                /*  lookahead symbol                    */
        !           371: 
        !           372: #ifdef YYLSP_NEEDED
        !           373: YYLTYPE yylloc;                        /*  location data for the lookahead     */
        !           374:                                /*  symbol                              */
        !           375: #endif
        !           376: 
        !           377: int yynerrs;                   /*  number of parse errors so far       */
        !           378: #endif  /* not YYPURE */
        !           379: 
        !           380: #if YYDEBUG != 0
        !           381: int yydebug;                   /*  nonzero means print parse trace     */
        !           382: /* Since this is uninitialized, it does not stop multiple parsers
        !           383:    from coexisting.  */
        !           384: #endif
        !           385: 
        !           386: /*  YYINITDEPTH indicates the initial size of the parser's stacks      */
        !           387: 
        !           388: #ifndef        YYINITDEPTH
        !           389: #define YYINITDEPTH 200
        !           390: #endif
        !           391: 
        !           392: /*  YYMAXDEPTH is the maximum size the stacks can grow to
        !           393:     (effective only if the built-in stack extension method is used).  */
        !           394: 
        !           395: #if YYMAXDEPTH == 0
        !           396: #undef YYMAXDEPTH
        !           397: #endif
        !           398: 
        !           399: #ifndef YYMAXDEPTH
        !           400: #define YYMAXDEPTH 10000
        !           401: #endif
        !           402: 
        !           403: #if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
        !           404: #define __yy_bcopy(FROM,TO,COUNT)      __builtin_memcpy(TO,FROM,COUNT)
        !           405: #else                          /* not GNU C or C++ */
        !           406: #ifndef __cplusplus
        !           407: 
        !           408: /* This is the most reliable way to avoid incompatibilities
        !           409:    in available built-in functions on various systems.  */
        !           410: static void
        !           411: __yy_bcopy (from, to, count)
        !           412:      char *from;
        !           413:      char *to;
        !           414:      int count;
        !           415: {
        !           416:   register char *f = from;
        !           417:   register char *t = to;
        !           418:   register int i = count;
        !           419: 
        !           420:   while (i-- > 0)
        !           421:     *t++ = *f++;
        !           422: }
        !           423: 
        !           424: #else /* __cplusplus */
        !           425: 
        !           426: /* This is the most reliable way to avoid incompatibilities
        !           427:    in available built-in functions on various systems.  */
        !           428: static void
        !           429: __yy_bcopy (char *from, char *to, int count)
        !           430: {
        !           431:   register char *f = from;
        !           432:   register char *t = to;
        !           433:   register int i = count;
        !           434: 
        !           435:   while (i-- > 0)
        !           436:     *t++ = *f++;
        !           437: }
        !           438: 
        !           439: #endif
        !           440: #endif
        !           441: 
        !           442: #line 169 "bison.simple"
        !           443: int
        !           444: yyparse()
        !           445: {
        !           446:   register int yystate;
        !           447:   register int yyn;
        !           448:   register short *yyssp;
        !           449:   register YYSTYPE *yyvsp;
        !           450:   int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
        !           451:   int yychar1;         /*  lookahead token as an internal (translated) token number */
        !           452: 
        !           453:   short        yyssa[YYINITDEPTH];     /*  the state stack                     */
        !           454:   YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
        !           455: 
        !           456:   short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
        !           457:   YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
        !           458: 
        !           459: #ifdef YYLSP_NEEDED
        !           460:   YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
        !           461:   YYLTYPE *yyls = yylsa;
        !           462:   YYLTYPE *yylsp;
        !           463: 
        !           464: #define YYPOPSTACK   (yyvsp--, yysp--, yylsp--)
        !           465: #else
        !           466: #define YYPOPSTACK   (yyvsp--, yysp--)
        !           467: #endif
        !           468: 
        !           469:   int yystacksize = YYINITDEPTH;
        !           470: 
        !           471: #ifdef YYPURE
        !           472:   int yychar;
        !           473:   YYSTYPE yylval;
        !           474:   int yynerrs;
        !           475: #ifdef YYLSP_NEEDED
        !           476:   YYLTYPE yylloc;
        !           477: #endif
        !           478: #endif
        !           479: 
        !           480:   YYSTYPE yyval;               /*  the variable used to return         */
        !           481:                                /*  semantic values from the action     */
        !           482:                                /*  routines                            */
        !           483: 
        !           484:   int yylen;
        !           485: 
        !           486: #if YYDEBUG != 0
        !           487:   if (yydebug)
        !           488:     fprintf(stderr, "Starting parse\n");
        !           489: #endif
        !           490: 
        !           491:   yystate = 0;
        !           492:   yyerrstatus = 0;
        !           493:   yynerrs = 0;
        !           494:   yychar = YYEMPTY;            /* Cause a token to be read.  */
        !           495: 
        !           496:   /* Initialize stack pointers.
        !           497:      Waste one element of value and location stack
        !           498:      so that they stay on the same level as the state stack.  */
        !           499: 
        !           500:   yyssp = yyss - 1;
        !           501:   yyvsp = yyvs;
        !           502: #ifdef YYLSP_NEEDED
        !           503:   yylsp = yyls;
        !           504: #endif
        !           505: 
        !           506: /* Push a new state, which is found in  yystate  .  */
        !           507: /* In all cases, when you get here, the value and location stacks
        !           508:    have just been pushed. so pushing a state here evens the stacks.  */
        !           509: yynewstate:
        !           510: 
        !           511:   *++yyssp = yystate;
        !           512: 
        !           513:   if (yyssp >= yyss + yystacksize - 1)
        !           514:     {
        !           515:       /* Give user a chance to reallocate the stack */
        !           516:       /* Use copies of these so that the &'s don't force the real ones into memory. */
        !           517:       YYSTYPE *yyvs1 = yyvs;
        !           518:       short *yyss1 = yyss;
        !           519: #ifdef YYLSP_NEEDED
        !           520:       YYLTYPE *yyls1 = yyls;
        !           521: #endif
        !           522: 
        !           523:       /* Get the current used size of the three stacks, in elements.  */
        !           524:       int size = yyssp - yyss + 1;
        !           525: 
        !           526: #ifdef yyoverflow
        !           527:       /* Each stack pointer address is followed by the size of
        !           528:         the data in use in that stack, in bytes.  */
        !           529:       yyoverflow("parser stack overflow",
        !           530:                 &yyss1, size * sizeof (*yyssp),
        !           531:                 &yyvs1, size * sizeof (*yyvsp),
        !           532: #ifdef YYLSP_NEEDED
        !           533:                 &yyls1, size * sizeof (*yylsp),
        !           534: #endif
        !           535:                 &yystacksize);
        !           536: 
        !           537:       yyss = yyss1; yyvs = yyvs1;
        !           538: #ifdef YYLSP_NEEDED
        !           539:       yyls = yyls1;
        !           540: #endif
        !           541: #else /* no yyoverflow */
        !           542:       /* Extend the stack our own way.  */
        !           543:       if (yystacksize >= YYMAXDEPTH)
        !           544:        {
        !           545:          yyerror("parser stack overflow");
        !           546:          return 2;
        !           547:        }
        !           548:       yystacksize *= 2;
        !           549:       if (yystacksize > YYMAXDEPTH)
        !           550:        yystacksize = YYMAXDEPTH;
        !           551:       yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
        !           552:       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
        !           553:       yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
        !           554:       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
        !           555: #ifdef YYLSP_NEEDED
        !           556:       yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
        !           557:       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
        !           558: #endif
        !           559: #endif /* no yyoverflow */
        !           560: 
        !           561:       yyssp = yyss + size - 1;
        !           562:       yyvsp = yyvs + size - 1;
        !           563: #ifdef YYLSP_NEEDED
        !           564:       yylsp = yyls + size - 1;
        !           565: #endif
        !           566: 
        !           567: #if YYDEBUG != 0
        !           568:       if (yydebug)
        !           569:        fprintf(stderr, "Stack size increased to %d\n", yystacksize);
        !           570: #endif
        !           571: 
        !           572:       if (yyssp >= yyss + yystacksize - 1)
        !           573:        YYABORT;
        !           574:     }
        !           575: 
        !           576: #if YYDEBUG != 0
        !           577:   if (yydebug)
        !           578:     fprintf(stderr, "Entering state %d\n", yystate);
        !           579: #endif
        !           580: 
        !           581:  yybackup:
        !           582: 
        !           583: /* Do appropriate processing given the current state.  */
        !           584: /* Read a lookahead token if we need one and don't already have one.  */
        !           585: /* yyresume: */
        !           586: 
        !           587:   /* First try to decide what to do without reference to lookahead token.  */
        !           588: 
        !           589:   yyn = yypact[yystate];
        !           590:   if (yyn == YYFLAG)
        !           591:     goto yydefault;
        !           592: 
        !           593:   /* Not known => get a lookahead token if don't already have one.  */
        !           594: 
        !           595:   /* yychar is either YYEMPTY or YYEOF
        !           596:      or a valid token in external form.  */
        !           597: 
        !           598:   if (yychar == YYEMPTY)
        !           599:     {
        !           600: #if YYDEBUG != 0
        !           601:       if (yydebug)
        !           602:        fprintf(stderr, "Reading a token: ");
        !           603: #endif
        !           604:       yychar = YYLEX;
        !           605:     }
        !           606: 
        !           607:   /* Convert token to internal form (in yychar1) for indexing tables with */
        !           608: 
        !           609:   if (yychar <= 0)             /* This means end of input. */
        !           610:     {
        !           611:       yychar1 = 0;
        !           612:       yychar = YYEOF;          /* Don't call YYLEX any more */
        !           613: 
        !           614: #if YYDEBUG != 0
        !           615:       if (yydebug)
        !           616:        fprintf(stderr, "Now at end of input.\n");
        !           617: #endif
        !           618:     }
        !           619:   else
        !           620:     {
        !           621:       yychar1 = YYTRANSLATE(yychar);
        !           622: 
        !           623: #if YYDEBUG != 0
        !           624:       if (yydebug)
        !           625:        {
        !           626:          fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
        !           627:          /* Give the individual parser a way to print the precise meaning
        !           628:             of a token, for further debugging info.  */
        !           629: #ifdef YYPRINT
        !           630:          YYPRINT (stderr, yychar, yylval);
        !           631: #endif
        !           632:          fprintf (stderr, ")\n");
        !           633:        }
        !           634: #endif
        !           635:     }
        !           636: 
        !           637:   yyn += yychar1;
        !           638:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
        !           639:     goto yydefault;
        !           640: 
        !           641:   yyn = yytable[yyn];
        !           642: 
        !           643:   /* yyn is what to do for this token type in this state.
        !           644:      Negative => reduce, -yyn is rule number.
        !           645:      Positive => shift, yyn is new state.
        !           646:        New state is final state => don't bother to shift,
        !           647:        just return success.
        !           648:      0, or most negative number => error.  */
        !           649: 
        !           650:   if (yyn < 0)
        !           651:     {
        !           652:       if (yyn == YYFLAG)
        !           653:        goto yyerrlab;
        !           654:       yyn = -yyn;
        !           655:       goto yyreduce;
        !           656:     }
        !           657:   else if (yyn == 0)
        !           658:     goto yyerrlab;
        !           659: 
        !           660:   if (yyn == YYFINAL)
        !           661:     YYACCEPT;
        !           662: 
        !           663:   /* Shift the lookahead token.  */
        !           664: 
        !           665: #if YYDEBUG != 0
        !           666:   if (yydebug)
        !           667:     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
        !           668: #endif
        !           669: 
        !           670:   /* Discard the token being shifted unless it is eof.  */
        !           671:   if (yychar != YYEOF)
        !           672:     yychar = YYEMPTY;
        !           673: 
        !           674:   *++yyvsp = yylval;
        !           675: #ifdef YYLSP_NEEDED
        !           676:   *++yylsp = yylloc;
        !           677: #endif
        !           678: 
        !           679:   /* count tokens shifted since error; after three, turn off error status.  */
        !           680:   if (yyerrstatus) yyerrstatus--;
        !           681: 
        !           682:   yystate = yyn;
        !           683:   goto yynewstate;
        !           684: 
        !           685: /* Do the default action for the current state.  */
        !           686: yydefault:
        !           687: 
        !           688:   yyn = yydefact[yystate];
        !           689:   if (yyn == 0)
        !           690:     goto yyerrlab;
        !           691: 
        !           692: /* Do a reduction.  yyn is the number of a rule to reduce with.  */
        !           693: yyreduce:
        !           694:   yylen = yyr2[yyn];
        !           695:   yyval = yyvsp[1-yylen]; /* implement default value of the action */
        !           696: 
        !           697: #if YYDEBUG != 0
        !           698:   if (yydebug)
        !           699:     {
        !           700:       int i;
        !           701: 
        !           702:       fprintf (stderr, "Reducing via rule %d (line %d), ",
        !           703:               yyn, yyrline[yyn]);
        !           704: 
        !           705:       /* Print the symboles being reduced, and their result.  */
        !           706:       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
        !           707:        fprintf (stderr, "%s ", yytname[yyrhs[i]]);
        !           708:       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
        !           709:     }
        !           710: #endif
        !           711: 
        !           712: 
        !           713:   switch (yyn) {
        !           714: 
        !           715: case 1:
        !           716: #line 114 "cexp.y"
        !           717: { expression_value = yyvsp[0].integer.value; ;
        !           718:     break;}
        !           719: case 3:
        !           720: #line 120 "cexp.y"
        !           721: { if (pedantic)
        !           722:                            pedwarn ("comma operator in operand of `#if'");
        !           723:                          yyval.integer = yyvsp[0].integer; ;
        !           724:     break;}
        !           725: case 4:
        !           726: #line 127 "cexp.y"
        !           727: { yyval.integer.value = - yyvsp[0].integer.value;
        !           728:                          yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ;
        !           729:     break;}
        !           730: case 5:
        !           731: #line 130 "cexp.y"
        !           732: { yyval.integer.value = ! yyvsp[0].integer.value;
        !           733:                          yyval.integer.unsignedp = 0; ;
        !           734:     break;}
        !           735: case 6:
        !           736: #line 133 "cexp.y"
        !           737: { yyval.integer = yyvsp[0].integer; ;
        !           738:     break;}
        !           739: case 7:
        !           740: #line 135 "cexp.y"
        !           741: { yyval.integer.value = ~ yyvsp[0].integer.value;
        !           742:                          yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ;
        !           743:     break;}
        !           744: case 8:
        !           745: #line 138 "cexp.y"
        !           746: { yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length,
        !           747:                                                      0, 0);
        !           748:                          yyval.integer.unsignedp = 0; ;
        !           749:     break;}
        !           750: case 9:
        !           751: #line 142 "cexp.y"
        !           752: { keyword_parsing = 1; ;
        !           753:     break;}
        !           754: case 10:
        !           755: #line 144 "cexp.y"
        !           756: { yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length,
        !           757:                                                      1, yyvsp[-1].keywords);
        !           758:                          keyword_parsing = 0;
        !           759:                          yyval.integer.unsignedp = 0; ;
        !           760:     break;}
        !           761: case 11:
        !           762: #line 149 "cexp.y"
        !           763: { yyval.integer = yyvsp[-1].integer; ;
        !           764:     break;}
        !           765: case 12:
        !           766: #line 154 "cexp.y"
        !           767: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           768:                          if (yyval.integer.unsignedp)
        !           769:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value * yyvsp[0].integer.value;
        !           770:                          else
        !           771:                            yyval.integer.value = yyvsp[-2].integer.value * yyvsp[0].integer.value; ;
        !           772:     break;}
        !           773: case 13:
        !           774: #line 160 "cexp.y"
        !           775: { if (yyvsp[0].integer.value == 0)
        !           776:                            {
        !           777:                              error ("division by zero in #if");
        !           778:                              yyvsp[0].integer.value = 1;
        !           779:                            }
        !           780:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           781:                          if (yyval.integer.unsignedp)
        !           782:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value / yyvsp[0].integer.value;
        !           783:                          else
        !           784:                            yyval.integer.value = yyvsp[-2].integer.value / yyvsp[0].integer.value; ;
        !           785:     break;}
        !           786: case 14:
        !           787: #line 171 "cexp.y"
        !           788: { if (yyvsp[0].integer.value == 0)
        !           789:                            {
        !           790:                              error ("division by zero in #if");
        !           791:                              yyvsp[0].integer.value = 1;
        !           792:                            }
        !           793:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           794:                          if (yyval.integer.unsignedp)
        !           795:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value % yyvsp[0].integer.value;
        !           796:                          else
        !           797:                            yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; ;
        !           798:     break;}
        !           799: case 15:
        !           800: #line 182 "cexp.y"
        !           801: { yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
        !           802:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           803:     break;}
        !           804: case 16:
        !           805: #line 185 "cexp.y"
        !           806: { yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
        !           807:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           808:     break;}
        !           809: case 17:
        !           810: #line 188 "cexp.y"
        !           811: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
        !           812:                          if (yyval.integer.unsignedp)
        !           813:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value << yyvsp[0].integer.value;
        !           814:                          else
        !           815:                            yyval.integer.value = yyvsp[-2].integer.value << yyvsp[0].integer.value; ;
        !           816:     break;}
        !           817: case 18:
        !           818: #line 194 "cexp.y"
        !           819: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
        !           820:                          if (yyval.integer.unsignedp)
        !           821:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value >> yyvsp[0].integer.value;
        !           822:                          else
        !           823:                            yyval.integer.value = yyvsp[-2].integer.value >> yyvsp[0].integer.value; ;
        !           824:     break;}
        !           825: case 19:
        !           826: #line 200 "cexp.y"
        !           827: { yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
        !           828:                          yyval.integer.unsignedp = 0; ;
        !           829:     break;}
        !           830: case 20:
        !           831: #line 203 "cexp.y"
        !           832: { yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
        !           833:                          yyval.integer.unsignedp = 0; ;
        !           834:     break;}
        !           835: case 21:
        !           836: #line 206 "cexp.y"
        !           837: { yyval.integer.unsignedp = 0;
        !           838:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           839:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value <= yyvsp[0].integer.value;
        !           840:                          else
        !           841:                            yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; ;
        !           842:     break;}
        !           843: case 22:
        !           844: #line 212 "cexp.y"
        !           845: { yyval.integer.unsignedp = 0;
        !           846:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           847:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value >= yyvsp[0].integer.value;
        !           848:                          else
        !           849:                            yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; ;
        !           850:     break;}
        !           851: case 23:
        !           852: #line 218 "cexp.y"
        !           853: { yyval.integer.unsignedp = 0;
        !           854:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           855:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value < yyvsp[0].integer.value;
        !           856:                          else
        !           857:                            yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; ;
        !           858:     break;}
        !           859: case 24:
        !           860: #line 224 "cexp.y"
        !           861: { yyval.integer.unsignedp = 0;
        !           862:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           863:                            yyval.integer.value = (unsigned) yyvsp[-2].integer.value > yyvsp[0].integer.value;
        !           864:                          else
        !           865:                            yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; ;
        !           866:     break;}
        !           867: case 25:
        !           868: #line 230 "cexp.y"
        !           869: { yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
        !           870:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           871:     break;}
        !           872: case 26:
        !           873: #line 233 "cexp.y"
        !           874: { yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
        !           875:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           876:     break;}
        !           877: case 27:
        !           878: #line 236 "cexp.y"
        !           879: { yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
        !           880:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           881:     break;}
        !           882: case 28:
        !           883: #line 239 "cexp.y"
        !           884: { yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value);
        !           885:                          yyval.integer.unsignedp = 0; ;
        !           886:     break;}
        !           887: case 29:
        !           888: #line 242 "cexp.y"
        !           889: { yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value);
        !           890:                          yyval.integer.unsignedp = 0; ;
        !           891:     break;}
        !           892: case 30:
        !           893: #line 245 "cexp.y"
        !           894: { yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : yyvsp[0].integer.value;
        !           895:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           896:     break;}
        !           897: case 31:
        !           898: #line 248 "cexp.y"
        !           899: { yyval.integer = yylval.integer; ;
        !           900:     break;}
        !           901: case 32:
        !           902: #line 250 "cexp.y"
        !           903: { yyval.integer = yylval.integer; ;
        !           904:     break;}
        !           905: case 33:
        !           906: #line 252 "cexp.y"
        !           907: { yyval.integer.value = 0;
        !           908:                          yyval.integer.unsignedp = 0; ;
        !           909:     break;}
        !           910: case 34:
        !           911: #line 257 "cexp.y"
        !           912: { yyval.keywords = 0; ;
        !           913:     break;}
        !           914: case 35:
        !           915: #line 259 "cexp.y"
        !           916: { struct arglist *temp;
        !           917:                          yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           918:                          yyval.keywords->next = yyvsp[-2].keywords;
        !           919:                          yyval.keywords->name = (U_CHAR *) "(";
        !           920:                          yyval.keywords->length = 1;
        !           921:                          temp = yyval.keywords;
        !           922:                          while (temp != 0 && temp->next != 0)
        !           923:                            temp = temp->next;
        !           924:                          temp->next = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           925:                          temp->next->next = yyvsp[0].keywords;
        !           926:                          temp->next->name = (U_CHAR *) ")";
        !           927:                          temp->next->length = 1; ;
        !           928:     break;}
        !           929: case 36:
        !           930: #line 272 "cexp.y"
        !           931: { yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           932:                          yyval.keywords->name = yyvsp[-1].name.address;
        !           933:                          yyval.keywords->length = yyvsp[-1].name.length;
        !           934:                          yyval.keywords->next = yyvsp[0].keywords; ;
        !           935:     break;}
        !           936: }
        !           937:    /* the action file gets copied in in place of this dollarsign */
        !           938: #line 440 "bison.simple"
        !           939: 
        !           940:   yyvsp -= yylen;
        !           941:   yyssp -= yylen;
        !           942: #ifdef YYLSP_NEEDED
        !           943:   yylsp -= yylen;
        !           944: #endif
        !           945: 
        !           946: #if YYDEBUG != 0
        !           947:   if (yydebug)
        !           948:     {
        !           949:       short *ssp1 = yyss - 1;
        !           950:       fprintf (stderr, "state stack now");
        !           951:       while (ssp1 != yyssp)
        !           952:        fprintf (stderr, " %d", *++ssp1);
        !           953:       fprintf (stderr, "\n");
        !           954:     }
        !           955: #endif
        !           956: 
        !           957:   *++yyvsp = yyval;
        !           958: 
        !           959: #ifdef YYLSP_NEEDED
        !           960:   yylsp++;
        !           961:   if (yylen == 0)
        !           962:     {
        !           963:       yylsp->first_line = yylloc.first_line;
        !           964:       yylsp->first_column = yylloc.first_column;
        !           965:       yylsp->last_line = (yylsp-1)->last_line;
        !           966:       yylsp->last_column = (yylsp-1)->last_column;
        !           967:       yylsp->text = 0;
        !           968:     }
        !           969:   else
        !           970:     {
        !           971:       yylsp->last_line = (yylsp+yylen-1)->last_line;
        !           972:       yylsp->last_column = (yylsp+yylen-1)->last_column;
        !           973:     }
        !           974: #endif
        !           975: 
        !           976:   /* Now "shift" the result of the reduction.
        !           977:      Determine what state that goes to,
        !           978:      based on the state we popped back to
        !           979:      and the rule number reduced by.  */
        !           980: 
        !           981:   yyn = yyr1[yyn];
        !           982: 
        !           983:   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
        !           984:   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
        !           985:     yystate = yytable[yystate];
        !           986:   else
        !           987:     yystate = yydefgoto[yyn - YYNTBASE];
        !           988: 
        !           989:   goto yynewstate;
        !           990: 
        !           991: yyerrlab:   /* here on detecting error */
        !           992: 
        !           993:   if (! yyerrstatus)
        !           994:     /* If not already recovering from an error, report this error.  */
        !           995:     {
        !           996:       ++yynerrs;
        !           997: 
        !           998: #ifdef YYERROR_VERBOSE
        !           999:       yyn = yypact[yystate];
        !          1000: 
        !          1001:       if (yyn > YYFLAG && yyn < YYLAST)
        !          1002:        {
        !          1003:          int size = 0;
        !          1004:          char *msg;
        !          1005:          int x, count;
        !          1006: 
        !          1007:          count = 0;
        !          1008:          for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
        !          1009:            if (yycheck[x + yyn] == x)
        !          1010:              size += strlen(yytname[x]) + 15, count++;
        !          1011:          msg = (char *) malloc(size + 15);
        !          1012:          if (msg != 0)
        !          1013:            {
        !          1014:              strcpy(msg, "parse error");
        !          1015: 
        !          1016:              if (count < 5)
        !          1017:                {
        !          1018:                  count = 0;
        !          1019:                  for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
        !          1020:                    if (yycheck[x + yyn] == x)
        !          1021:                      {
        !          1022:                        strcat(msg, count == 0 ? ", expecting `" : " or `");
        !          1023:                        strcat(msg, yytname[x]);
        !          1024:                        strcat(msg, "'");
        !          1025:                        count++;
        !          1026:                      }
        !          1027:                }
        !          1028:              yyerror(msg);
        !          1029:              free(msg);
        !          1030:            }
        !          1031:          else
        !          1032:            yyerror ("parse error; also virtual memory exceeded");
        !          1033:        }
        !          1034:       else
        !          1035: #endif /* YYERROR_VERBOSE */
        !          1036:        yyerror("parse error");
        !          1037:     }
        !          1038: 
        !          1039: yyerrlab1:   /* here on error raised explicitly by an action */
        !          1040: 
        !          1041:   if (yyerrstatus == 3)
        !          1042:     {
        !          1043:       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
        !          1044: 
        !          1045:       /* return failure if at end of input */
        !          1046:       if (yychar == YYEOF)
        !          1047:        YYABORT;
        !          1048: 
        !          1049: #if YYDEBUG != 0
        !          1050:       if (yydebug)
        !          1051:        fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
        !          1052: #endif
        !          1053: 
        !          1054:       yychar = YYEMPTY;
        !          1055:     }
        !          1056: 
        !          1057:   /* Else will try to reuse lookahead token
        !          1058:      after shifting the error token.  */
        !          1059: 
        !          1060:   yyerrstatus = 3;             /* Each real token shifted decrements this */
        !          1061: 
        !          1062:   goto yyerrhandle;
        !          1063: 
        !          1064: yyerrdefault:  /* current state does not do anything special for the error token. */
        !          1065: 
        !          1066: #if 0
        !          1067:   /* This is wrong; only states that explicitly want error tokens
        !          1068:      should shift them.  */
        !          1069:   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
        !          1070:   if (yyn) goto yydefault;
        !          1071: #endif
        !          1072: 
        !          1073: yyerrpop:   /* pop the current state because it cannot handle the error token */
        !          1074: 
        !          1075:   if (yyssp == yyss) YYABORT;
        !          1076:   yyvsp--;
        !          1077:   yystate = *--yyssp;
        !          1078: #ifdef YYLSP_NEEDED
        !          1079:   yylsp--;
        !          1080: #endif
        !          1081: 
        !          1082: #if YYDEBUG != 0
        !          1083:   if (yydebug)
        !          1084:     {
        !          1085:       short *ssp1 = yyss - 1;
        !          1086:       fprintf (stderr, "Error: state stack now");
        !          1087:       while (ssp1 != yyssp)
        !          1088:        fprintf (stderr, " %d", *++ssp1);
        !          1089:       fprintf (stderr, "\n");
        !          1090:     }
        !          1091: #endif
        !          1092: 
        !          1093: yyerrhandle:
        !          1094: 
        !          1095:   yyn = yypact[yystate];
        !          1096:   if (yyn == YYFLAG)
        !          1097:     goto yyerrdefault;
        !          1098: 
        !          1099:   yyn += YYTERROR;
        !          1100:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
        !          1101:     goto yyerrdefault;
        !          1102: 
        !          1103:   yyn = yytable[yyn];
        !          1104:   if (yyn < 0)
        !          1105:     {
        !          1106:       if (yyn == YYFLAG)
        !          1107:        goto yyerrpop;
        !          1108:       yyn = -yyn;
        !          1109:       goto yyreduce;
        !          1110:     }
        !          1111:   else if (yyn == 0)
        !          1112:     goto yyerrpop;
        !          1113: 
        !          1114:   if (yyn == YYFINAL)
        !          1115:     YYACCEPT;
        !          1116: 
        !          1117: #if YYDEBUG != 0
        !          1118:   if (yydebug)
        !          1119:     fprintf(stderr, "Shifting error token, ");
        !          1120: #endif
        !          1121: 
        !          1122:   *++yyvsp = yylval;
        !          1123: #ifdef YYLSP_NEEDED
        !          1124:   *++yylsp = yylloc;
        !          1125: #endif
        !          1126: 
        !          1127:   yystate = yyn;
        !          1128:   goto yynewstate;
        !          1129: }
        !          1130: #line 277 "cexp.y"
        !          1131: 
        !          1132: 
        !          1133: /* During parsing of a C expression, the pointer to the next character
        !          1134:    is in this variable.  */
        !          1135: 
        !          1136: static char *lexptr;
        !          1137: 
        !          1138: /* Take care of parsing a number (anything that starts with a digit).
        !          1139:    Set yylval and return the token type; update lexptr.
        !          1140:    LEN is the number of characters in it.  */
        !          1141: 
        !          1142: /* maybe needs to actually deal with floating point numbers */
        !          1143: 
        !          1144: int
        !          1145: parse_number (olen)
        !          1146:      int olen;
        !          1147: {
        !          1148:   register char *p = lexptr;
        !          1149:   register long n = 0;
        !          1150:   register int c;
        !          1151:   register int base = 10;
        !          1152:   register int len = olen;
        !          1153: 
        !          1154:   for (c = 0; c < len; c++)
        !          1155:     if (p[c] == '.') {
        !          1156:       /* It's a float since it contains a point.  */
        !          1157:       yyerror ("floating point numbers not allowed in #if expressions");
        !          1158:       return ERROR;
        !          1159:     }
        !          1160: 
        !          1161:   yylval.integer.unsignedp = 0;
        !          1162: 
        !          1163:   if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
        !          1164:     p += 2;
        !          1165:     base = 16;
        !          1166:     len -= 2;
        !          1167:   }
        !          1168:   else if (*p == '0')
        !          1169:     base = 8;
        !          1170: 
        !          1171:   while (len > 0) {
        !          1172:     c = *p++;
        !          1173:     len--;
        !          1174:     if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
        !          1175: 
        !          1176:     if (c >= '0' && c <= '9') {
        !          1177:       n *= base;
        !          1178:       n += c - '0';
        !          1179:     } else if (base == 16 && c >= 'a' && c <= 'f') {
        !          1180:       n *= base;
        !          1181:       n += c - 'a' + 10;
        !          1182:     } else {
        !          1183:       /* `l' means long, and `u' means unsigned.  */
        !          1184:       while (1) {
        !          1185:        if (c == 'l' || c == 'L')
        !          1186:          ;
        !          1187:        else if (c == 'u' || c == 'U')
        !          1188:          yylval.integer.unsignedp = 1;
        !          1189:        else
        !          1190:          break;
        !          1191: 
        !          1192:        if (len == 0)
        !          1193:          break;
        !          1194:        c = *p++;
        !          1195:        len--;
        !          1196:       }
        !          1197:       /* Don't look for any more digits after the suffixes.  */
        !          1198:       break;
        !          1199:     }
        !          1200:   }
        !          1201: 
        !          1202:   if (len != 0) {
        !          1203:     yyerror ("Invalid number in #if expression");
        !          1204:     return ERROR;
        !          1205:   }
        !          1206: 
        !          1207:   /* If too big to be signed, consider it unsigned.  */
        !          1208:   if (n < 0)
        !          1209:     yylval.integer.unsignedp = 1;
        !          1210: 
        !          1211:   lexptr = p;
        !          1212:   yylval.integer.value = n;
        !          1213:   return INT;
        !          1214: }
        !          1215: 
        !          1216: struct token {
        !          1217:   char *operator;
        !          1218:   int token;
        !          1219: };
        !          1220: 
        !          1221: #ifndef NULL
        !          1222: #define NULL 0
        !          1223: #endif
        !          1224: 
        !          1225: static struct token tokentab2[] = {
        !          1226:   {"&&", AND},
        !          1227:   {"||", OR},
        !          1228:   {"<<", LSH},
        !          1229:   {">>", RSH},
        !          1230:   {"==", EQUAL},
        !          1231:   {"!=", NOTEQUAL},
        !          1232:   {"<=", LEQ},
        !          1233:   {">=", GEQ},
        !          1234:   {"++", ERROR},
        !          1235:   {"--", ERROR},
        !          1236:   {NULL, ERROR}
        !          1237: };
        !          1238: 
        !          1239: /* Read one token, getting characters through lexptr.  */
        !          1240: 
        !          1241: int
        !          1242: yylex ()
        !          1243: {
        !          1244:   register int c;
        !          1245:   register int namelen;
        !          1246:   register char *tokstart;
        !          1247:   register struct token *toktab;
        !          1248:   int wide_flag;
        !          1249: 
        !          1250:  retry:
        !          1251: 
        !          1252:   tokstart = lexptr;
        !          1253:   c = *tokstart;
        !          1254:   /* See if it is a special token of length 2.  */
        !          1255:   if (! keyword_parsing)
        !          1256:     for (toktab = tokentab2; toktab->operator != NULL; toktab++)
        !          1257:       if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
        !          1258:        lexptr += 2;
        !          1259:        if (toktab->token == ERROR)
        !          1260:          {
        !          1261:            char *buf = (char *) alloca (40);
        !          1262:            sprintf (buf, "`%s' not allowed in operand of `#if'", toktab->operator);
        !          1263:            yyerror (buf);
        !          1264:          }
        !          1265:        return toktab->token;
        !          1266:       }
        !          1267: 
        !          1268:   switch (c) {
        !          1269:   case 0:
        !          1270:     return 0;
        !          1271:     
        !          1272:   case ' ':
        !          1273:   case '\t':
        !          1274:   case '\r':
        !          1275:   case '\n':
        !          1276:     lexptr++;
        !          1277:     goto retry;
        !          1278:     
        !          1279:   case 'L':
        !          1280:     /* Capital L may start a wide-string or wide-character constant.  */
        !          1281:     if (lexptr[1] == '\'')
        !          1282:       {
        !          1283:        lexptr++;
        !          1284:        wide_flag = 1;
        !          1285:        goto char_constant;
        !          1286:       }
        !          1287:     if (lexptr[1] == '"')
        !          1288:       {
        !          1289:        lexptr++;
        !          1290:        wide_flag = 1;
        !          1291:        goto string_constant;
        !          1292:       }
        !          1293:     break;
        !          1294: 
        !          1295:   case '\'':
        !          1296:     wide_flag = 0;
        !          1297:   char_constant:
        !          1298:     lexptr++;
        !          1299:     if (keyword_parsing) {
        !          1300:       char *start_ptr = lexptr - 1;
        !          1301:       while (1) {
        !          1302:        c = *lexptr++;
        !          1303:        if (c == '\\')
        !          1304:          c = parse_escape (&lexptr);
        !          1305:        else if (c == '\'')
        !          1306:          break;
        !          1307:       }
        !          1308:       yylval.name.address = (U_CHAR *) tokstart;
        !          1309:       yylval.name.length = lexptr - start_ptr;
        !          1310:       return NAME;
        !          1311:     }
        !          1312: 
        !          1313:     /* This code for reading a character constant
        !          1314:        handles multicharacter constants and wide characters.
        !          1315:        It is mostly copied from c-lex.c.  */
        !          1316:     {
        !          1317:       register int result = 0;
        !          1318:       register num_chars = 0;
        !          1319:       unsigned width = CHAR_TYPE_SIZE;
        !          1320:       int max_chars;
        !          1321:       char *token_buffer;
        !          1322: 
        !          1323:       if (wide_flag)
        !          1324:        {
        !          1325:          width = WCHAR_TYPE_SIZE;
        !          1326: #ifdef MULTIBYTE_CHARS
        !          1327:          max_chars = MB_CUR_MAX;
        !          1328: #else
        !          1329:          max_chars = 1;
        !          1330: #endif
        !          1331:        }
        !          1332:       else
        !          1333:        max_chars = LONG_TYPE_SIZE / width;
        !          1334: 
        !          1335:       token_buffer = (char *) alloca (max_chars + 1);
        !          1336: 
        !          1337:       while (1)
        !          1338:        {
        !          1339:          c = *lexptr++;
        !          1340: 
        !          1341:          if (c == '\'' || c == EOF)
        !          1342:            break;
        !          1343: 
        !          1344:          if (c == '\\')
        !          1345:            {
        !          1346:              c = parse_escape (&lexptr);
        !          1347:              if (width < HOST_BITS_PER_INT
        !          1348:                  && (unsigned) c >= (1 << width))
        !          1349:                pedwarn ("escape sequence out of range for character");
        !          1350:            }
        !          1351: 
        !          1352:          num_chars++;
        !          1353: 
        !          1354:          /* Merge character into result; ignore excess chars.  */
        !          1355:          if (num_chars < max_chars + 1)
        !          1356:            {
        !          1357:              if (width < HOST_BITS_PER_INT)
        !          1358:                result = (result << width) | (c & ((1 << width) - 1));
        !          1359:              else
        !          1360:                result = c;
        !          1361:              token_buffer[num_chars - 1] = c;
        !          1362:            }
        !          1363:        }
        !          1364: 
        !          1365:       token_buffer[num_chars] = 0;
        !          1366: 
        !          1367:       if (c != '\'')
        !          1368:        error ("malformatted character constant");
        !          1369:       else if (num_chars == 0)
        !          1370:        error ("empty character constant");
        !          1371:       else if (num_chars > max_chars)
        !          1372:        {
        !          1373:          num_chars = max_chars;
        !          1374:          error ("character constant too long");
        !          1375:        }
        !          1376:       else if (num_chars != 1 && ! traditional)
        !          1377:        warning ("multi-character character constant");
        !          1378: 
        !          1379:       /* If char type is signed, sign-extend the constant.  */
        !          1380:       if (! wide_flag)
        !          1381:        {
        !          1382:          int num_bits = num_chars * width;
        !          1383: 
        !          1384:          if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
        !          1385:              || ((result >> (num_bits - 1)) & 1) == 0)
        !          1386:            yylval.integer.value
        !          1387:              = result & ((unsigned) ~0 >> (HOST_BITS_PER_INT - num_bits));
        !          1388:          else
        !          1389:            yylval.integer.value
        !          1390:              = result | ~((unsigned) ~0 >> (HOST_BITS_PER_INT - num_bits));
        !          1391:        }
        !          1392:       else
        !          1393:        {
        !          1394: #ifdef MULTIBYTE_CHARS
        !          1395:          /* Set the initial shift state and convert the next sequence.  */
        !          1396:          result = 0;
        !          1397:          /* In all locales L'\0' is zero and mbtowc will return zero,
        !          1398:             so don't use it.  */
        !          1399:          if (num_chars > 1
        !          1400:              || (num_chars == 1 && token_buffer[0] != '\0'))
        !          1401:            {
        !          1402:              wchar_t wc;
        !          1403:              (void) mbtowc (NULL, NULL, 0);
        !          1404:              if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
        !          1405:                result = wc;
        !          1406:              else
        !          1407:                warning ("Ignoring invalid multibyte character");
        !          1408:            }
        !          1409: #endif
        !          1410:          yylval.integer.value = result;
        !          1411:        }
        !          1412:     }
        !          1413: 
        !          1414:     /* This is always a signed type.  */
        !          1415:     yylval.integer.unsignedp = 0;
        !          1416:     
        !          1417:     return CHAR;
        !          1418: 
        !          1419:     /* some of these chars are invalid in constant expressions;
        !          1420:        maybe do something about them later */
        !          1421:   case '/':
        !          1422:   case '+':
        !          1423:   case '-':
        !          1424:   case '*':
        !          1425:   case '%':
        !          1426:   case '|':
        !          1427:   case '&':
        !          1428:   case '^':
        !          1429:   case '~':
        !          1430:   case '!':
        !          1431:   case '@':
        !          1432:   case '<':
        !          1433:   case '>':
        !          1434:   case '[':
        !          1435:   case ']':
        !          1436:   case '.':
        !          1437:   case '?':
        !          1438:   case ':':
        !          1439:   case '=':
        !          1440:   case '{':
        !          1441:   case '}':
        !          1442:   case ',':
        !          1443:   case '#':
        !          1444:     if (keyword_parsing)
        !          1445:       break;
        !          1446:   case '(':
        !          1447:   case ')':
        !          1448:     lexptr++;
        !          1449:     return c;
        !          1450: 
        !          1451:   case '"':
        !          1452:   string_constant:
        !          1453:     if (keyword_parsing) {
        !          1454:       char *start_ptr = lexptr;
        !          1455:       lexptr++;
        !          1456:       while (1) {
        !          1457:        c = *lexptr++;
        !          1458:        if (c == '\\')
        !          1459:          c = parse_escape (&lexptr);
        !          1460:        else if (c == '"')
        !          1461:          break;
        !          1462:       }
        !          1463:       yylval.name.address = (U_CHAR *) tokstart;
        !          1464:       yylval.name.length = lexptr - start_ptr;
        !          1465:       return NAME;
        !          1466:     }
        !          1467:     yyerror ("string constants not allowed in #if expressions");
        !          1468:     return ERROR;
        !          1469:   }
        !          1470: 
        !          1471:   if (c >= '0' && c <= '9' && !keyword_parsing) {
        !          1472:     /* It's a number */
        !          1473:     for (namelen = 0;
        !          1474:         c = tokstart[namelen], is_idchar[c] || c == '.'; 
        !          1475:         namelen++)
        !          1476:       ;
        !          1477:     return parse_number (namelen);
        !          1478:   }
        !          1479: 
        !          1480:   /* It is a name.  See how long it is.  */
        !          1481: 
        !          1482:   if (keyword_parsing) {
        !          1483:     for (namelen = 0;; namelen++) {
        !          1484:       if (is_hor_space[tokstart[namelen]])
        !          1485:        break;
        !          1486:       if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
        !          1487:        break;
        !          1488:       if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
        !          1489:        break;
        !          1490:     }
        !          1491:   } else {
        !          1492:     if (!is_idstart[c]) {
        !          1493:       yyerror ("Invalid token in expression");
        !          1494:       return ERROR;
        !          1495:     }
        !          1496: 
        !          1497:     for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
        !          1498:       ;
        !          1499:   }
        !          1500:   
        !          1501:   lexptr += namelen;
        !          1502:   yylval.name.address = (U_CHAR *) tokstart;
        !          1503:   yylval.name.length = namelen;
        !          1504:   return NAME;
        !          1505: }
        !          1506: 
        !          1507: 
        !          1508: /* Parse a C escape sequence.  STRING_PTR points to a variable
        !          1509:    containing a pointer to the string to parse.  That pointer
        !          1510:    is updated past the characters we use.  The value of the
        !          1511:    escape sequence is returned.
        !          1512: 
        !          1513:    A negative value means the sequence \ newline was seen,
        !          1514:    which is supposed to be equivalent to nothing at all.
        !          1515: 
        !          1516:    If \ is followed by a null character, we return a negative
        !          1517:    value and leave the string pointer pointing at the null character.
        !          1518: 
        !          1519:    If \ is followed by 000, we return 0 and leave the string pointer
        !          1520:    after the zeros.  A value of 0 does not mean end of string.  */
        !          1521: 
        !          1522: int
        !          1523: parse_escape (string_ptr)
        !          1524:      char **string_ptr;
        !          1525: {
        !          1526:   register int c = *(*string_ptr)++;
        !          1527:   switch (c)
        !          1528:     {
        !          1529:     case 'a':
        !          1530:       return TARGET_BELL;
        !          1531:     case 'b':
        !          1532:       return TARGET_BS;
        !          1533:     case 'e':
        !          1534:       return 033;
        !          1535:     case 'f':
        !          1536:       return TARGET_FF;
        !          1537:     case 'n':
        !          1538:       return TARGET_NEWLINE;
        !          1539:     case 'r':
        !          1540:       return TARGET_CR;
        !          1541:     case 't':
        !          1542:       return TARGET_TAB;
        !          1543:     case 'v':
        !          1544:       return TARGET_VT;
        !          1545:     case '\n':
        !          1546:       return -2;
        !          1547:     case 0:
        !          1548:       (*string_ptr)--;
        !          1549:       return 0;
        !          1550:     case '^':
        !          1551:       c = *(*string_ptr)++;
        !          1552:       if (c == '\\')
        !          1553:        c = parse_escape (string_ptr);
        !          1554:       if (c == '?')
        !          1555:        return 0177;
        !          1556:       return (c & 0200) | (c & 037);
        !          1557:       
        !          1558:     case '0':
        !          1559:     case '1':
        !          1560:     case '2':
        !          1561:     case '3':
        !          1562:     case '4':
        !          1563:     case '5':
        !          1564:     case '6':
        !          1565:     case '7':
        !          1566:       {
        !          1567:        register int i = c - '0';
        !          1568:        register int count = 0;
        !          1569:        while (++count < 3)
        !          1570:          {
        !          1571:            c = *(*string_ptr)++;
        !          1572:            if (c >= '0' && c <= '7')
        !          1573:              i = (i << 3) + c - '0';
        !          1574:            else
        !          1575:              {
        !          1576:                (*string_ptr)--;
        !          1577:                break;
        !          1578:              }
        !          1579:          }
        !          1580:        if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)
        !          1581:          {
        !          1582:            i &= (1 << CHAR_TYPE_SIZE) - 1;
        !          1583:            warning ("octal character constant does not fit in a byte");
        !          1584:          }
        !          1585:        return i;
        !          1586:       }
        !          1587:     case 'x':
        !          1588:       {
        !          1589:        register int i = 0;
        !          1590:        for (;;)
        !          1591:          {
        !          1592:            c = *(*string_ptr)++;
        !          1593:            if (c >= '0' && c <= '9')
        !          1594:              i = (i << 4) + c - '0';
        !          1595:            else if (c >= 'a' && c <= 'f')
        !          1596:              i = (i << 4) + c - 'a' + 10;
        !          1597:            else if (c >= 'A' && c <= 'F')
        !          1598:              i = (i << 4) + c - 'A' + 10;
        !          1599:            else
        !          1600:              {
        !          1601:                (*string_ptr)--;
        !          1602:                break;
        !          1603:              }
        !          1604:          }
        !          1605:        if ((i & ~((1 << BITS_PER_UNIT) - 1)) != 0)
        !          1606:          {
        !          1607:            i &= (1 << BITS_PER_UNIT) - 1;
        !          1608:            warning ("hex character constant does not fit in a byte");
        !          1609:          }
        !          1610:        return i;
        !          1611:       }
        !          1612:     default:
        !          1613:       return c;
        !          1614:     }
        !          1615: }
        !          1616: 
        !          1617: void
        !          1618: yyerror (s)
        !          1619:      char *s;
        !          1620: {
        !          1621:   error (s);
        !          1622:   longjmp (parse_return_error, 1);
        !          1623: }
        !          1624: 
        !          1625: /* This page contains the entry point to this file.  */
        !          1626: 
        !          1627: /* Parse STRING as an expression, and complain if this fails
        !          1628:    to use up all of the contents of STRING.  */
        !          1629: /* We do not support C comments.  They should be removed before
        !          1630:    this function is called.  */
        !          1631: 
        !          1632: int
        !          1633: parse_c_expression (string)
        !          1634:      char *string;
        !          1635: {
        !          1636:   lexptr = string;
        !          1637:   
        !          1638:   if (lexptr == 0 || *lexptr == 0) {
        !          1639:     error ("empty #if expression");
        !          1640:     return 0;                  /* don't include the #if group */
        !          1641:   }
        !          1642: 
        !          1643:   /* if there is some sort of scanning error, just return 0 and assume
        !          1644:      the parsing routine has printed an error message somewhere.
        !          1645:      there is surely a better thing to do than this.     */
        !          1646:   if (setjmp (parse_return_error))
        !          1647:     return 0;
        !          1648: 
        !          1649:   if (yyparse ())
        !          1650:     return 0;                  /* actually this is never reached
        !          1651:                                   the way things stand. */
        !          1652:   if (*lexptr)
        !          1653:     error ("Junk after end of expression.");
        !          1654: 
        !          1655:   return expression_value;     /* set by yyparse () */
        !          1656: }
        !          1657: 
        !          1658: #ifdef TEST_EXP_READER
        !          1659: extern int yydebug;
        !          1660: 
        !          1661: /* Main program for testing purposes.  */
        !          1662: int
        !          1663: main ()
        !          1664: {
        !          1665:   int n, c;
        !          1666:   char buf[1024];
        !          1667: 
        !          1668: /*
        !          1669:   yydebug = 1;
        !          1670: */
        !          1671:   initialize_random_junk ();
        !          1672: 
        !          1673:   for (;;) {
        !          1674:     printf ("enter expression: ");
        !          1675:     n = 0;
        !          1676:     while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
        !          1677:       n++;
        !          1678:     if (buf[n] == EOF)
        !          1679:       break;
        !          1680:     buf[n] = '\0';
        !          1681:     printf ("parser returned %d\n", parse_c_expression (buf));
        !          1682:   }
        !          1683: 
        !          1684:   return 0;
        !          1685: }
        !          1686: 
        !          1687: /* table to tell if char can be part of a C identifier. */
        !          1688: unsigned char is_idchar[256];
        !          1689: /* table to tell if char can be first char of a c identifier. */
        !          1690: unsigned char is_idstart[256];
        !          1691: /* table to tell if c is horizontal space.  isspace () thinks that
        !          1692:    newline is space; this is not a good idea for this program. */
        !          1693: char is_hor_space[256];
        !          1694: 
        !          1695: /*
        !          1696:  * initialize random junk in the hash table and maybe other places
        !          1697:  */
        !          1698: initialize_random_junk ()
        !          1699: {
        !          1700:   register int i;
        !          1701: 
        !          1702:   /*
        !          1703:    * Set up is_idchar and is_idstart tables.  These should be
        !          1704:    * faster than saying (is_alpha (c) || c == '_'), etc.
        !          1705:    * Must do set up these things before calling any routines tthat
        !          1706:    * refer to them.
        !          1707:    */
        !          1708:   for (i = 'a'; i <= 'z'; i++) {
        !          1709:     ++is_idchar[i - 'a' + 'A'];
        !          1710:     ++is_idchar[i];
        !          1711:     ++is_idstart[i - 'a' + 'A'];
        !          1712:     ++is_idstart[i];
        !          1713:   }
        !          1714:   for (i = '0'; i <= '9'; i++)
        !          1715:     ++is_idchar[i];
        !          1716:   ++is_idchar['_'];
        !          1717:   ++is_idstart['_'];
        !          1718: #if DOLLARS_IN_IDENTIFIERS
        !          1719:   ++is_idchar['$'];
        !          1720:   ++is_idstart['$'];
        !          1721: #endif
        !          1722: 
        !          1723:   /* horizontal space table */
        !          1724:   ++is_hor_space[' '];
        !          1725:   ++is_hor_space['\t'];
        !          1726: }
        !          1727: 
        !          1728: error (msg)
        !          1729: {
        !          1730:   printf ("error: %s\n", msg);
        !          1731: }
        !          1732: 
        !          1733: warning (msg)
        !          1734: {
        !          1735:   printf ("warning: %s\n", msg);
        !          1736: }
        !          1737: 
        !          1738: struct hashnode *
        !          1739: lookup (name, len, hash)
        !          1740:      char *name;
        !          1741:      int len;
        !          1742:      int hash;
        !          1743: {
        !          1744:   return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
        !          1745: }
        !          1746: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.