2313
|
1 /* A Bison parser, made from plural.y
|
|
2 by GNU bison 1.35. */
|
|
3
|
|
4 #define YYBISON 1 /* Identify Bison output. */
|
|
5
|
|
6 #define yyparse __gettextparse
|
|
7 #define yylex __gettextlex
|
|
8 #define yyerror __gettexterror
|
|
9 #define yylval __gettextlval
|
|
10 #define yychar __gettextchar
|
|
11 #define yydebug __gettextdebug
|
|
12 #define yynerrs __gettextnerrs
|
|
13 # define EQUOP2 257
|
|
14 # define CMPOP2 258
|
|
15 # define ADDOP2 259
|
|
16 # define MULOP2 260
|
|
17 # define NUMBER 261
|
|
18
|
|
19 #line 1 "plural.y"
|
|
20
|
|
21 /* Expression parsing for plural form selection.
|
|
22 Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
|
23 Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
|
|
24
|
|
25 This program is free software; you can redistribute it and/or modify it
|
|
26 under the terms of the GNU Library General Public License as published
|
|
27 by the Free Software Foundation; either version 2, or (at your option)
|
|
28 any later version.
|
|
29
|
|
30 This program is distributed in the hope that it will be useful,
|
|
31 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
33 Library General Public License for more details.
|
|
34
|
|
35 You should have received a copy of the GNU Library General Public
|
|
36 License along with this program; if not, write to the Free Software
|
|
37 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
38 USA. */
|
|
39
|
|
40 /* The bison generated parser uses alloca. AIX 3 forces us to put this
|
|
41 declaration at the beginning of the file. The declaration in bison's
|
|
42 skeleton file comes too late. This must come before <config.h>
|
|
43 because <config.h> may include arbitrary system headers. */
|
|
44 #if defined _AIX && !defined __GNUC__
|
|
45 #pragma alloca
|
|
46 #endif
|
|
47
|
|
48 #ifdef HAVE_CONFIG_H
|
|
49 # include <config.h>
|
|
50 #endif
|
|
51
|
|
52 #include <stddef.h>
|
|
53 #include <stdlib.h>
|
|
54 #include "plural-exp.h"
|
|
55
|
|
56 /* The main function generated by the parser is called __gettextparse,
|
|
57 but we want it to be called PLURAL_PARSE. */
|
|
58 #ifndef _LIBC
|
|
59 # define __gettextparse PLURAL_PARSE
|
|
60 #endif
|
|
61
|
|
62 #define YYLEX_PARAM &((struct parse_args *) arg)->cp
|
|
63 #define YYPARSE_PARAM arg
|
|
64
|
|
65 #line 49 "plural.y"
|
|
66 #ifndef YYSTYPE
|
|
67 typedef union {
|
|
68 unsigned long int num;
|
|
69 enum operator op;
|
|
70 struct expression *exp;
|
|
71 } yystype;
|
|
72 # define YYSTYPE yystype
|
|
73 # define YYSTYPE_IS_TRIVIAL 1
|
|
74 #endif
|
|
75 #line 55 "plural.y"
|
|
76
|
|
77 /* Prototypes for local functions. */
|
|
78 static struct expression *new_exp PARAMS ((int nargs, enum operator op,
|
|
79 struct expression * const *args));
|
|
80 static inline struct expression *new_exp_0 PARAMS ((enum operator op));
|
|
81 static inline struct expression *new_exp_1 PARAMS ((enum operator op,
|
|
82 struct expression *right));
|
|
83 static struct expression *new_exp_2 PARAMS ((enum operator op,
|
|
84 struct expression *left,
|
|
85 struct expression *right));
|
|
86 static inline struct expression *new_exp_3 PARAMS ((enum operator op,
|
|
87 struct expression *bexp,
|
|
88 struct expression *tbranch,
|
|
89 struct expression *fbranch));
|
|
90 static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
|
|
91 static void yyerror PARAMS ((const char *str));
|
|
92
|
|
93 /* Allocation of expressions. */
|
|
94
|
|
95 static struct expression *
|
|
96 new_exp (nargs, op, args)
|
|
97 int nargs;
|
|
98 enum operator op;
|
|
99 struct expression * const *args;
|
|
100 {
|
|
101 int i;
|
|
102 struct expression *newp;
|
|
103
|
|
104 /* If any of the argument could not be malloc'ed, just return NULL. */
|
|
105 for (i = nargs - 1; i >= 0; i--)
|
|
106 if (args[i] == NULL)
|
|
107 goto fail;
|
|
108
|
|
109 /* Allocate a new expression. */
|
|
110 newp = (struct expression *) malloc (sizeof (*newp));
|
|
111 if (newp != NULL)
|
|
112 {
|
|
113 newp->nargs = nargs;
|
|
114 newp->operation = op;
|
|
115 for (i = nargs - 1; i >= 0; i--)
|
|
116 newp->val.args[i] = args[i];
|
|
117 return newp;
|
|
118 }
|
|
119
|
|
120 fail:
|
|
121 for (i = nargs - 1; i >= 0; i--)
|
|
122 FREE_EXPRESSION (args[i]);
|
|
123
|
|
124 return NULL;
|
|
125 }
|
|
126
|
|
127 static inline struct expression *
|
|
128 new_exp_0 (op)
|
|
129 enum operator op;
|
|
130 {
|
|
131 return new_exp (0, op, NULL);
|
|
132 }
|
|
133
|
|
134 static inline struct expression *
|
|
135 new_exp_1 (op, right)
|
|
136 enum operator op;
|
|
137 struct expression *right;
|
|
138 {
|
|
139 struct expression *args[1];
|
|
140
|
|
141 args[0] = right;
|
|
142 return new_exp (1, op, args);
|
|
143 }
|
|
144
|
|
145 static struct expression *
|
|
146 new_exp_2 (op, left, right)
|
|
147 enum operator op;
|
|
148 struct expression *left;
|
|
149 struct expression *right;
|
|
150 {
|
|
151 struct expression *args[2];
|
|
152
|
|
153 args[0] = left;
|
|
154 args[1] = right;
|
|
155 return new_exp (2, op, args);
|
|
156 }
|
|
157
|
|
158 static inline struct expression *
|
|
159 new_exp_3 (op, bexp, tbranch, fbranch)
|
|
160 enum operator op;
|
|
161 struct expression *bexp;
|
|
162 struct expression *tbranch;
|
|
163 struct expression *fbranch;
|
|
164 {
|
|
165 struct expression *args[3];
|
|
166
|
|
167 args[0] = bexp;
|
|
168 args[1] = tbranch;
|
|
169 args[2] = fbranch;
|
|
170 return new_exp (3, op, args);
|
|
171 }
|
|
172
|
|
173 #ifndef YYDEBUG
|
|
174 # define YYDEBUG 0
|
|
175 #endif
|
|
176
|
|
177
|
|
178
|
|
179 #define YYFINAL 27
|
|
180 #define YYFLAG -32768
|
|
181 #define YYNTBASE 16
|
|
182
|
|
183 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
|
|
184 #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
|
|
185
|
|
186 /* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
|
|
187 static const char yytranslate[] =
|
|
188 {
|
|
189 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
190 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
191 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
192 2, 2, 2, 10, 2, 2, 2, 2, 5, 2,
|
|
193 14, 15, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
194 2, 2, 2, 2, 2, 2, 2, 2, 12, 2,
|
|
195 2, 2, 2, 3, 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, 2,
|
|
198 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
199 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
200 13, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
201 2, 2, 2, 2, 4, 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, 2, 2, 2, 2, 2,
|
|
213 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
214 2, 2, 2, 2, 2, 2, 1, 6, 7, 8,
|
|
215 9, 11
|
|
216 };
|
|
217
|
|
218 #if YYDEBUG
|
|
219 static const short yyprhs[] =
|
|
220 {
|
|
221 0, 0, 2, 8, 12, 16, 20, 24, 28, 32,
|
|
222 35, 37, 39
|
|
223 };
|
|
224 static const short yyrhs[] =
|
|
225 {
|
|
226 17, 0, 17, 3, 17, 12, 17, 0, 17, 4,
|
|
227 17, 0, 17, 5, 17, 0, 17, 6, 17, 0,
|
|
228 17, 7, 17, 0, 17, 8, 17, 0, 17, 9,
|
|
229 17, 0, 10, 17, 0, 13, 0, 11, 0, 14,
|
|
230 17, 15, 0
|
|
231 };
|
|
232
|
|
233 #endif
|
|
234
|
|
235 #if YYDEBUG
|
|
236 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
|
237 static const short yyrline[] =
|
|
238 {
|
|
239 0, 174, 182, 186, 190, 194, 198, 202, 206, 210,
|
|
240 214, 218, 223
|
|
241 };
|
|
242 #endif
|
|
243
|
|
244
|
|
245 #if (YYDEBUG) || defined YYERROR_VERBOSE
|
|
246
|
|
247 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
|
|
248 static const char *const yytname[] =
|
|
249 {
|
|
250 "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2",
|
|
251 "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'",
|
|
252 "start", "exp", 0
|
|
253 };
|
|
254 #endif
|
|
255
|
|
256 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
|
|
257 static const short yyr1[] =
|
|
258 {
|
|
259 0, 16, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
260 17, 17, 17
|
|
261 };
|
|
262
|
|
263 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
|
|
264 static const short yyr2[] =
|
|
265 {
|
|
266 0, 1, 5, 3, 3, 3, 3, 3, 3, 2,
|
|
267 1, 1, 3
|
|
268 };
|
|
269
|
|
270 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
|
|
271 doesn't specify something else to do. Zero means the default is an
|
|
272 error. */
|
|
273 static const short yydefact[] =
|
|
274 {
|
|
275 0, 0, 11, 10, 0, 1, 9, 0, 0, 0,
|
|
276 0, 0, 0, 0, 0, 12, 0, 3, 4, 5,
|
|
277 6, 7, 8, 0, 2, 0, 0, 0
|
|
278 };
|
|
279
|
|
280 static const short yydefgoto[] =
|
|
281 {
|
|
282 25, 5
|
|
283 };
|
|
284
|
|
285 static const short yypact[] =
|
|
286 {
|
|
287 -9, -9,-32768,-32768, -9, 34,-32768, 11, -9, -9,
|
|
288 -9, -9, -9, -9, -9,-32768, 24, 39, 43, 16,
|
|
289 26, -3,-32768, -9, 34, 21, 53,-32768
|
|
290 };
|
|
291
|
|
292 static const short yypgoto[] =
|
|
293 {
|
|
294 -32768, -1
|
|
295 };
|
|
296
|
|
297
|
|
298 #define YYLAST 53
|
|
299
|
|
300
|
|
301 static const short yytable[] =
|
|
302 {
|
|
303 6, 1, 2, 7, 3, 4, 14, 16, 17, 18,
|
|
304 19, 20, 21, 22, 8, 9, 10, 11, 12, 13,
|
|
305 14, 26, 24, 12, 13, 14, 15, 8, 9, 10,
|
|
306 11, 12, 13, 14, 13, 14, 23, 8, 9, 10,
|
|
307 11, 12, 13, 14, 10, 11, 12, 13, 14, 11,
|
|
308 12, 13, 14, 27
|
|
309 };
|
|
310
|
|
311 static const short yycheck[] =
|
|
312 {
|
|
313 1, 10, 11, 4, 13, 14, 9, 8, 9, 10,
|
|
314 11, 12, 13, 14, 3, 4, 5, 6, 7, 8,
|
|
315 9, 0, 23, 7, 8, 9, 15, 3, 4, 5,
|
|
316 6, 7, 8, 9, 8, 9, 12, 3, 4, 5,
|
|
317 6, 7, 8, 9, 5, 6, 7, 8, 9, 6,
|
|
318 7, 8, 9, 0
|
|
319 };
|
|
320 #define YYPURE 1
|
|
321
|
|
322 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
|
323 #line 3 "/usr/local/share/bison/bison.simple"
|
|
324
|
|
325 /* Skeleton output parser for bison,
|
|
326
|
|
327 Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
|
|
328 Foundation, Inc.
|
|
329
|
|
330 This program is free software; you can redistribute it and/or modify
|
|
331 it under the terms of the GNU General Public License as published by
|
|
332 the Free Software Foundation; either version 2, or (at your option)
|
|
333 any later version.
|
|
334
|
|
335 This program is distributed in the hope that it will be useful,
|
|
336 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
337 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
338 GNU General Public License for more details.
|
|
339
|
|
340 You should have received a copy of the GNU General Public License
|
|
341 along with this program; if not, write to the Free Software
|
|
342 Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
343 Boston, MA 02110-1301, USA. */
|
|
344
|
|
345 /* As a special exception, when this file is copied by Bison into a
|
|
346 Bison output file, you may use that output file without restriction.
|
|
347 This special exception was added by the Free Software Foundation
|
|
348 in version 1.24 of Bison. */
|
|
349
|
|
350 /* This is the parser code that is written into each bison parser when
|
|
351 the %semantic_parser declaration is not specified in the grammar.
|
|
352 It was written by Richard Stallman by simplifying the hairy parser
|
|
353 used when %semantic_parser is specified. */
|
|
354
|
|
355 /* All symbols defined below should begin with yy or YY, to avoid
|
|
356 infringing on user name space. This should be done even for local
|
|
357 variables, as they might otherwise be expanded by user macros.
|
|
358 There are some unavoidable exceptions within include files to
|
|
359 define necessary library symbols; they are noted "INFRINGES ON
|
|
360 USER NAME SPACE" below. */
|
|
361
|
|
362 #if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
|
|
363
|
|
364 /* The parser invokes alloca or malloc; define the necessary symbols. */
|
|
365
|
|
366 # if YYSTACK_USE_ALLOCA
|
|
367 # define YYSTACK_ALLOC alloca
|
|
368 # else
|
|
369 # ifndef YYSTACK_USE_ALLOCA
|
|
370 # if defined (alloca) || defined (_ALLOCA_H)
|
|
371 # define YYSTACK_ALLOC alloca
|
|
372 # else
|
|
373 # ifdef __GNUC__
|
|
374 # define YYSTACK_ALLOC __builtin_alloca
|
|
375 # endif
|
|
376 # endif
|
|
377 # endif
|
|
378 # endif
|
|
379
|
|
380 # ifdef YYSTACK_ALLOC
|
|
381 /* Pacify GCC's `empty if-body' warning. */
|
|
382 # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
|
|
383 # else
|
|
384 # if defined (__STDC__) || defined (__cplusplus)
|
|
385 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
|
|
386 # define YYSIZE_T size_t
|
|
387 # endif
|
|
388 # define YYSTACK_ALLOC malloc
|
|
389 # define YYSTACK_FREE free
|
|
390 # endif
|
|
391 #endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
|
|
392
|
|
393
|
|
394 #if (! defined (yyoverflow) \
|
|
395 && (! defined (__cplusplus) \
|
|
396 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
|
|
397
|
|
398 /* A type that is properly aligned for any stack member. */
|
|
399 union yyalloc
|
|
400 {
|
|
401 short yyss;
|
|
402 YYSTYPE yyvs;
|
|
403 # if YYLSP_NEEDED
|
|
404 YYLTYPE yyls;
|
|
405 # endif
|
|
406 };
|
|
407
|
|
408 /* The size of the maximum gap between one aligned stack and the next. */
|
|
409 # define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
|
|
410
|
|
411 /* The size of an array large to enough to hold all stacks, each with
|
|
412 N elements. */
|
|
413 # if YYLSP_NEEDED
|
|
414 # define YYSTACK_BYTES(N) \
|
|
415 ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
|
|
416 + 2 * YYSTACK_GAP_MAX)
|
|
417 # else
|
|
418 # define YYSTACK_BYTES(N) \
|
|
419 ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
|
|
420 + YYSTACK_GAP_MAX)
|
|
421 # endif
|
|
422
|
|
423 /* Copy COUNT objects from FROM to TO. The source and destination do
|
|
424 not overlap. */
|
|
425 # ifndef YYCOPY
|
|
426 # if 1 < __GNUC__
|
|
427 # define YYCOPY(To, From, Count) \
|
|
428 __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
|
|
429 # else
|
|
430 # define YYCOPY(To, From, Count) \
|
|
431 do \
|
|
432 { \
|
|
433 register YYSIZE_T yyi; \
|
|
434 for (yyi = 0; yyi < (Count); yyi++) \
|
|
435 (To)[yyi] = (From)[yyi]; \
|
|
436 } \
|
|
437 while (0)
|
|
438 # endif
|
|
439 # endif
|
|
440
|
|
441 /* Relocate STACK from its old location to the new one. The
|
|
442 local variables YYSIZE and YYSTACKSIZE give the old and new number of
|
|
443 elements in the stack, and YYPTR gives the new location of the
|
|
444 stack. Advance YYPTR to a properly aligned location for the next
|
|
445 stack. */
|
|
446 # define YYSTACK_RELOCATE(Stack) \
|
|
447 do \
|
|
448 { \
|
|
449 YYSIZE_T yynewbytes; \
|
|
450 YYCOPY (&yyptr->Stack, Stack, yysize); \
|
|
451 Stack = &yyptr->Stack; \
|
|
452 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
|
|
453 yyptr += yynewbytes / sizeof (*yyptr); \
|
|
454 } \
|
|
455 while (0)
|
|
456
|
|
457 #endif
|
|
458
|
|
459
|
|
460 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
|
|
461 # define YYSIZE_T __SIZE_TYPE__
|
|
462 #endif
|
|
463 #if ! defined (YYSIZE_T) && defined (size_t)
|
|
464 # define YYSIZE_T size_t
|
|
465 #endif
|
|
466 #if ! defined (YYSIZE_T)
|
|
467 # if defined (__STDC__) || defined (__cplusplus)
|
|
468 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
|
|
469 # define YYSIZE_T size_t
|
|
470 # endif
|
|
471 #endif
|
|
472 #if ! defined (YYSIZE_T)
|
|
473 # define YYSIZE_T unsigned int
|
|
474 #endif
|
|
475
|
|
476 #define yyerrok (yyerrstatus = 0)
|
|
477 #define yyclearin (yychar = YYEMPTY)
|
|
478 #define YYEMPTY -2
|
|
479 #define YYEOF 0
|
|
480 #define YYACCEPT goto yyacceptlab
|
|
481 #define YYABORT goto yyabortlab
|
|
482 #define YYERROR goto yyerrlab1
|
|
483 /* Like YYERROR except do call yyerror. This remains here temporarily
|
|
484 to ease the transition to the new meaning of YYERROR, for GCC.
|
|
485 Once GCC version 2 has supplanted version 1, this can go. */
|
|
486 #define YYFAIL goto yyerrlab
|
|
487 #define YYRECOVERING() (!!yyerrstatus)
|
|
488 #define YYBACKUP(Token, Value) \
|
|
489 do \
|
|
490 if (yychar == YYEMPTY && yylen == 1) \
|
|
491 { \
|
|
492 yychar = (Token); \
|
|
493 yylval = (Value); \
|
|
494 yychar1 = YYTRANSLATE (yychar); \
|
|
495 YYPOPSTACK; \
|
|
496 goto yybackup; \
|
|
497 } \
|
|
498 else \
|
|
499 { \
|
|
500 yyerror ("syntax error: cannot back up"); \
|
|
501 YYERROR; \
|
|
502 } \
|
|
503 while (0)
|
|
504
|
|
505 #define YYTERROR 1
|
|
506 #define YYERRCODE 256
|
|
507
|
|
508
|
|
509 /* YYLLOC_DEFAULT -- Compute the default location (before the actions
|
|
510 are run).
|
|
511
|
|
512 When YYLLOC_DEFAULT is run, CURRENT is set the location of the
|
|
513 first token. By default, to implement support for ranges, extend
|
|
514 its range to the last symbol. */
|
|
515
|
|
516 #ifndef YYLLOC_DEFAULT
|
|
517 # define YYLLOC_DEFAULT(Current, Rhs, N) \
|
|
518 Current.last_line = Rhs[N].last_line; \
|
|
519 Current.last_column = Rhs[N].last_column;
|
|
520 #endif
|
|
521
|
|
522
|
|
523 /* YYLEX -- calling `yylex' with the right arguments. */
|
|
524
|
|
525 #if YYPURE
|
|
526 # if YYLSP_NEEDED
|
|
527 # ifdef YYLEX_PARAM
|
|
528 # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
|
|
529 # else
|
|
530 # define YYLEX yylex (&yylval, &yylloc)
|
|
531 # endif
|
|
532 # else /* !YYLSP_NEEDED */
|
|
533 # ifdef YYLEX_PARAM
|
|
534 # define YYLEX yylex (&yylval, YYLEX_PARAM)
|
|
535 # else
|
|
536 # define YYLEX yylex (&yylval)
|
|
537 # endif
|
|
538 # endif /* !YYLSP_NEEDED */
|
|
539 #else /* !YYPURE */
|
|
540 # define YYLEX yylex ()
|
|
541 #endif /* !YYPURE */
|
|
542
|
|
543
|
|
544 /* Enable debugging if requested. */
|
|
545 #if YYDEBUG
|
|
546
|
|
547 # ifndef YYFPRINTF
|
|
548 # include <stdio.h> /* INFRINGES ON USER NAME SPACE */
|
|
549 # define YYFPRINTF fprintf
|
|
550 # endif
|
|
551
|
|
552 # define YYDPRINTF(Args) \
|
|
553 do { \
|
|
554 if (yydebug) \
|
|
555 YYFPRINTF Args; \
|
|
556 } while (0)
|
|
557 /* Nonzero means print parse trace. It is left uninitialized so that
|
|
558 multiple parsers can coexist. */
|
|
559 int yydebug;
|
|
560 #else /* !YYDEBUG */
|
|
561 # define YYDPRINTF(Args)
|
|
562 #endif /* !YYDEBUG */
|
|
563
|
|
564 /* YYINITDEPTH -- initial size of the parser's stacks. */
|
|
565 #ifndef YYINITDEPTH
|
|
566 # define YYINITDEPTH 200
|
|
567 #endif
|
|
568
|
|
569 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
|
|
570 if the built-in stack extension method is used).
|
|
571
|
|
572 Do not make this value too large; the results are undefined if
|
|
573 SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
|
|
574 evaluated with infinite-precision integer arithmetic. */
|
|
575
|
|
576 #if YYMAXDEPTH == 0
|
|
577 # undef YYMAXDEPTH
|
|
578 #endif
|
|
579
|
|
580 #ifndef YYMAXDEPTH
|
|
581 # define YYMAXDEPTH 10000
|
|
582 #endif
|
|
583
|
|
584 #ifdef YYERROR_VERBOSE
|
|
585
|
|
586 # ifndef yystrlen
|
|
587 # if defined (__GLIBC__) && defined (_STRING_H)
|
|
588 # define yystrlen strlen
|
|
589 # else
|
|
590 /* Return the length of YYSTR. */
|
|
591 static YYSIZE_T
|
|
592 # if defined (__STDC__) || defined (__cplusplus)
|
|
593 yystrlen (const char *yystr)
|
|
594 # else
|
|
595 yystrlen (yystr)
|
|
596 const char *yystr;
|
|
597 # endif
|
|
598 {
|
|
599 register const char *yys = yystr;
|
|
600
|
|
601 while (*yys++ != '\0')
|
|
602 continue;
|
|
603
|
|
604 return yys - yystr - 1;
|
|
605 }
|
|
606 # endif
|
|
607 # endif
|
|
608
|
|
609 # ifndef yystpcpy
|
|
610 # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
|
|
611 # define yystpcpy stpcpy
|
|
612 # else
|
|
613 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
|
|
614 YYDEST. */
|
|
615 static char *
|
|
616 # if defined (__STDC__) || defined (__cplusplus)
|
|
617 yystpcpy (char *yydest, const char *yysrc)
|
|
618 # else
|
|
619 yystpcpy (yydest, yysrc)
|
|
620 char *yydest;
|
|
621 const char *yysrc;
|
|
622 # endif
|
|
623 {
|
|
624 register char *yyd = yydest;
|
|
625 register const char *yys = yysrc;
|
|
626
|
|
627 while ((*yyd++ = *yys++) != '\0')
|
|
628 continue;
|
|
629
|
|
630 return yyd - 1;
|
|
631 }
|
|
632 # endif
|
|
633 # endif
|
|
634 #endif
|
|
635
|
|
636 #line 315 "/usr/local/share/bison/bison.simple"
|
|
637
|
|
638
|
|
639 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
|
640 into yyparse. The argument should have type void *.
|
|
641 It should actually point to an object.
|
|
642 Grammar actions can access the variable by casting it
|
|
643 to the proper pointer type. */
|
|
644
|
|
645 #ifdef YYPARSE_PARAM
|
|
646 # if defined (__STDC__) || defined (__cplusplus)
|
|
647 # define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
|
|
648 # define YYPARSE_PARAM_DECL
|
|
649 # else
|
|
650 # define YYPARSE_PARAM_ARG YYPARSE_PARAM
|
|
651 # define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
|
|
652 # endif
|
|
653 #else /* !YYPARSE_PARAM */
|
|
654 # define YYPARSE_PARAM_ARG
|
|
655 # define YYPARSE_PARAM_DECL
|
|
656 #endif /* !YYPARSE_PARAM */
|
|
657
|
|
658 /* Prevent warning if -Wstrict-prototypes. */
|
|
659 #ifdef __GNUC__
|
|
660 # ifdef YYPARSE_PARAM
|
|
661 int yyparse (void *);
|
|
662 # else
|
|
663 int yyparse (void);
|
|
664 # endif
|
|
665 #endif
|
|
666
|
|
667 /* YY_DECL_VARIABLES -- depending whether we use a pure parser,
|
|
668 variables are global, or local to YYPARSE. */
|
|
669
|
|
670 #define YY_DECL_NON_LSP_VARIABLES \
|
|
671 /* The lookahead symbol. */ \
|
|
672 int yychar; \
|
|
673 \
|
|
674 /* The semantic value of the lookahead symbol. */ \
|
|
675 YYSTYPE yylval; \
|
|
676 \
|
|
677 /* Number of parse errors so far. */ \
|
|
678 int yynerrs;
|
|
679
|
|
680 #if YYLSP_NEEDED
|
|
681 # define YY_DECL_VARIABLES \
|
|
682 YY_DECL_NON_LSP_VARIABLES \
|
|
683 \
|
|
684 /* Location data for the lookahead symbol. */ \
|
|
685 YYLTYPE yylloc;
|
|
686 #else
|
|
687 # define YY_DECL_VARIABLES \
|
|
688 YY_DECL_NON_LSP_VARIABLES
|
|
689 #endif
|
|
690
|
|
691
|
|
692 /* If nonreentrant, generate the variables here. */
|
|
693
|
|
694 #if !YYPURE
|
|
695 YY_DECL_VARIABLES
|
|
696 #endif /* !YYPURE */
|
|
697
|
|
698 int
|
|
699 yyparse (YYPARSE_PARAM_ARG)
|
|
700 YYPARSE_PARAM_DECL
|
|
701 {
|
|
702 /* If reentrant, generate the variables here. */
|
|
703 #if YYPURE
|
|
704 YY_DECL_VARIABLES
|
|
705 #endif /* !YYPURE */
|
|
706
|
|
707 register int yystate;
|
|
708 register int yyn;
|
|
709 int yyresult;
|
|
710 /* Number of tokens to shift before error messages enabled. */
|
|
711 int yyerrstatus;
|
|
712 /* Lookahead token as an internal (translated) token number. */
|
|
713 int yychar1 = 0;
|
|
714
|
|
715 /* Three stacks and their tools:
|
|
716 `yyss': related to states,
|
|
717 `yyvs': related to semantic values,
|
|
718 `yyls': related to locations.
|
|
719
|
|
720 Refer to the stacks thru separate pointers, to allow yyoverflow
|
|
721 to reallocate them elsewhere. */
|
|
722
|
|
723 /* The state stack. */
|
|
724 short yyssa[YYINITDEPTH];
|
|
725 short *yyss = yyssa;
|
|
726 register short *yyssp;
|
|
727
|
|
728 /* The semantic value stack. */
|
|
729 YYSTYPE yyvsa[YYINITDEPTH];
|
|
730 YYSTYPE *yyvs = yyvsa;
|
|
731 register YYSTYPE *yyvsp;
|
|
732
|
|
733 #if YYLSP_NEEDED
|
|
734 /* The location stack. */
|
|
735 YYLTYPE yylsa[YYINITDEPTH];
|
|
736 YYLTYPE *yyls = yylsa;
|
|
737 YYLTYPE *yylsp;
|
|
738 #endif
|
|
739
|
|
740 #if YYLSP_NEEDED
|
|
741 # define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
|
|
742 #else
|
|
743 # define YYPOPSTACK (yyvsp--, yyssp--)
|
|
744 #endif
|
|
745
|
|
746 YYSIZE_T yystacksize = YYINITDEPTH;
|
|
747
|
|
748
|
|
749 /* The variables used to return semantic value and location from the
|
|
750 action routines. */
|
|
751 YYSTYPE yyval;
|
|
752 #if YYLSP_NEEDED
|
|
753 YYLTYPE yyloc;
|
|
754 #endif
|
|
755
|
|
756 /* When reducing, the number of symbols on the RHS of the reduced
|
|
757 rule. */
|
|
758 int yylen;
|
|
759
|
|
760 YYDPRINTF ((stderr, "Starting parse\n"));
|
|
761
|
|
762 yystate = 0;
|
|
763 yyerrstatus = 0;
|
|
764 yynerrs = 0;
|
|
765 yychar = YYEMPTY; /* Cause a token to be read. */
|
|
766
|
|
767 /* Initialize stack pointers.
|
|
768 Waste one element of value and location stack
|
|
769 so that they stay on the same level as the state stack.
|
|
770 The wasted elements are never initialized. */
|
|
771
|
|
772 yyssp = yyss;
|
|
773 yyvsp = yyvs;
|
|
774 #if YYLSP_NEEDED
|
|
775 yylsp = yyls;
|
|
776 #endif
|
|
777 goto yysetstate;
|
|
778
|
|
779 /*------------------------------------------------------------.
|
|
780 | yynewstate -- Push a new state, which is found in yystate. |
|
|
781 `------------------------------------------------------------*/
|
|
782 yynewstate:
|
|
783 /* In all cases, when you get here, the value and location stacks
|
|
784 have just been pushed. so pushing a state here evens the stacks.
|
|
785 */
|
|
786 yyssp++;
|
|
787
|
|
788 yysetstate:
|
|
789 *yyssp = yystate;
|
|
790
|
|
791 if (yyssp >= yyss + yystacksize - 1)
|
|
792 {
|
|
793 /* Get the current used size of the three stacks, in elements. */
|
|
794 YYSIZE_T yysize = yyssp - yyss + 1;
|
|
795
|
|
796 #ifdef yyoverflow
|
|
797 {
|
|
798 /* Give user a chance to reallocate the stack. Use copies of
|
|
799 these so that the &'s don't force the real ones into
|
|
800 memory. */
|
|
801 YYSTYPE *yyvs1 = yyvs;
|
|
802 short *yyss1 = yyss;
|
|
803
|
|
804 /* Each stack pointer address is followed by the size of the
|
|
805 data in use in that stack, in bytes. */
|
|
806 # if YYLSP_NEEDED
|
|
807 YYLTYPE *yyls1 = yyls;
|
|
808 /* This used to be a conditional around just the two extra args,
|
|
809 but that might be undefined if yyoverflow is a macro. */
|
|
810 yyoverflow ("parser stack overflow",
|
|
811 &yyss1, yysize * sizeof (*yyssp),
|
|
812 &yyvs1, yysize * sizeof (*yyvsp),
|
|
813 &yyls1, yysize * sizeof (*yylsp),
|
|
814 &yystacksize);
|
|
815 yyls = yyls1;
|
|
816 # else
|
|
817 yyoverflow ("parser stack overflow",
|
|
818 &yyss1, yysize * sizeof (*yyssp),
|
|
819 &yyvs1, yysize * sizeof (*yyvsp),
|
|
820 &yystacksize);
|
|
821 # endif
|
|
822 yyss = yyss1;
|
|
823 yyvs = yyvs1;
|
|
824 }
|
|
825 #else /* no yyoverflow */
|
|
826 # ifndef YYSTACK_RELOCATE
|
|
827 goto yyoverflowlab;
|
|
828 # else
|
|
829 /* Extend the stack our own way. */
|
|
830 if (yystacksize >= YYMAXDEPTH)
|
|
831 goto yyoverflowlab;
|
|
832 yystacksize *= 2;
|
|
833 if (yystacksize > YYMAXDEPTH)
|
|
834 yystacksize = YYMAXDEPTH;
|
|
835
|
|
836 {
|
|
837 short *yyss1 = yyss;
|
|
838 union yyalloc *yyptr =
|
|
839 (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
|
840 if (! yyptr)
|
|
841 goto yyoverflowlab;
|
|
842 YYSTACK_RELOCATE (yyss);
|
|
843 YYSTACK_RELOCATE (yyvs);
|
|
844 # if YYLSP_NEEDED
|
|
845 YYSTACK_RELOCATE (yyls);
|
|
846 # endif
|
|
847 # undef YYSTACK_RELOCATE
|
|
848 if (yyss1 != yyssa)
|
|
849 YYSTACK_FREE (yyss1);
|
|
850 }
|
|
851 # endif
|
|
852 #endif /* no yyoverflow */
|
|
853
|
|
854 yyssp = yyss + yysize - 1;
|
|
855 yyvsp = yyvs + yysize - 1;
|
|
856 #if YYLSP_NEEDED
|
|
857 yylsp = yyls + yysize - 1;
|
|
858 #endif
|
|
859
|
|
860 YYDPRINTF ((stderr, "Stack size increased to %lu\n",
|
|
861 (unsigned long int) yystacksize));
|
|
862
|
|
863 if (yyssp >= yyss + yystacksize - 1)
|
|
864 YYABORT;
|
|
865 }
|
|
866
|
|
867 YYDPRINTF ((stderr, "Entering state %d\n", yystate));
|
|
868
|
|
869 goto yybackup;
|
|
870
|
|
871
|
|
872 /*-----------.
|
|
873 | yybackup. |
|
|
874 `-----------*/
|
|
875 yybackup:
|
|
876
|
|
877 /* Do appropriate processing given the current state. */
|
|
878 /* Read a lookahead token if we need one and don't already have one. */
|
|
879 /* yyresume: */
|
|
880
|
|
881 /* First try to decide what to do without reference to lookahead token. */
|
|
882
|
|
883 yyn = yypact[yystate];
|
|
884 if (yyn == YYFLAG)
|
|
885 goto yydefault;
|
|
886
|
|
887 /* Not known => get a lookahead token if don't already have one. */
|
|
888
|
|
889 /* yychar is either YYEMPTY or YYEOF
|
|
890 or a valid token in external form. */
|
|
891
|
|
892 if (yychar == YYEMPTY)
|
|
893 {
|
|
894 YYDPRINTF ((stderr, "Reading a token: "));
|
|
895 yychar = YYLEX;
|
|
896 }
|
|
897
|
|
898 /* Convert token to internal form (in yychar1) for indexing tables with */
|
|
899
|
|
900 if (yychar <= 0) /* This means end of input. */
|
|
901 {
|
|
902 yychar1 = 0;
|
|
903 yychar = YYEOF; /* Don't call YYLEX any more */
|
|
904
|
|
905 YYDPRINTF ((stderr, "Now at end of input.\n"));
|
|
906 }
|
|
907 else
|
|
908 {
|
|
909 yychar1 = YYTRANSLATE (yychar);
|
|
910
|
|
911 #if YYDEBUG
|
|
912 /* We have to keep this `#if YYDEBUG', since we use variables
|
|
913 which are defined only if `YYDEBUG' is set. */
|
|
914 if (yydebug)
|
|
915 {
|
|
916 YYFPRINTF (stderr, "Next token is %d (%s",
|
|
917 yychar, yytname[yychar1]);
|
|
918 /* Give the individual parser a way to print the precise
|
|
919 meaning of a token, for further debugging info. */
|
|
920 # ifdef YYPRINT
|
|
921 YYPRINT (stderr, yychar, yylval);
|
|
922 # endif
|
|
923 YYFPRINTF (stderr, ")\n");
|
|
924 }
|
|
925 #endif
|
|
926 }
|
|
927
|
|
928 yyn += yychar1;
|
|
929 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
|
|
930 goto yydefault;
|
|
931
|
|
932 yyn = yytable[yyn];
|
|
933
|
|
934 /* yyn is what to do for this token type in this state.
|
|
935 Negative => reduce, -yyn is rule number.
|
|
936 Positive => shift, yyn is new state.
|
|
937 New state is final state => don't bother to shift,
|
|
938 just return success.
|
|
939 0, or most negative number => error. */
|
|
940
|
|
941 if (yyn < 0)
|
|
942 {
|
|
943 if (yyn == YYFLAG)
|
|
944 goto yyerrlab;
|
|
945 yyn = -yyn;
|
|
946 goto yyreduce;
|
|
947 }
|
|
948 else if (yyn == 0)
|
|
949 goto yyerrlab;
|
|
950
|
|
951 if (yyn == YYFINAL)
|
|
952 YYACCEPT;
|
|
953
|
|
954 /* Shift the lookahead token. */
|
|
955 YYDPRINTF ((stderr, "Shifting token %d (%s), ",
|
|
956 yychar, yytname[yychar1]));
|
|
957
|
|
958 /* Discard the token being shifted unless it is eof. */
|
|
959 if (yychar != YYEOF)
|
|
960 yychar = YYEMPTY;
|
|
961
|
|
962 *++yyvsp = yylval;
|
|
963 #if YYLSP_NEEDED
|
|
964 *++yylsp = yylloc;
|
|
965 #endif
|
|
966
|
|
967 /* Count tokens shifted since error; after three, turn off error
|
|
968 status. */
|
|
969 if (yyerrstatus)
|
|
970 yyerrstatus--;
|
|
971
|
|
972 yystate = yyn;
|
|
973 goto yynewstate;
|
|
974
|
|
975
|
|
976 /*-----------------------------------------------------------.
|
|
977 | yydefault -- do the default action for the current state. |
|
|
978 `-----------------------------------------------------------*/
|
|
979 yydefault:
|
|
980 yyn = yydefact[yystate];
|
|
981 if (yyn == 0)
|
|
982 goto yyerrlab;
|
|
983 goto yyreduce;
|
|
984
|
|
985
|
|
986 /*-----------------------------.
|
|
987 | yyreduce -- Do a reduction. |
|
|
988 `-----------------------------*/
|
|
989 yyreduce:
|
|
990 /* yyn is the number of a rule to reduce with. */
|
|
991 yylen = yyr2[yyn];
|
|
992
|
|
993 /* If YYLEN is nonzero, implement the default value of the action:
|
|
994 `$$ = $1'.
|
|
995
|
|
996 Otherwise, the following line sets YYVAL to the semantic value of
|
|
997 the lookahead token. This behavior is undocumented and Bison
|
|
998 users should not rely upon it. Assigning to YYVAL
|
|
999 unconditionally makes the parser a bit smaller, and it avoids a
|
|
1000 GCC warning that YYVAL may be used uninitialized. */
|
|
1001 yyval = yyvsp[1-yylen];
|
|
1002
|
|
1003 #if YYLSP_NEEDED
|
|
1004 /* Similarly for the default location. Let the user run additional
|
|
1005 commands if for instance locations are ranges. */
|
|
1006 yyloc = yylsp[1-yylen];
|
|
1007 YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
|
|
1008 #endif
|
|
1009
|
|
1010 #if YYDEBUG
|
|
1011 /* We have to keep this `#if YYDEBUG', since we use variables which
|
|
1012 are defined only if `YYDEBUG' is set. */
|
|
1013 if (yydebug)
|
|
1014 {
|
|
1015 int yyi;
|
|
1016
|
|
1017 YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
|
|
1018 yyn, yyrline[yyn]);
|
|
1019
|
|
1020 /* Print the symbols being reduced, and their result. */
|
|
1021 for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
|
|
1022 YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
|
|
1023 YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
|
|
1024 }
|
|
1025 #endif
|
|
1026
|
|
1027 switch (yyn) {
|
|
1028
|
|
1029 case 1:
|
|
1030 #line 175 "plural.y"
|
|
1031 {
|
|
1032 if (yyvsp[0].exp == NULL)
|
|
1033 YYABORT;
|
|
1034 ((struct parse_args *) arg)->res = yyvsp[0].exp;
|
|
1035 }
|
|
1036 break;
|
|
1037 case 2:
|
|
1038 #line 183 "plural.y"
|
|
1039 {
|
|
1040 yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1041 }
|
|
1042 break;
|
|
1043 case 3:
|
|
1044 #line 187 "plural.y"
|
|
1045 {
|
|
1046 yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1047 }
|
|
1048 break;
|
|
1049 case 4:
|
|
1050 #line 191 "plural.y"
|
|
1051 {
|
|
1052 yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1053 }
|
|
1054 break;
|
|
1055 case 5:
|
|
1056 #line 195 "plural.y"
|
|
1057 {
|
|
1058 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1059 }
|
|
1060 break;
|
|
1061 case 6:
|
|
1062 #line 199 "plural.y"
|
|
1063 {
|
|
1064 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1065 }
|
|
1066 break;
|
|
1067 case 7:
|
|
1068 #line 203 "plural.y"
|
|
1069 {
|
|
1070 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1071 }
|
|
1072 break;
|
|
1073 case 8:
|
|
1074 #line 207 "plural.y"
|
|
1075 {
|
|
1076 yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
|
|
1077 }
|
|
1078 break;
|
|
1079 case 9:
|
|
1080 #line 211 "plural.y"
|
|
1081 {
|
|
1082 yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
|
|
1083 }
|
|
1084 break;
|
|
1085 case 10:
|
|
1086 #line 215 "plural.y"
|
|
1087 {
|
|
1088 yyval.exp = new_exp_0 (var);
|
|
1089 }
|
|
1090 break;
|
|
1091 case 11:
|
|
1092 #line 219 "plural.y"
|
|
1093 {
|
|
1094 if ((yyval.exp = new_exp_0 (num)) != NULL)
|
|
1095 yyval.exp->val.num = yyvsp[0].num;
|
|
1096 }
|
|
1097 break;
|
|
1098 case 12:
|
|
1099 #line 224 "plural.y"
|
|
1100 {
|
|
1101 yyval.exp = yyvsp[-1].exp;
|
|
1102 }
|
|
1103 break;
|
|
1104 }
|
|
1105
|
|
1106 #line 705 "/usr/local/share/bison/bison.simple"
|
|
1107
|
|
1108
|
|
1109 yyvsp -= yylen;
|
|
1110 yyssp -= yylen;
|
|
1111 #if YYLSP_NEEDED
|
|
1112 yylsp -= yylen;
|
|
1113 #endif
|
|
1114
|
|
1115 #if YYDEBUG
|
|
1116 if (yydebug)
|
|
1117 {
|
|
1118 short *yyssp1 = yyss - 1;
|
|
1119 YYFPRINTF (stderr, "state stack now");
|
|
1120 while (yyssp1 != yyssp)
|
|
1121 YYFPRINTF (stderr, " %d", *++yyssp1);
|
|
1122 YYFPRINTF (stderr, "\n");
|
|
1123 }
|
|
1124 #endif
|
|
1125
|
|
1126 *++yyvsp = yyval;
|
|
1127 #if YYLSP_NEEDED
|
|
1128 *++yylsp = yyloc;
|
|
1129 #endif
|
|
1130
|
|
1131 /* Now `shift' the result of the reduction. Determine what state
|
|
1132 that goes to, based on the state we popped back to and the rule
|
|
1133 number reduced by. */
|
|
1134
|
|
1135 yyn = yyr1[yyn];
|
|
1136
|
|
1137 yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
|
|
1138 if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
|
|
1139 yystate = yytable[yystate];
|
|
1140 else
|
|
1141 yystate = yydefgoto[yyn - YYNTBASE];
|
|
1142
|
|
1143 goto yynewstate;
|
|
1144
|
|
1145
|
|
1146 /*------------------------------------.
|
|
1147 | yyerrlab -- here on detecting error |
|
|
1148 `------------------------------------*/
|
|
1149 yyerrlab:
|
|
1150 /* If not already recovering from an error, report this error. */
|
|
1151 if (!yyerrstatus)
|
|
1152 {
|
|
1153 ++yynerrs;
|
|
1154
|
|
1155 #ifdef YYERROR_VERBOSE
|
|
1156 yyn = yypact[yystate];
|
|
1157
|
|
1158 if (yyn > YYFLAG && yyn < YYLAST)
|
|
1159 {
|
|
1160 YYSIZE_T yysize = 0;
|
|
1161 char *yymsg;
|
|
1162 int yyx, yycount;
|
|
1163
|
|
1164 yycount = 0;
|
|
1165 /* Start YYX at -YYN if negative to avoid negative indexes in
|
|
1166 YYCHECK. */
|
|
1167 for (yyx = yyn < 0 ? -yyn : 0;
|
|
1168 yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
|
|
1169 if (yycheck[yyx + yyn] == yyx)
|
|
1170 yysize += yystrlen (yytname[yyx]) + 15, yycount++;
|
|
1171 yysize += yystrlen ("parse error, unexpected ") + 1;
|
|
1172 yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
|
|
1173 yymsg = (char *) YYSTACK_ALLOC (yysize);
|
|
1174 if (yymsg != 0)
|
|
1175 {
|
|
1176 char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
|
|
1177 yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
|
|
1178
|
|
1179 if (yycount < 5)
|
|
1180 {
|
|
1181 yycount = 0;
|
|
1182 for (yyx = yyn < 0 ? -yyn : 0;
|
|
1183 yyx < (int) (sizeof (yytname) / sizeof (char *));
|
|
1184 yyx++)
|
|
1185 if (yycheck[yyx + yyn] == yyx)
|
|
1186 {
|
|
1187 const char *yyq = ! yycount ? ", expecting " : " or ";
|
|
1188 yyp = yystpcpy (yyp, yyq);
|
|
1189 yyp = yystpcpy (yyp, yytname[yyx]);
|
|
1190 yycount++;
|
|
1191 }
|
|
1192 }
|
|
1193 yyerror (yymsg);
|
|
1194 YYSTACK_FREE (yymsg);
|
|
1195 }
|
|
1196 else
|
|
1197 yyerror ("parse error; also virtual memory exhausted");
|
|
1198 }
|
|
1199 else
|
|
1200 #endif /* defined (YYERROR_VERBOSE) */
|
|
1201 yyerror ("parse error");
|
|
1202 }
|
|
1203 goto yyerrlab1;
|
|
1204
|
|
1205
|
|
1206 /*--------------------------------------------------.
|
|
1207 | yyerrlab1 -- error raised explicitly by an action |
|
|
1208 `--------------------------------------------------*/
|
|
1209 yyerrlab1:
|
|
1210 if (yyerrstatus == 3)
|
|
1211 {
|
|
1212 /* If just tried and failed to reuse lookahead token after an
|
|
1213 error, discard it. */
|
|
1214
|
|
1215 /* return failure if at end of input */
|
|
1216 if (yychar == YYEOF)
|
|
1217 YYABORT;
|
|
1218 YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
|
|
1219 yychar, yytname[yychar1]));
|
|
1220 yychar = YYEMPTY;
|
|
1221 }
|
|
1222
|
|
1223 /* Else will try to reuse lookahead token after shifting the error
|
|
1224 token. */
|
|
1225
|
|
1226 yyerrstatus = 3; /* Each real token shifted decrements this */
|
|
1227
|
|
1228 goto yyerrhandle;
|
|
1229
|
|
1230
|
|
1231 /*-------------------------------------------------------------------.
|
|
1232 | yyerrdefault -- current state does not do anything special for the |
|
|
1233 | error token. |
|
|
1234 `-------------------------------------------------------------------*/
|
|
1235 yyerrdefault:
|
|
1236 #if 0
|
|
1237 /* This is wrong; only states that explicitly want error tokens
|
|
1238 should shift them. */
|
|
1239
|
|
1240 /* If its default is to accept any token, ok. Otherwise pop it. */
|
|
1241 yyn = yydefact[yystate];
|
|
1242 if (yyn)
|
|
1243 goto yydefault;
|
|
1244 #endif
|
|
1245
|
|
1246
|
|
1247 /*---------------------------------------------------------------.
|
|
1248 | yyerrpop -- pop the current state because it cannot handle the |
|
|
1249 | error token |
|
|
1250 `---------------------------------------------------------------*/
|
|
1251 yyerrpop:
|
|
1252 if (yyssp == yyss)
|
|
1253 YYABORT;
|
|
1254 yyvsp--;
|
|
1255 yystate = *--yyssp;
|
|
1256 #if YYLSP_NEEDED
|
|
1257 yylsp--;
|
|
1258 #endif
|
|
1259
|
|
1260 #if YYDEBUG
|
|
1261 if (yydebug)
|
|
1262 {
|
|
1263 short *yyssp1 = yyss - 1;
|
|
1264 YYFPRINTF (stderr, "Error: state stack now");
|
|
1265 while (yyssp1 != yyssp)
|
|
1266 YYFPRINTF (stderr, " %d", *++yyssp1);
|
|
1267 YYFPRINTF (stderr, "\n");
|
|
1268 }
|
|
1269 #endif
|
|
1270
|
|
1271 /*--------------.
|
|
1272 | yyerrhandle. |
|
|
1273 `--------------*/
|
|
1274 yyerrhandle:
|
|
1275 yyn = yypact[yystate];
|
|
1276 if (yyn == YYFLAG)
|
|
1277 goto yyerrdefault;
|
|
1278
|
|
1279 yyn += YYTERROR;
|
|
1280 if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
|
|
1281 goto yyerrdefault;
|
|
1282
|
|
1283 yyn = yytable[yyn];
|
|
1284 if (yyn < 0)
|
|
1285 {
|
|
1286 if (yyn == YYFLAG)
|
|
1287 goto yyerrpop;
|
|
1288 yyn = -yyn;
|
|
1289 goto yyreduce;
|
|
1290 }
|
|
1291 else if (yyn == 0)
|
|
1292 goto yyerrpop;
|
|
1293
|
|
1294 if (yyn == YYFINAL)
|
|
1295 YYACCEPT;
|
|
1296
|
|
1297 YYDPRINTF ((stderr, "Shifting error token, "));
|
|
1298
|
|
1299 *++yyvsp = yylval;
|
|
1300 #if YYLSP_NEEDED
|
|
1301 *++yylsp = yylloc;
|
|
1302 #endif
|
|
1303
|
|
1304 yystate = yyn;
|
|
1305 goto yynewstate;
|
|
1306
|
|
1307
|
|
1308 /*-------------------------------------.
|
|
1309 | yyacceptlab -- YYACCEPT comes here. |
|
|
1310 `-------------------------------------*/
|
|
1311 yyacceptlab:
|
|
1312 yyresult = 0;
|
|
1313 goto yyreturn;
|
|
1314
|
|
1315 /*-----------------------------------.
|
|
1316 | yyabortlab -- YYABORT comes here. |
|
|
1317 `-----------------------------------*/
|
|
1318 yyabortlab:
|
|
1319 yyresult = 1;
|
|
1320 goto yyreturn;
|
|
1321
|
|
1322 /*---------------------------------------------.
|
|
1323 | yyoverflowab -- parser overflow comes here. |
|
|
1324 `---------------------------------------------*/
|
|
1325 yyoverflowlab:
|
|
1326 yyerror ("parser stack overflow");
|
|
1327 yyresult = 2;
|
|
1328 /* Fall through. */
|
|
1329
|
|
1330 yyreturn:
|
|
1331 #ifndef yyoverflow
|
|
1332 if (yyss != yyssa)
|
|
1333 YYSTACK_FREE (yyss);
|
|
1334 #endif
|
|
1335 return yyresult;
|
|
1336 }
|
|
1337 #line 229 "plural.y"
|
|
1338
|
|
1339
|
|
1340 void
|
|
1341 internal_function
|
|
1342 FREE_EXPRESSION (exp)
|
|
1343 struct expression *exp;
|
|
1344 {
|
|
1345 if (exp == NULL)
|
|
1346 return;
|
|
1347
|
|
1348 /* Handle the recursive case. */
|
|
1349 switch (exp->nargs)
|
|
1350 {
|
|
1351 case 3:
|
|
1352 FREE_EXPRESSION (exp->val.args[2]);
|
|
1353 /* FALLTHROUGH */
|
|
1354 case 2:
|
|
1355 FREE_EXPRESSION (exp->val.args[1]);
|
|
1356 /* FALLTHROUGH */
|
|
1357 case 1:
|
|
1358 FREE_EXPRESSION (exp->val.args[0]);
|
|
1359 /* FALLTHROUGH */
|
|
1360 default:
|
|
1361 break;
|
|
1362 }
|
|
1363
|
|
1364 free (exp);
|
|
1365 }
|
|
1366
|
|
1367
|
|
1368 static int
|
|
1369 yylex (lval, pexp)
|
|
1370 YYSTYPE *lval;
|
|
1371 const char **pexp;
|
|
1372 {
|
|
1373 const char *exp = *pexp;
|
|
1374 int result;
|
|
1375
|
|
1376 while (1)
|
|
1377 {
|
|
1378 if (exp[0] == '\0')
|
|
1379 {
|
|
1380 *pexp = exp;
|
|
1381 return YYEOF;
|
|
1382 }
|
|
1383
|
|
1384 if (exp[0] != ' ' && exp[0] != '\t')
|
|
1385 break;
|
|
1386
|
|
1387 ++exp;
|
|
1388 }
|
|
1389
|
|
1390 result = *exp++;
|
|
1391 switch (result)
|
|
1392 {
|
|
1393 case '0': case '1': case '2': case '3': case '4':
|
|
1394 case '5': case '6': case '7': case '8': case '9':
|
|
1395 {
|
|
1396 unsigned long int n = result - '0';
|
|
1397 while (exp[0] >= '0' && exp[0] <= '9')
|
|
1398 {
|
|
1399 n *= 10;
|
|
1400 n += exp[0] - '0';
|
|
1401 ++exp;
|
|
1402 }
|
|
1403 lval->num = n;
|
|
1404 result = NUMBER;
|
|
1405 }
|
|
1406 break;
|
|
1407
|
|
1408 case '=':
|
|
1409 if (exp[0] == '=')
|
|
1410 {
|
|
1411 ++exp;
|
|
1412 lval->op = equal;
|
|
1413 result = EQUOP2;
|
|
1414 }
|
|
1415 else
|
|
1416 result = YYERRCODE;
|
|
1417 break;
|
|
1418
|
|
1419 case '!':
|
|
1420 if (exp[0] == '=')
|
|
1421 {
|
|
1422 ++exp;
|
|
1423 lval->op = not_equal;
|
|
1424 result = EQUOP2;
|
|
1425 }
|
|
1426 break;
|
|
1427
|
|
1428 case '&':
|
|
1429 case '|':
|
|
1430 if (exp[0] == result)
|
|
1431 ++exp;
|
|
1432 else
|
|
1433 result = YYERRCODE;
|
|
1434 break;
|
|
1435
|
|
1436 case '<':
|
|
1437 if (exp[0] == '=')
|
|
1438 {
|
|
1439 ++exp;
|
|
1440 lval->op = less_or_equal;
|
|
1441 }
|
|
1442 else
|
|
1443 lval->op = less_than;
|
|
1444 result = CMPOP2;
|
|
1445 break;
|
|
1446
|
|
1447 case '>':
|
|
1448 if (exp[0] == '=')
|
|
1449 {
|
|
1450 ++exp;
|
|
1451 lval->op = greater_or_equal;
|
|
1452 }
|
|
1453 else
|
|
1454 lval->op = greater_than;
|
|
1455 result = CMPOP2;
|
|
1456 break;
|
|
1457
|
|
1458 case '*':
|
|
1459 lval->op = mult;
|
|
1460 result = MULOP2;
|
|
1461 break;
|
|
1462
|
|
1463 case '/':
|
|
1464 lval->op = divide;
|
|
1465 result = MULOP2;
|
|
1466 break;
|
|
1467
|
|
1468 case '%':
|
|
1469 lval->op = module;
|
|
1470 result = MULOP2;
|
|
1471 break;
|
|
1472
|
|
1473 case '+':
|
|
1474 lval->op = plus;
|
|
1475 result = ADDOP2;
|
|
1476 break;
|
|
1477
|
|
1478 case '-':
|
|
1479 lval->op = minus;
|
|
1480 result = ADDOP2;
|
|
1481 break;
|
|
1482
|
|
1483 case 'n':
|
|
1484 case '?':
|
|
1485 case ':':
|
|
1486 case '(':
|
|
1487 case ')':
|
|
1488 /* Nothing, just return the character. */
|
|
1489 break;
|
|
1490
|
|
1491 case ';':
|
|
1492 case '\n':
|
|
1493 case '\0':
|
|
1494 /* Be safe and let the user call this function again. */
|
|
1495 --exp;
|
|
1496 result = YYEOF;
|
|
1497 break;
|
|
1498
|
|
1499 default:
|
|
1500 result = YYERRCODE;
|
|
1501 #if YYDEBUG != 0
|
|
1502 --exp;
|
|
1503 #endif
|
|
1504 break;
|
|
1505 }
|
|
1506
|
|
1507 *pexp = exp;
|
|
1508
|
|
1509 return result;
|
|
1510 }
|
|
1511
|
|
1512
|
|
1513 static void
|
|
1514 yyerror (str)
|
|
1515 const char *str;
|
|
1516 {
|
|
1517 /* Do nothing. We don't print error messages here. */
|
|
1518 }
|