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