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