/[cvs]/eggdrop1.9/intl/plural.c
ViewVC logotype

Contents of /eggdrop1.9/intl/plural.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Fri Mar 7 11:30:34 2003 UTC (16 years ago) by tothwolf
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +26 -30 lines
File MIME type: text/x-chdr
* Upgraded gettext to version 0.11.5.

1
2 /* A Bison parser, made from plural.y
3 by GNU Bison version 1.28 */
4
5 #define YYBISON 1 /* Identify Bison output. */
6
7 #define yyparse __gettextparse
8 #define yylex __gettextlex
9 #define yyerror __gettexterror
10 #define yylval __gettextlval
11 #define yychar __gettextchar
12 #define yydebug __gettextdebug
13 #define yynerrs __gettextnerrs
14 #define EQUOP2 257
15 #define CMPOP2 258
16 #define ADDOP2 259
17 #define MULOP2 260
18 #define NUMBER 261
19
20 #line 1 "plural.y"
21
22 /* Expression parsing for plural form selection.
23 Copyright (C) 2000, 2001 Free Software Foundation, Inc.
24 Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
25
26 This program is free software; you can redistribute it and/or modify it
27 under the terms of the GNU Library General Public License as published
28 by the Free Software Foundation; either version 2, or (at your option)
29 any later version.
30
31 This program is distributed in the hope that it will be useful,
32 but WITHOUT ANY WARRANTY; without even the implied warranty of
33 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
34 Library General Public License for more details.
35
36 You should have received a copy of the GNU Library General Public
37 License along with this program; if not, write to the Free Software
38 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
39 USA. */
40
41 /* The bison generated parser uses alloca. AIX 3 forces us to put this
42 declaration at the beginning of the file. The declaration in bison's
43 skeleton file comes too late. This must come before <config.h>
44 because <config.h> may include arbitrary system headers. */
45 #if defined _AIX && !defined __GNUC__
46 #pragma alloca
47 #endif
48
49 #ifdef HAVE_CONFIG_H
50 # include <config.h>
51 #endif
52
53 #include <stddef.h>
54 #include <stdlib.h>
55 #include "plural-exp.h"
56
57 /* The main function generated by the parser is called __gettextparse,
58 but we want it to be called PLURAL_PARSE. */
59 #ifndef _LIBC
60 # define __gettextparse PLURAL_PARSE
61 #endif
62
63 #define YYLEX_PARAM &((struct parse_args *) arg)->cp
64 #define YYPARSE_PARAM arg
65
66 #line 49 "plural.y"
67 typedef union {
68 unsigned long int num;
69 enum operator op;
70 struct expression *exp;
71 } YYSTYPE;
72 #line 55 "plural.y"
73
74 /* Prototypes for local functions. */
75 static struct expression *new_exp PARAMS ((int nargs, enum operator op,
76 struct expression * const *args));
77 static inline struct expression *new_exp_0 PARAMS ((enum operator op));
78 static inline struct expression *new_exp_1 PARAMS ((enum operator op,
79 struct expression *right));
80 static struct expression *new_exp_2 PARAMS ((enum operator op,
81 struct expression *left,
82 struct expression *right));
83 static inline struct expression *new_exp_3 PARAMS ((enum operator op,
84 struct expression *bexp,
85 struct expression *tbranch,
86 struct expression *fbranch));
87 static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
88 static void yyerror PARAMS ((const char *str));
89
90 /* Allocation of expressions. */
91
92 static struct expression *
93 new_exp (nargs, op, args)
94 int nargs;
95 enum operator op;
96 struct expression * const *args;
97 {
98 int i;
99 struct expression *newp;
100
101 /* If any of the argument could not be malloc'ed, just return NULL. */
102 for (i = nargs - 1; i >= 0; i--)
103 if (args[i] == NULL)
104 goto fail;
105
106 /* Allocate a new expression. */
107 newp = (struct expression *) malloc (sizeof (*newp));
108 if (newp != NULL)
109 {
110 newp->nargs = nargs;
111 newp->operation = op;
112 for (i = nargs - 1; i >= 0; i--)
113 newp->val.args[i] = args[i];
114 return newp;
115 }
116
117 fail:
118 for (i = nargs - 1; i >= 0; i--)
119 FREE_EXPRESSION (args[i]);
120
121 return NULL;
122 }
123
124 static inline struct expression *
125 new_exp_0 (op)
126 enum operator op;
127 {
128 return new_exp (0, op, NULL);
129 }
130
131 static inline struct expression *
132 new_exp_1 (op, right)
133 enum operator op;
134 struct expression *right;
135 {
136 struct expression *args[1];
137
138 args[0] = right;
139 return new_exp (1, op, args);
140 }
141
142 static struct expression *
143 new_exp_2 (op, left, right)
144 enum operator op;
145 struct expression *left;
146 struct expression *right;
147 {
148 struct expression *args[2];
149
150 args[0] = left;
151 args[1] = right;
152 return new_exp (2, op, args);
153 }
154
155 static inline struct expression *
156 new_exp_3 (op, bexp, tbranch, fbranch)
157 enum operator op;
158 struct expression *bexp;
159 struct expression *tbranch;
160 struct expression *fbranch;
161 {
162 struct expression *args[3];
163
164 args[0] = bexp;
165 args[1] = tbranch;
166 args[2] = fbranch;
167 return new_exp (3, op, args);
168 }
169
170 #include <stdio.h>
171
172 #ifndef __cplusplus
173 #ifndef __STDC__
174 #define const
175 #endif
176 #endif
177
178
179
180 #define YYFINAL 27
181 #define YYFLAG -32768
182 #define YYNTBASE 16
183
184 #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
185
186 static const char yytranslate[] = { 0,
187 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
188 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
189 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
190 2, 2, 10, 2, 2, 2, 2, 5, 2, 14,
191 15, 2, 2, 2, 2, 2, 2, 2, 2, 2,
192 2, 2, 2, 2, 2, 2, 2, 12, 2, 2,
193 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
194 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
195 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
196 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
197 2, 2, 2, 2, 2, 2, 2, 2, 2, 13,
198 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
199 2, 2, 2, 4, 2, 2, 2, 2, 2, 2,
200 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
201 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
202 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
203 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
204 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
205 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
206 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
207 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
208 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
209 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
210 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
211 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
212 2, 2, 2, 2, 2, 1, 6, 7, 8, 9,
213 11
214 };
215
216 #if YYDEBUG != 0
217 static const short yyprhs[] = { 0,
218 0, 2, 8, 12, 16, 20, 24, 28, 32, 35,
219 37, 39
220 };
221
222 static const short yyrhs[] = { 17,
223 0, 17, 3, 17, 12, 17, 0, 17, 4, 17,
224 0, 17, 5, 17, 0, 17, 6, 17, 0, 17,
225 7, 17, 0, 17, 8, 17, 0, 17, 9, 17,
226 0, 10, 17, 0, 13, 0, 11, 0, 14, 17,
227 15, 0
228 };
229
230 #endif
231
232 #if YYDEBUG != 0
233 static const short yyrline[] = { 0,
234 174, 182, 186, 190, 194, 198, 202, 206, 210, 214,
235 218, 223
236 };
237 #endif
238
239
240 #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
241
242 static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'",
243 "'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'",
244 "start","exp", NULL
245 };
246 #endif
247
248 static const short yyr1[] = { 0,
249 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
250 17, 17
251 };
252
253 static const short yyr2[] = { 0,
254 1, 5, 3, 3, 3, 3, 3, 3, 2, 1,
255 1, 3
256 };
257
258 static const short yydefact[] = { 0,
259 0, 11, 10, 0, 1, 9, 0, 0, 0, 0,
260 0, 0, 0, 0, 12, 0, 3, 4, 5, 6,
261 7, 8, 0, 2, 0, 0, 0
262 };
263
264 static const short yydefgoto[] = { 25,
265 5
266 };
267
268 static const short yypact[] = { -9,
269 -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9,
270 -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26,
271 -3,-32768, -9, 34, 21, 53,-32768
272 };
273
274 static const short yypgoto[] = {-32768,
275 -1
276 };
277
278
279 #define YYLAST 53
280
281
282 static const short yytable[] = { 6,
283 1, 2, 7, 3, 4, 14, 16, 17, 18, 19,
284 20, 21, 22, 8, 9, 10, 11, 12, 13, 14,
285 26, 24, 12, 13, 14, 15, 8, 9, 10, 11,
286 12, 13, 14, 13, 14, 23, 8, 9, 10, 11,
287 12, 13, 14, 10, 11, 12, 13, 14, 11, 12,
288 13, 14, 27
289 };
290
291 static const short yycheck[] = { 1,
292 10, 11, 4, 13, 14, 9, 8, 9, 10, 11,
293 12, 13, 14, 3, 4, 5, 6, 7, 8, 9,
294 0, 23, 7, 8, 9, 15, 3, 4, 5, 6,
295 7, 8, 9, 8, 9, 12, 3, 4, 5, 6,
296 7, 8, 9, 5, 6, 7, 8, 9, 6, 7,
297 8, 9, 0
298 };
299 #define YYPURE 1
300
301 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
302 #line 3 "/usr/local/share/bison.simple"
303 /* This file comes from bison-1.28. */
304
305 /* Skeleton output parser for bison,
306 Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
307
308 This program is free software; you can redistribute it and/or modify
309 it under the terms of the GNU General Public License as published by
310 the Free Software Foundation; either version 2, or (at your option)
311 any later version.
312
313 This program is distributed in the hope that it will be useful,
314 but WITHOUT ANY WARRANTY; without even the implied warranty of
315 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
316 GNU General Public License for more details.
317
318 You should have received a copy of the GNU General Public License
319 along with this program; if not, write to the Free Software
320 Foundation, Inc., 59 Temple Place - Suite 330,
321 Boston, MA 02111-1307, USA. */
322
323 /* As a special exception, when this file is copied by Bison into a
324 Bison output file, you may use that output file without restriction.
325 This special exception was added by the Free Software Foundation
326 in version 1.24 of Bison. */
327
328 /* This is the parser code that is written into each bison parser
329 when the %semantic_parser declaration is not specified in the grammar.
330 It was written by Richard Stallman by simplifying the hairy parser
331 used when %semantic_parser is specified. */
332
333 #ifndef YYSTACK_USE_ALLOCA
334 #ifdef alloca
335 #define YYSTACK_USE_ALLOCA
336 #else /* alloca not defined */
337 #ifdef __GNUC__
338 #define YYSTACK_USE_ALLOCA
339 #define alloca __builtin_alloca
340 #else /* not GNU C. */
341 #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
342 #define YYSTACK_USE_ALLOCA
343 #include <alloca.h>
344 #else /* not sparc */
345 /* We think this test detects Watcom and Microsoft C. */
346 /* This used to test MSDOS, but that is a bad idea
347 since that symbol is in the user namespace. */
348 #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
349 #if 0 /* No need for malloc.h, which pollutes the namespace;
350 instead, just don't use alloca. */
351 #include <malloc.h>
352 #endif
353 #else /* not MSDOS, or __TURBOC__ */
354 #if defined(_AIX)
355 /* I don't know what this was needed for, but it pollutes the namespace.
356 So I turned it off. rms, 2 May 1997. */
357 /* #include <malloc.h> */
358 #pragma alloca
359 #define YYSTACK_USE_ALLOCA
360 #else /* not MSDOS, or __TURBOC__, or _AIX */
361 #if 0
362 #ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
363 and on HPUX 10. Eventually we can turn this on. */
364 #define YYSTACK_USE_ALLOCA
365 #define alloca __builtin_alloca
366 #endif /* __hpux */
367 #endif
368 #endif /* not _AIX */
369 #endif /* not MSDOS, or __TURBOC__ */
370 #endif /* not sparc */
371 #endif /* not GNU C */
372 #endif /* alloca not defined */
373 #endif /* YYSTACK_USE_ALLOCA not defined */
374
375 #ifdef YYSTACK_USE_ALLOCA
376 #define YYSTACK_ALLOC alloca
377 #else
378 #define YYSTACK_ALLOC malloc
379 #endif
380
381 /* Note: there must be only one dollar sign in this file.
382 It is replaced by the list of actions, each action
383 as one case of the switch. */
384
385 #define yyerrok (yyerrstatus = 0)
386 #define yyclearin (yychar = YYEMPTY)
387 #define YYEMPTY -2
388 #define YYEOF 0
389 #define YYACCEPT goto yyacceptlab
390 #define YYABORT goto yyabortlab
391 #define YYERROR goto yyerrlab1
392 /* Like YYERROR except do call yyerror.
393 This remains here temporarily to ease the
394 transition to the new meaning of YYERROR, for GCC.
395 Once GCC version 2 has supplanted version 1, this can go. */
396 #define YYFAIL goto yyerrlab
397 #define YYRECOVERING() (!!yyerrstatus)
398 #define YYBACKUP(token, value) \
399 do \
400 if (yychar == YYEMPTY && yylen == 1) \
401 { yychar = (token), yylval = (value); \
402 yychar1 = YYTRANSLATE (yychar); \
403 YYPOPSTACK; \
404 goto yybackup; \
405 } \
406 else \
407 { yyerror ("syntax error: cannot back up"); YYERROR; } \
408 while (0)
409
410 #define YYTERROR 1
411 #define YYERRCODE 256
412
413 #ifndef YYPURE
414 #define YYLEX yylex()
415 #endif
416
417 #ifdef YYPURE
418 #ifdef YYLSP_NEEDED
419 #ifdef YYLEX_PARAM
420 #define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
421 #else
422 #define YYLEX yylex(&yylval, &yylloc)
423 #endif
424 #else /* not YYLSP_NEEDED */
425 #ifdef YYLEX_PARAM
426 #define YYLEX yylex(&yylval, YYLEX_PARAM)
427 #else
428 #define YYLEX yylex(&yylval)
429 #endif
430 #endif /* not YYLSP_NEEDED */
431 #endif
432
433 /* If nonreentrant, generate the variables here */
434
435 #ifndef YYPURE
436
437 int yychar; /* the lookahead symbol */
438 YYSTYPE yylval; /* the semantic value of the */
439 /* lookahead symbol */
440
441 #ifdef YYLSP_NEEDED
442 YYLTYPE yylloc; /* location data for the lookahead */
443 /* symbol */
444 #endif
445
446 int yynerrs; /* number of parse errors so far */
447 #endif /* not YYPURE */
448
449 #if YYDEBUG != 0
450 int yydebug; /* nonzero means print parse trace */
451 /* Since this is uninitialized, it does not stop multiple parsers
452 from coexisting. */
453 #endif
454
455 /* YYINITDEPTH indicates the initial size of the parser's stacks */
456
457 #ifndef YYINITDEPTH
458 #define YYINITDEPTH 200
459 #endif
460
461 /* YYMAXDEPTH is the maximum size the stacks can grow to
462 (effective only if the built-in stack extension method is used). */
463
464 #if YYMAXDEPTH == 0
465 #undef YYMAXDEPTH
466 #endif
467
468 #ifndef YYMAXDEPTH
469 #define YYMAXDEPTH 10000
470 #endif
471
472 /* Define __yy_memcpy. Note that the size argument
473 should be passed with type unsigned int, because that is what the non-GCC
474 definitions require. With GCC, __builtin_memcpy takes an arg
475 of type size_t, but it can handle unsigned int. */
476
477 #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
478 #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
479 #else /* not GNU C or C++ */
480 #ifndef __cplusplus
481
482 /* This is the most reliable way to avoid incompatibilities
483 in available built-in functions on various systems. */
484 static void
485 __yy_memcpy (to, from, count)
486 char *to;
487 char *from;
488 unsigned int count;
489 {
490 register char *f = from;
491 register char *t = to;
492 register int i = count;
493
494 while (i-- > 0)
495 *t++ = *f++;
496 }
497
498 #else /* __cplusplus */
499
500 /* This is the most reliable way to avoid incompatibilities
501 in available built-in functions on various systems. */
502 static void
503 __yy_memcpy (char *to, char *from, unsigned int count)
504 {
505 register char *t = to;
506 register char *f = from;
507 register int i = count;
508
509 while (i-- > 0)
510 *t++ = *f++;
511 }
512
513 #endif
514 #endif
515
516 #line 217 "/usr/local/share/bison.simple"
517
518 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
519 into yyparse. The argument should have type void *.
520 It should actually point to an object.
521 Grammar actions can access the variable by casting it
522 to the proper pointer type. */
523
524 #ifdef YYPARSE_PARAM
525 #ifdef __cplusplus
526 #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
527 #define YYPARSE_PARAM_DECL
528 #else /* not __cplusplus */
529 #define YYPARSE_PARAM_ARG YYPARSE_PARAM
530 #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
531 #endif /* not __cplusplus */
532 #else /* not YYPARSE_PARAM */
533 #define YYPARSE_PARAM_ARG
534 #define YYPARSE_PARAM_DECL
535 #endif /* not YYPARSE_PARAM */
536
537 /* Prevent warning if -Wstrict-prototypes. */
538 #ifdef __GNUC__
539 #ifdef YYPARSE_PARAM
540 int yyparse (void *);
541 #else
542 int yyparse (void);
543 #endif
544 #endif
545
546 int
547 yyparse(YYPARSE_PARAM_ARG)
548 YYPARSE_PARAM_DECL
549 {
550 register int yystate;
551 register int yyn;
552 register short *yyssp;
553 register YYSTYPE *yyvsp;
554 int yyerrstatus; /* number of tokens to shift before error messages enabled */
555 int yychar1 = 0; /* lookahead token as an internal (translated) token number */
556
557 short yyssa[YYINITDEPTH]; /* the state stack */
558 YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
559
560 short *yyss = yyssa; /* refer to the stacks thru separate pointers */
561 YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
562
563 #ifdef YYLSP_NEEDED
564 YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
565 YYLTYPE *yyls = yylsa;
566 YYLTYPE *yylsp;
567
568 #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
569 #else
570 #define YYPOPSTACK (yyvsp--, yyssp--)
571 #endif
572
573 int yystacksize = YYINITDEPTH;
574 int yyfree_stacks = 0;
575
576 #ifdef YYPURE
577 int yychar;
578 YYSTYPE yylval;
579 int yynerrs;
580 #ifdef YYLSP_NEEDED
581 YYLTYPE yylloc;
582 #endif
583 #endif
584
585 YYSTYPE yyval; /* the variable used to return */
586 /* semantic values from the action */
587 /* routines */
588
589 int yylen;
590
591 #if YYDEBUG != 0
592 if (yydebug)
593 fprintf(stderr, "Starting parse\n");
594 #endif
595
596 yystate = 0;
597 yyerrstatus = 0;
598 yynerrs = 0;
599 yychar = YYEMPTY; /* Cause a token to be read. */
600
601 /* Initialize stack pointers.
602 Waste one element of value and location stack
603 so that they stay on the same level as the state stack.
604 The wasted elements are never initialized. */
605
606 yyssp = yyss - 1;
607 yyvsp = yyvs;
608 #ifdef YYLSP_NEEDED
609 yylsp = yyls;
610 #endif
611
612 /* Push a new state, which is found in yystate . */
613 /* In all cases, when you get here, the value and location stacks
614 have just been pushed. so pushing a state here evens the stacks. */
615 yynewstate:
616
617 *++yyssp = yystate;
618
619 if (yyssp >= yyss + yystacksize - 1)
620 {
621 /* Give user a chance to reallocate the stack */
622 /* Use copies of these so that the &'s don't force the real ones into memory. */
623 YYSTYPE *yyvs1 = yyvs;
624 short *yyss1 = yyss;
625 #ifdef YYLSP_NEEDED
626 YYLTYPE *yyls1 = yyls;
627 #endif
628
629 /* Get the current used size of the three stacks, in elements. */
630 int size = yyssp - yyss + 1;
631
632 #ifdef yyoverflow
633 /* Each stack pointer address is followed by the size of
634 the data in use in that stack, in bytes. */
635 #ifdef YYLSP_NEEDED
636 /* This used to be a conditional around just the two extra args,
637 but that might be undefined if yyoverflow is a macro. */
638 yyoverflow("parser stack overflow",
639 &yyss1, size * sizeof (*yyssp),
640 &yyvs1, size * sizeof (*yyvsp),
641 &yyls1, size * sizeof (*yylsp),
642 &yystacksize);
643 #else
644 yyoverflow("parser stack overflow",
645 &yyss1, size * sizeof (*yyssp),
646 &yyvs1, size * sizeof (*yyvsp),
647 &yystacksize);
648 #endif
649
650 yyss = yyss1; yyvs = yyvs1;
651 #ifdef YYLSP_NEEDED
652 yyls = yyls1;
653 #endif
654 #else /* no yyoverflow */
655 /* Extend the stack our own way. */
656 if (yystacksize >= YYMAXDEPTH)
657 {
658 yyerror("parser stack overflow");
659 if (yyfree_stacks)
660 {
661 free (yyss);
662 free (yyvs);
663 #ifdef YYLSP_NEEDED
664 free (yyls);
665 #endif
666 }
667 return 2;
668 }
669 yystacksize *= 2;
670 if (yystacksize > YYMAXDEPTH)
671 yystacksize = YYMAXDEPTH;
672 #ifndef YYSTACK_USE_ALLOCA
673 yyfree_stacks = 1;
674 #endif
675 yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
676 __yy_memcpy ((char *)yyss, (char *)yyss1,
677 size * (unsigned int) sizeof (*yyssp));
678 yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
679 __yy_memcpy ((char *)yyvs, (char *)yyvs1,
680 size * (unsigned int) sizeof (*yyvsp));
681 #ifdef YYLSP_NEEDED
682 yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
683 __yy_memcpy ((char *)yyls, (char *)yyls1,
684 size * (unsigned int) sizeof (*yylsp));
685 #endif
686 #endif /* no yyoverflow */
687
688 yyssp = yyss + size - 1;
689 yyvsp = yyvs + size - 1;
690 #ifdef YYLSP_NEEDED
691 yylsp = yyls + size - 1;
692 #endif
693
694 #if YYDEBUG != 0
695 if (yydebug)
696 fprintf(stderr, "Stack size increased to %d\n", yystacksize);
697 #endif
698
699 if (yyssp >= yyss + yystacksize - 1)
700 YYABORT;
701 }
702
703 #if YYDEBUG != 0
704 if (yydebug)
705 fprintf(stderr, "Entering state %d\n", yystate);
706 #endif
707
708 goto yybackup;
709 yybackup:
710
711 /* Do appropriate processing given the current state. */
712 /* Read a lookahead token if we need one and don't already have one. */
713 /* yyresume: */
714
715 /* First try to decide what to do without reference to lookahead token. */
716
717 yyn = yypact[yystate];
718 if (yyn == YYFLAG)
719 goto yydefault;
720
721 /* Not known => get a lookahead token if don't already have one. */
722
723 /* yychar is either YYEMPTY or YYEOF
724 or a valid token in external form. */
725
726 if (yychar == YYEMPTY)
727 {
728 #if YYDEBUG != 0
729 if (yydebug)
730 fprintf(stderr, "Reading a token: ");
731 #endif
732 yychar = YYLEX;
733 }
734
735 /* Convert token to internal form (in yychar1) for indexing tables with */
736
737 if (yychar <= 0) /* This means end of input. */
738 {
739 yychar1 = 0;
740 yychar = YYEOF; /* Don't call YYLEX any more */
741
742 #if YYDEBUG != 0
743 if (yydebug)
744 fprintf(stderr, "Now at end of input.\n");
745 #endif
746 }
747 else
748 {
749 yychar1 = YYTRANSLATE(yychar);
750
751 #if YYDEBUG != 0
752 if (yydebug)
753 {
754 fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
755 /* Give the individual parser a way to print the precise meaning
756 of a token, for further debugging info. */
757 #ifdef YYPRINT
758 YYPRINT (stderr, yychar, yylval);
759 #endif
760 fprintf (stderr, ")\n");
761 }
762 #endif
763 }
764
765 yyn += yychar1;
766 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
767 goto yydefault;
768
769 yyn = yytable[yyn];
770
771 /* yyn is what to do for this token type in this state.
772 Negative => reduce, -yyn is rule number.
773 Positive => shift, yyn is new state.
774 New state is final state => don't bother to shift,
775 just return success.
776 0, or most negative number => error. */
777
778 if (yyn < 0)
779 {
780 if (yyn == YYFLAG)
781 goto yyerrlab;
782 yyn = -yyn;
783 goto yyreduce;
784 }
785 else if (yyn == 0)
786 goto yyerrlab;
787
788 if (yyn == YYFINAL)
789 YYACCEPT;
790
791 /* Shift the lookahead token. */
792
793 #if YYDEBUG != 0
794 if (yydebug)
795 fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
796 #endif
797
798 /* Discard the token being shifted unless it is eof. */
799 if (yychar != YYEOF)
800 yychar = YYEMPTY;
801
802 *++yyvsp = yylval;
803 #ifdef YYLSP_NEEDED
804 *++yylsp = yylloc;
805 #endif
806
807 /* count tokens shifted since error; after three, turn off error status. */
808 if (yyerrstatus) yyerrstatus--;
809
810 yystate = yyn;
811 goto yynewstate;
812
813 /* Do the default action for the current state. */
814 yydefault:
815
816 yyn = yydefact[yystate];
817 if (yyn == 0)
818 goto yyerrlab;
819
820 /* Do a reduction. yyn is the number of a rule to reduce with. */
821 yyreduce:
822 yylen = yyr2[yyn];
823 if (yylen > 0)
824 yyval = yyvsp[1-yylen]; /* implement default value of the action */
825
826 #if YYDEBUG != 0
827 if (yydebug)
828 {
829 int i;
830
831 fprintf (stderr, "Reducing via rule %d (line %d), ",
832 yyn, yyrline[yyn]);
833
834 /* Print the symbols being reduced, and their result. */
835 for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
836 fprintf (stderr, "%s ", yytname[yyrhs[i]]);
837 fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
838 }
839 #endif
840
841
842 switch (yyn) {
843
844 case 1:
845 #line 175 "plural.y"
846 {
847 if (yyvsp[0].exp == NULL)
848 YYABORT;
849 ((struct parse_args *) arg)->res = yyvsp[0].exp;
850 ;
851 break;}
852 case 2:
853 #line 183 "plural.y"
854 {
855 yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
856 ;
857 break;}
858 case 3:
859 #line 187 "plural.y"
860 {
861 yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
862 ;
863 break;}
864 case 4:
865 #line 191 "plural.y"
866 {
867 yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
868 ;
869 break;}
870 case 5:
871 #line 195 "plural.y"
872 {
873 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
874 ;
875 break;}
876 case 6:
877 #line 199 "plural.y"
878 {
879 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
880 ;
881 break;}
882 case 7:
883 #line 203 "plural.y"
884 {
885 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
886 ;
887 break;}
888 case 8:
889 #line 207 "plural.y"
890 {
891 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
892 ;
893 break;}
894 case 9:
895 #line 211 "plural.y"
896 {
897 yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
898 ;
899 break;}
900 case 10:
901 #line 215 "plural.y"
902 {
903 yyval.exp = new_exp_0 (var);
904 ;
905 break;}
906 case 11:
907 #line 219 "plural.y"
908 {
909 if ((yyval.exp = new_exp_0 (num)) != NULL)
910 yyval.exp->val.num = yyvsp[0].num;
911 ;
912 break;}
913 case 12:
914 #line 224 "plural.y"
915 {
916 yyval.exp = yyvsp[-1].exp;
917 ;
918 break;}
919 }
920 /* the action file gets copied in in place of this dollarsign */
921 #line 543 "/usr/local/share/bison.simple"
922
923 yyvsp -= yylen;
924 yyssp -= yylen;
925 #ifdef YYLSP_NEEDED
926 yylsp -= yylen;
927 #endif
928
929 #if YYDEBUG != 0
930 if (yydebug)
931 {
932 short *ssp1 = yyss - 1;
933 fprintf (stderr, "state stack now");
934 while (ssp1 != yyssp)
935 fprintf (stderr, " %d", *++ssp1);
936 fprintf (stderr, "\n");
937 }
938 #endif
939
940 *++yyvsp = yyval;
941
942 #ifdef YYLSP_NEEDED
943 yylsp++;
944 if (yylen == 0)
945 {
946 yylsp->first_line = yylloc.first_line;
947 yylsp->first_column = yylloc.first_column;
948 yylsp->last_line = (yylsp-1)->last_line;
949 yylsp->last_column = (yylsp-1)->last_column;
950 yylsp->text = 0;
951 }
952 else
953 {
954 yylsp->last_line = (yylsp+yylen-1)->last_line;
955 yylsp->last_column = (yylsp+yylen-1)->last_column;
956 }
957 #endif
958
959 /* Now "shift" the result of the reduction.
960 Determine what state that goes to,
961 based on the state we popped back to
962 and the rule number reduced by. */
963
964 yyn = yyr1[yyn];
965
966 yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
967 if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
968 yystate = yytable[yystate];
969 else
970 yystate = yydefgoto[yyn - YYNTBASE];
971
972 goto yynewstate;
973
974 yyerrlab: /* here on detecting error */
975
976 if (! yyerrstatus)
977 /* If not already recovering from an error, report this error. */
978 {
979 ++yynerrs;
980
981 #ifdef YYERROR_VERBOSE
982 yyn = yypact[yystate];
983
984 if (yyn > YYFLAG && yyn < YYLAST)
985 {
986 int size = 0;
987 char *msg;
988 int x, count;
989
990 count = 0;
991 /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
992 for (x = (yyn < 0 ? -yyn : 0);
993 x < (sizeof(yytname) / sizeof(char *)); x++)
994 if (yycheck[x + yyn] == x)
995 size += strlen(yytname[x]) + 15, count++;
996 msg = (char *) malloc(size + 15);
997 if (msg != 0)
998 {
999 strcpy(msg, "parse error");
1000
1001 if (count < 5)
1002 {
1003 count = 0;
1004 for (x = (yyn < 0 ? -yyn : 0);
1005 x < (sizeof(yytname) / sizeof(char *)); x++)
1006 if (yycheck[x + yyn] == x)
1007 {
1008 strcat(msg, count == 0 ? ", expecting `" : " or `");
1009 strcat(msg, yytname[x]);
1010 strcat(msg, "'");
1011 count++;
1012 }
1013 }
1014 yyerror(msg);
1015 free(msg);
1016 }
1017 else
1018 yyerror ("parse error; also virtual memory exceeded");
1019 }
1020 else
1021 #endif /* YYERROR_VERBOSE */
1022 yyerror("parse error");
1023 }
1024
1025 goto yyerrlab1;
1026 yyerrlab1: /* here on error raised explicitly by an action */
1027
1028 if (yyerrstatus == 3)
1029 {
1030 /* if just tried and failed to reuse lookahead token after an error, discard it. */
1031
1032 /* return failure if at end of input */
1033 if (yychar == YYEOF)
1034 YYABORT;
1035
1036 #if YYDEBUG != 0
1037 if (yydebug)
1038 fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
1039 #endif
1040
1041 yychar = YYEMPTY;
1042 }
1043
1044 /* Else will try to reuse lookahead token
1045 after shifting the error token. */
1046
1047 yyerrstatus = 3; /* Each real token shifted decrements this */
1048
1049 goto yyerrhandle;
1050
1051 yyerrdefault: /* current state does not do anything special for the error token. */
1052
1053 #if 0
1054 /* This is wrong; only states that explicitly want error tokens
1055 should shift them. */
1056 yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
1057 if (yyn) goto yydefault;
1058 #endif
1059
1060 yyerrpop: /* pop the current state because it cannot handle the error token */
1061
1062 if (yyssp == yyss) YYABORT;
1063 yyvsp--;
1064 yystate = *--yyssp;
1065 #ifdef YYLSP_NEEDED
1066 yylsp--;
1067 #endif
1068
1069 #if YYDEBUG != 0
1070 if (yydebug)
1071 {
1072 short *ssp1 = yyss - 1;
1073 fprintf (stderr, "Error: state stack now");
1074 while (ssp1 != yyssp)
1075 fprintf (stderr, " %d", *++ssp1);
1076 fprintf (stderr, "\n");
1077 }
1078 #endif
1079
1080 yyerrhandle:
1081
1082 yyn = yypact[yystate];
1083 if (yyn == YYFLAG)
1084 goto yyerrdefault;
1085
1086 yyn += YYTERROR;
1087 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
1088 goto yyerrdefault;
1089
1090 yyn = yytable[yyn];
1091 if (yyn < 0)
1092 {
1093 if (yyn == YYFLAG)
1094 goto yyerrpop;
1095 yyn = -yyn;
1096 goto yyreduce;
1097 }
1098 else if (yyn == 0)
1099 goto yyerrpop;
1100
1101 if (yyn == YYFINAL)
1102 YYACCEPT;
1103
1104 #if YYDEBUG != 0
1105 if (yydebug)
1106 fprintf(stderr, "Shifting error token, ");
1107 #endif
1108
1109 *++yyvsp = yylval;
1110 #ifdef YYLSP_NEEDED
1111 *++yylsp = yylloc;
1112 #endif
1113
1114 yystate = yyn;
1115 goto yynewstate;
1116
1117 yyacceptlab:
1118 /* YYACCEPT comes here. */
1119 if (yyfree_stacks)
1120 {
1121 free (yyss);
1122 free (yyvs);
1123 #ifdef YYLSP_NEEDED
1124 free (yyls);
1125 #endif
1126 }
1127 return 0;
1128
1129 yyabortlab:
1130 /* YYABORT comes here. */
1131 if (yyfree_stacks)
1132 {
1133 free (yyss);
1134 free (yyvs);
1135 #ifdef YYLSP_NEEDED
1136 free (yyls);
1137 #endif
1138 }
1139 return 1;
1140 }
1141 #line 229 "plural.y"
1142
1143
1144 void
1145 internal_function
1146 FREE_EXPRESSION (exp)
1147 struct expression *exp;
1148 {
1149 if (exp == NULL)
1150 return;
1151
1152 /* Handle the recursive case. */
1153 switch (exp->nargs)
1154 {
1155 case 3:
1156 FREE_EXPRESSION (exp->val.args[2]);
1157 /* FALLTHROUGH */
1158 case 2:
1159 FREE_EXPRESSION (exp->val.args[1]);
1160 /* FALLTHROUGH */
1161 case 1:
1162 FREE_EXPRESSION (exp->val.args[0]);
1163 /* FALLTHROUGH */
1164 default:
1165 break;
1166 }
1167
1168 free (exp);
1169 }
1170
1171
1172 static int
1173 yylex (lval, pexp)
1174 YYSTYPE *lval;
1175 const char **pexp;
1176 {
1177 const char *exp = *pexp;
1178 int result;
1179
1180 while (1)
1181 {
1182 if (exp[0] == '\0')
1183 {
1184 *pexp = exp;
1185 return YYEOF;
1186 }
1187
1188 if (exp[0] != ' ' && exp[0] != '\t')
1189 break;
1190
1191 ++exp;
1192 }
1193
1194 result = *exp++;
1195 switch (result)
1196 {
1197 case '0': case '1': case '2': case '3': case '4':
1198 case '5': case '6': case '7': case '8': case '9':
1199 {
1200 unsigned long int n = result - '0';
1201 while (exp[0] >= '0' && exp[0] <= '9')
1202 {
1203 n *= 10;
1204 n += exp[0] - '0';
1205 ++exp;
1206 }
1207 lval->num = n;
1208 result = NUMBER;
1209 }
1210 break;
1211
1212 case '=':
1213 if (exp[0] == '=')
1214 {
1215 ++exp;
1216 lval->op = equal;
1217 result = EQUOP2;
1218 }
1219 else
1220 result = YYERRCODE;
1221 break;
1222
1223 case '!':
1224 if (exp[0] == '=')
1225 {
1226 ++exp;
1227 lval->op = not_equal;
1228 result = EQUOP2;
1229 }
1230 break;
1231
1232 case '&':
1233 case '|':
1234 if (exp[0] == result)
1235 ++exp;
1236 else
1237 result = YYERRCODE;
1238 break;
1239
1240 case '<':
1241 if (exp[0] == '=')
1242 {
1243 ++exp;
1244 lval->op = less_or_equal;
1245 }
1246 else
1247 lval->op = less_than;
1248 result = CMPOP2;
1249 break;
1250
1251 case '>':
1252 if (exp[0] == '=')
1253 {
1254 ++exp;
1255 lval->op = greater_or_equal;
1256 }
1257 else
1258 lval->op = greater_than;
1259 result = CMPOP2;
1260 break;
1261
1262 case '*':
1263 lval->op = mult;
1264 result = MULOP2;
1265 break;
1266
1267 case '/':
1268 lval->op = divide;
1269 result = MULOP2;
1270 break;
1271
1272 case '%':
1273 lval->op = module;
1274 result = MULOP2;
1275 break;
1276
1277 case '+':
1278 lval->op = plus;
1279 result = ADDOP2;
1280 break;
1281
1282 case '-':
1283 lval->op = minus;
1284 result = ADDOP2;
1285 break;
1286
1287 case 'n':
1288 case '?':
1289 case ':':
1290 case '(':
1291 case ')':
1292 /* Nothing, just return the character. */
1293 break;
1294
1295 case ';':
1296 case '\n':
1297 case '\0':
1298 /* Be safe and let the user call this function again. */
1299 --exp;
1300 result = YYEOF;
1301 break;
1302
1303 default:
1304 result = YYERRCODE;
1305 #if YYDEBUG != 0
1306 --exp;
1307 #endif
1308 break;
1309 }
1310
1311 *pexp = exp;
1312
1313 return result;
1314 }
1315
1316
1317 static void
1318 yyerror (str)
1319 const char *str;
1320 {
1321 /* Do nothing. We don't print error messages here. */
1322 }

webmaster@eggheads.org
ViewVC Help
Powered by ViewVC 1.1.23