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