Home | History | Annotate | Line # | Download | only in yacc
calc1.tab.c revision 1.5
      1  1.4  christos /*	$NetBSD: calc1.tab.c,v 1.5 2024/09/14 21:29:04 christos Exp $	*/
      2  1.1  christos 
      3  1.1  christos /* original parser id follows */
      4  1.1  christos /* yysccsid[] = "@(#)yaccpar	1.9 (Berkeley) 02/21/93" */
      5  1.1  christos /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
      6  1.1  christos 
      7  1.1  christos #define YYBYACC 1
      8  1.4  christos #define YYMAJOR 2
      9  1.4  christos #define YYMINOR 0
     10  1.1  christos #define YYCHECK "yyyymmdd"
     11  1.1  christos 
     12  1.1  christos #define YYEMPTY        (-1)
     13  1.1  christos #define yyclearin      (yychar = YYEMPTY)
     14  1.1  christos #define yyerrok        (yyerrflag = 0)
     15  1.1  christos #define YYRECOVERING() (yyerrflag != 0)
     16  1.1  christos #define YYENOMEM       (-2)
     17  1.1  christos #define YYEOF          0
     18  1.1  christos 
     19  1.1  christos #ifndef yyparse
     20  1.1  christos #define yyparse    calc1_parse
     21  1.1  christos #endif /* yyparse */
     22  1.1  christos 
     23  1.1  christos #ifndef yylex
     24  1.1  christos #define yylex      calc1_lex
     25  1.1  christos #endif /* yylex */
     26  1.1  christos 
     27  1.1  christos #ifndef yyerror
     28  1.1  christos #define yyerror    calc1_error
     29  1.1  christos #endif /* yyerror */
     30  1.1  christos 
     31  1.1  christos #ifndef yychar
     32  1.1  christos #define yychar     calc1_char
     33  1.1  christos #endif /* yychar */
     34  1.1  christos 
     35  1.1  christos #ifndef yyval
     36  1.1  christos #define yyval      calc1_val
     37  1.1  christos #endif /* yyval */
     38  1.1  christos 
     39  1.1  christos #ifndef yylval
     40  1.1  christos #define yylval     calc1_lval
     41  1.1  christos #endif /* yylval */
     42  1.1  christos 
     43  1.1  christos #ifndef yydebug
     44  1.1  christos #define yydebug    calc1_debug
     45  1.1  christos #endif /* yydebug */
     46  1.1  christos 
     47  1.1  christos #ifndef yynerrs
     48  1.1  christos #define yynerrs    calc1_nerrs
     49  1.1  christos #endif /* yynerrs */
     50  1.1  christos 
     51  1.1  christos #ifndef yyerrflag
     52  1.1  christos #define yyerrflag  calc1_errflag
     53  1.1  christos #endif /* yyerrflag */
     54  1.1  christos 
     55  1.1  christos #ifndef yylhs
     56  1.1  christos #define yylhs      calc1_lhs
     57  1.1  christos #endif /* yylhs */
     58  1.1  christos 
     59  1.1  christos #ifndef yylen
     60  1.1  christos #define yylen      calc1_len
     61  1.1  christos #endif /* yylen */
     62  1.1  christos 
     63  1.1  christos #ifndef yydefred
     64  1.1  christos #define yydefred   calc1_defred
     65  1.1  christos #endif /* yydefred */
     66  1.1  christos 
     67  1.1  christos #ifndef yydgoto
     68  1.1  christos #define yydgoto    calc1_dgoto
     69  1.1  christos #endif /* yydgoto */
     70  1.1  christos 
     71  1.1  christos #ifndef yysindex
     72  1.1  christos #define yysindex   calc1_sindex
     73  1.1  christos #endif /* yysindex */
     74  1.1  christos 
     75  1.1  christos #ifndef yyrindex
     76  1.1  christos #define yyrindex   calc1_rindex
     77  1.1  christos #endif /* yyrindex */
     78  1.1  christos 
     79  1.1  christos #ifndef yygindex
     80  1.1  christos #define yygindex   calc1_gindex
     81  1.1  christos #endif /* yygindex */
     82  1.1  christos 
     83  1.1  christos #ifndef yytable
     84  1.1  christos #define yytable    calc1_table
     85  1.1  christos #endif /* yytable */
     86  1.1  christos 
     87  1.1  christos #ifndef yycheck
     88  1.1  christos #define yycheck    calc1_check
     89  1.1  christos #endif /* yycheck */
     90  1.1  christos 
     91  1.1  christos #ifndef yyname
     92  1.1  christos #define yyname     calc1_name
     93  1.1  christos #endif /* yyname */
     94  1.1  christos 
     95  1.1  christos #ifndef yyrule
     96  1.1  christos #define yyrule     calc1_rule
     97  1.1  christos #endif /* yyrule */
     98  1.1  christos #define YYPREFIX "calc1_"
     99  1.1  christos 
    100  1.1  christos #define YYPURE 0
    101  1.1  christos 
    102  1.1  christos #line 2 "calc1.y"
    103  1.1  christos 
    104  1.1  christos /* http://dinosaur.compilertools.net/yacc/index.html */
    105  1.1  christos 
    106  1.1  christos #include <stdlib.h>
    107  1.1  christos #include <stdio.h>
    108  1.1  christos #include <ctype.h>
    109  1.1  christos #include <math.h>
    110  1.1  christos 
    111  1.1  christos typedef struct interval
    112  1.1  christos {
    113  1.1  christos     double lo, hi;
    114  1.1  christos }
    115  1.1  christos INTERVAL;
    116  1.1  christos 
    117  1.1  christos INTERVAL vmul(double, double, INTERVAL);
    118  1.1  christos INTERVAL vdiv(double, double, INTERVAL);
    119  1.1  christos 
    120  1.1  christos extern int yylex(void);
    121  1.1  christos static void yyerror(const char *s);
    122  1.1  christos 
    123  1.1  christos int dcheck(INTERVAL);
    124  1.1  christos 
    125  1.1  christos double dreg[26];
    126  1.1  christos INTERVAL vreg[26];
    127  1.1  christos 
    128  1.1  christos #ifdef YYSTYPE
    129  1.1  christos #undef  YYSTYPE_IS_DECLARED
    130  1.1  christos #define YYSTYPE_IS_DECLARED 1
    131  1.1  christos #endif
    132  1.1  christos #ifndef YYSTYPE_IS_DECLARED
    133  1.1  christos #define YYSTYPE_IS_DECLARED 1
    134  1.2  christos #line 31 "calc1.y"
    135  1.5  christos typedef union YYSTYPE
    136  1.1  christos {
    137  1.1  christos 	int ival;
    138  1.1  christos 	double dval;
    139  1.1  christos 	INTERVAL vval;
    140  1.1  christos } YYSTYPE;
    141  1.1  christos #endif /* !YYSTYPE_IS_DECLARED */
    142  1.1  christos #line 141 "calc1.tab.c"
    143  1.1  christos 
    144  1.1  christos /* compatibility with bison */
    145  1.1  christos #ifdef YYPARSE_PARAM
    146  1.1  christos /* compatibility with FreeBSD */
    147  1.1  christos # ifdef YYPARSE_PARAM_TYPE
    148  1.1  christos #  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
    149  1.1  christos # else
    150  1.1  christos #  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
    151  1.1  christos # endif
    152  1.1  christos #else
    153  1.1  christos # define YYPARSE_DECL() yyparse(void)
    154  1.1  christos #endif
    155  1.1  christos 
    156  1.1  christos /* Parameters sent to lex. */
    157  1.1  christos #ifdef YYLEX_PARAM
    158  1.1  christos # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
    159  1.1  christos # define YYLEX yylex(YYLEX_PARAM)
    160  1.1  christos #else
    161  1.1  christos # define YYLEX_DECL() yylex(void)
    162  1.1  christos # define YYLEX yylex()
    163  1.1  christos #endif
    164  1.1  christos 
    165  1.1  christos /* Parameters sent to yyerror. */
    166  1.1  christos #ifndef YYERROR_DECL
    167  1.1  christos #define YYERROR_DECL() yyerror(const char *s)
    168  1.1  christos #endif
    169  1.1  christos #ifndef YYERROR_CALL
    170  1.1  christos #define YYERROR_CALL(msg) yyerror(msg)
    171  1.1  christos #endif
    172  1.1  christos 
    173  1.1  christos extern int YYPARSE_DECL();
    174  1.1  christos 
    175  1.1  christos #define DREG 257
    176  1.1  christos #define VREG 258
    177  1.1  christos #define CONST 259
    178  1.1  christos #define UMINUS 260
    179  1.1  christos #define YYERRCODE 256
    180  1.5  christos typedef int YYINT;
    181  1.1  christos static const YYINT calc1_lhs[] = {                       -1,
    182  1.1  christos     3,    3,    0,    0,    0,    0,    0,    1,    1,    1,
    183  1.1  christos     1,    1,    1,    1,    1,    2,    2,    2,    2,    2,
    184  1.1  christos     2,    2,    2,    2,    2,    2,    2,    2,
    185  1.1  christos };
    186  1.1  christos static const YYINT calc1_len[] = {                        2,
    187  1.1  christos     0,    2,    2,    2,    4,    4,    2,    1,    1,    3,
    188  1.1  christos     3,    3,    3,    2,    3,    1,    5,    1,    3,    3,
    189  1.1  christos     3,    3,    3,    3,    3,    3,    2,    3,
    190  1.1  christos };
    191  1.1  christos static const YYINT calc1_defred[] = {                     0,
    192  1.1  christos     0,    0,    0,    8,    0,    0,    0,    0,    0,    7,
    193  1.1  christos     0,    0,    9,   18,   14,   27,    0,    0,    0,    0,
    194  1.1  christos     0,    0,    3,    0,    0,    0,    0,    4,    0,    0,
    195  1.1  christos     0,    0,    0,   15,    0,   28,    0,    0,    0,    0,
    196  1.1  christos    12,   24,   13,   26,    0,    0,   23,   25,   14,    0,
    197  1.1  christos     0,    0,    0,    0,    5,    6,    0,    0,    0,   12,
    198  1.1  christos    13,   17,
    199  1.1  christos };
    200  1.1  christos static const YYINT calc1_dgoto[] = {                      7,
    201  1.1  christos    32,    9,    0,
    202  1.1  christos };
    203  1.1  christos static const YYINT calc1_sindex[] = {                   -40,
    204  1.1  christos    -8,  -48,  -47,    0,  -37,  -37,    0,    2,   17,    0,
    205  1.1  christos   -34,  -37,    0,    0,    0,    0,  -25,   90,  -37,  -37,
    206  1.1  christos   -37,  -37,    0,  -37,  -37,  -37,  -37,    0,  -34,  -34,
    207  1.1  christos    25,  125,   31,    0,  -34,    0,  -11,   37,  -11,   37,
    208  1.1  christos     0,    0,    0,    0,   37,   37,    0,    0,    0,  111,
    209  1.1  christos   -34,  -34,  -34,  -34,    0,    0,  118,   69,   69,    0,
    210  1.1  christos     0,    0,
    211  1.1  christos };
    212  1.1  christos static const YYINT calc1_rindex[] = {                     0,
    213  1.1  christos     0,   38,   44,    0,    0,    0,    0,    0,    0,    0,
    214  1.1  christos     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    215  1.1  christos     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    216  1.1  christos     0,   -9,    0,    0,    0,    0,   51,   -3,   56,   61,
    217  1.1  christos     0,    0,    0,    0,   67,   72,    0,    0,    0,    0,
    218  1.1  christos     0,    0,    0,    0,    0,    0,    0,   78,   83,    0,
    219  1.1  christos     0,    0,
    220  1.1  christos };
    221  1.1  christos static const YYINT calc1_gindex[] = {                     0,
    222  1.1  christos     4,  124,    0,
    223  1.1  christos };
    224  1.1  christos #define YYTABLESIZE 225
    225  1.1  christos static const YYINT calc1_table[] = {                      6,
    226  1.1  christos    16,   10,    6,    8,    5,   30,   20,    5,   15,   17,
    227  1.1  christos    29,   23,   11,   12,   31,   34,   21,   19,   35,   20,
    228  1.1  christos     0,   22,   37,   39,   41,   43,   28,    0,    0,    0,
    229  1.1  christos    21,   16,   49,   50,   55,   22,    0,   20,   57,   20,
    230  1.1  christos    56,   20,    0,   21,   19,    0,   20,    9,   22,    0,
    231  1.1  christos     0,    0,    0,   18,   58,   59,   60,   61,   26,   24,
    232  1.1  christos    10,   25,    0,   27,    0,   11,   53,   51,    0,   52,
    233  1.1  christos    22,   54,   26,   24,    0,   25,   19,   27,   26,    9,
    234  1.1  christos     9,   21,    9,   27,    9,   18,   18,   10,   18,    0,
    235  1.1  christos    18,   10,   11,   10,   10,   10,   11,    0,   11,   11,
    236  1.1  christos    11,   22,    0,   22,    0,   22,    0,   19,    0,   19,
    237  1.1  christos    53,   19,   21,    0,   21,   54,   21,    0,   10,    0,
    238  1.1  christos    10,    0,   10,   11,    0,   11,    0,   11,   16,   18,
    239  1.1  christos    36,   26,   24,    0,   25,   33,   27,    0,    0,    0,
    240  1.1  christos     0,    0,   38,   40,   42,   44,    0,   45,   46,   47,
    241  1.1  christos    48,   34,   53,   51,    0,   52,    0,   54,   62,   53,
    242  1.1  christos    51,    0,   52,    0,   54,    0,   21,   19,    0,   20,
    243  1.1  christos     0,   22,    0,    0,    0,    0,    0,    0,    0,    0,
    244  1.1  christos     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    245  1.1  christos     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    246  1.1  christos     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
    247  1.1  christos     0,    0,    0,    0,    0,    1,    2,    3,    4,   13,
    248  1.1  christos    14,    4,   13,    0,    4,
    249  1.1  christos };
    250  1.1  christos static const YYINT calc1_check[] = {                     40,
    251  1.1  christos    10,   10,   40,    0,   45,   40,   10,   45,    5,    6,
    252  1.1  christos    45,   10,   61,   61,   11,   41,   42,   43,   44,   45,
    253  1.1  christos    -1,   47,   19,   20,   21,   22,   10,   -1,   -1,   -1,
    254  1.1  christos    42,   41,   29,   30,   10,   47,   -1,   41,   35,   43,
    255  1.1  christos    10,   45,   -1,   42,   43,   -1,   45,   10,   47,   -1,
    256  1.1  christos    -1,   -1,   -1,   10,   51,   52,   53,   54,   42,   43,
    257  1.1  christos    10,   45,   -1,   47,   -1,   10,   42,   43,   -1,   45,
    258  1.1  christos    10,   47,   42,   43,   -1,   45,   10,   47,   42,   42,
    259  1.1  christos    43,   10,   45,   47,   47,   42,   43,   10,   45,   -1,
    260  1.1  christos    47,   41,   10,   43,   44,   45,   41,   -1,   43,   44,
    261  1.1  christos    45,   41,   -1,   43,   -1,   45,   -1,   41,   -1,   43,
    262  1.1  christos    42,   45,   41,   -1,   43,   47,   45,   -1,   41,   -1,
    263  1.1  christos    43,   -1,   45,   41,   -1,   43,   -1,   45,    5,    6,
    264  1.1  christos    41,   42,   43,   -1,   45,   12,   47,   -1,   -1,   -1,
    265  1.1  christos    -1,   -1,   19,   20,   21,   22,   -1,   24,   25,   26,
    266  1.1  christos    27,   41,   42,   43,   -1,   45,   -1,   47,   41,   42,
    267  1.1  christos    43,   -1,   45,   -1,   47,   -1,   42,   43,   -1,   45,
    268  1.1  christos    -1,   47,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    269  1.1  christos    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    270  1.1  christos    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    271  1.1  christos    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    272  1.1  christos    -1,   -1,   -1,   -1,   -1,  256,  257,  258,  259,  257,
    273  1.1  christos   258,  259,  257,   -1,  259,
    274  1.1  christos };
    275  1.1  christos #define YYFINAL 7
    276  1.1  christos #ifndef YYDEBUG
    277  1.1  christos #define YYDEBUG 0
    278  1.1  christos #endif
    279  1.1  christos #define YYMAXTOKEN 260
    280  1.1  christos #define YYUNDFTOKEN 266
    281  1.1  christos #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
    282  1.1  christos #if YYDEBUG
    283  1.1  christos static const char *const calc1_name[] = {
    284  1.1  christos 
    285  1.1  christos "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    286  1.1  christos 0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
    287  1.1  christos 0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    288  1.1  christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    289  1.1  christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    290  1.1  christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    291  1.1  christos 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    292  1.1  christos 0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
    293  1.1  christos };
    294  1.1  christos static const char *const calc1_rule[] = {
    295  1.1  christos "$accept : line",
    296  1.1  christos "lines :",
    297  1.1  christos "lines : lines line",
    298  1.1  christos "line : dexp '\\n'",
    299  1.1  christos "line : vexp '\\n'",
    300  1.1  christos "line : DREG '=' dexp '\\n'",
    301  1.1  christos "line : VREG '=' vexp '\\n'",
    302  1.1  christos "line : error '\\n'",
    303  1.1  christos "dexp : CONST",
    304  1.1  christos "dexp : DREG",
    305  1.1  christos "dexp : dexp '+' dexp",
    306  1.1  christos "dexp : dexp '-' dexp",
    307  1.1  christos "dexp : dexp '*' dexp",
    308  1.1  christos "dexp : dexp '/' dexp",
    309  1.1  christos "dexp : '-' dexp",
    310  1.1  christos "dexp : '(' dexp ')'",
    311  1.1  christos "vexp : dexp",
    312  1.1  christos "vexp : '(' dexp ',' dexp ')'",
    313  1.1  christos "vexp : VREG",
    314  1.1  christos "vexp : vexp '+' vexp",
    315  1.1  christos "vexp : dexp '+' vexp",
    316  1.1  christos "vexp : vexp '-' vexp",
    317  1.1  christos "vexp : dexp '-' vexp",
    318  1.1  christos "vexp : vexp '*' vexp",
    319  1.1  christos "vexp : dexp '*' vexp",
    320  1.1  christos "vexp : vexp '/' vexp",
    321  1.1  christos "vexp : dexp '/' vexp",
    322  1.1  christos "vexp : '-' vexp",
    323  1.1  christos "vexp : '(' vexp ')'",
    324  1.1  christos 
    325  1.1  christos };
    326  1.1  christos #endif
    327  1.1  christos 
    328  1.3  christos #if YYDEBUG
    329  1.1  christos int      yydebug;
    330  1.3  christos #endif
    331  1.1  christos 
    332  1.1  christos int      yyerrflag;
    333  1.1  christos int      yychar;
    334  1.1  christos YYSTYPE  yyval;
    335  1.1  christos YYSTYPE  yylval;
    336  1.3  christos int      yynerrs;
    337  1.1  christos 
    338  1.1  christos /* define the initial stack-sizes */
    339  1.1  christos #ifdef YYSTACKSIZE
    340  1.1  christos #undef YYMAXDEPTH
    341  1.1  christos #define YYMAXDEPTH  YYSTACKSIZE
    342  1.1  christos #else
    343  1.1  christos #ifdef YYMAXDEPTH
    344  1.1  christos #define YYSTACKSIZE YYMAXDEPTH
    345  1.1  christos #else
    346  1.1  christos #define YYSTACKSIZE 10000
    347  1.1  christos #define YYMAXDEPTH  10000
    348  1.1  christos #endif
    349  1.1  christos #endif
    350  1.1  christos 
    351  1.1  christos #define YYINITSTACKSIZE 200
    352  1.1  christos 
    353  1.1  christos typedef struct {
    354  1.1  christos     unsigned stacksize;
    355  1.1  christos     YYINT    *s_base;
    356  1.1  christos     YYINT    *s_mark;
    357  1.1  christos     YYINT    *s_last;
    358  1.1  christos     YYSTYPE  *l_base;
    359  1.1  christos     YYSTYPE  *l_mark;
    360  1.1  christos } YYSTACKDATA;
    361  1.1  christos /* variables for the parser stack */
    362  1.1  christos static YYSTACKDATA yystack;
    363  1.1  christos #line 176 "calc1.y"
    364  1.1  christos 	/* beginning of subroutines section */
    365  1.1  christos 
    366  1.1  christos #define BSZ 50			/* buffer size for floating point numbers */
    367  1.1  christos 
    368  1.1  christos 	/* lexical analysis */
    369  1.1  christos 
    370  1.1  christos static void
    371  1.1  christos yyerror(const char *s)
    372  1.1  christos {
    373  1.1  christos     fprintf(stderr, "%s\n", s);
    374  1.1  christos }
    375  1.1  christos 
    376  1.1  christos int
    377  1.1  christos yylex(void)
    378  1.1  christos {
    379  1.1  christos     int c;
    380  1.1  christos 
    381  1.1  christos     while ((c = getchar()) == ' ')
    382  1.1  christos     {				/* skip over blanks */
    383  1.1  christos     }
    384  1.1  christos 
    385  1.1  christos     if (isupper(c))
    386  1.1  christos     {
    387  1.1  christos 	yylval.ival = c - 'A';
    388  1.1  christos 	return (VREG);
    389  1.1  christos     }
    390  1.1  christos     if (islower(c))
    391  1.1  christos     {
    392  1.1  christos 	yylval.ival = c - 'a';
    393  1.1  christos 	return (DREG);
    394  1.1  christos     }
    395  1.1  christos 
    396  1.1  christos     if (isdigit(c) || c == '.')
    397  1.1  christos     {
    398  1.1  christos 	/* gobble up digits, points, exponents */
    399  1.1  christos 	char buf[BSZ + 1], *cp = buf;
    400  1.1  christos 	int dot = 0, expr = 0;
    401  1.1  christos 
    402  1.1  christos 	for (; (cp - buf) < BSZ; ++cp, c = getchar())
    403  1.1  christos 	{
    404  1.1  christos 
    405  1.1  christos 	    *cp = (char) c;
    406  1.1  christos 	    if (isdigit(c))
    407  1.1  christos 		continue;
    408  1.1  christos 	    if (c == '.')
    409  1.1  christos 	    {
    410  1.1  christos 		if (dot++ || expr)
    411  1.1  christos 		    return ('.');	/* will cause syntax error */
    412  1.1  christos 		continue;
    413  1.1  christos 	    }
    414  1.1  christos 
    415  1.1  christos 	    if (c == 'e')
    416  1.1  christos 	    {
    417  1.1  christos 		if (expr++)
    418  1.1  christos 		    return ('e');	/*  will  cause  syntax  error  */
    419  1.1  christos 		continue;
    420  1.1  christos 	    }
    421  1.1  christos 
    422  1.1  christos 	    /*  end  of  number  */
    423  1.1  christos 	    break;
    424  1.1  christos 	}
    425  1.1  christos 	*cp = '\0';
    426  1.1  christos 
    427  1.1  christos 	if ((cp - buf) >= BSZ)
    428  1.1  christos 	    printf("constant  too  long:  truncated\n");
    429  1.1  christos 	else
    430  1.1  christos 	    ungetc(c, stdin);	/*  push  back  last  char  read  */
    431  1.1  christos 	yylval.dval = atof(buf);
    432  1.1  christos 	return (CONST);
    433  1.1  christos     }
    434  1.1  christos     return (c);
    435  1.1  christos }
    436  1.1  christos 
    437  1.1  christos static INTERVAL
    438  1.1  christos hilo(double a, double b, double c, double d)
    439  1.1  christos {
    440  1.1  christos     /*  returns  the  smallest  interval  containing  a,  b,  c,  and  d  */
    441  1.1  christos     /*  used  by  *,  /  routines  */
    442  1.1  christos     INTERVAL v;
    443  1.1  christos 
    444  1.1  christos     if (a > b)
    445  1.1  christos     {
    446  1.1  christos 	v.hi = a;
    447  1.1  christos 	v.lo = b;
    448  1.1  christos     }
    449  1.1  christos     else
    450  1.1  christos     {
    451  1.1  christos 	v.hi = b;
    452  1.1  christos 	v.lo = a;
    453  1.1  christos     }
    454  1.1  christos 
    455  1.1  christos     if (c > d)
    456  1.1  christos     {
    457  1.1  christos 	if (c > v.hi)
    458  1.1  christos 	    v.hi = c;
    459  1.1  christos 	if (d < v.lo)
    460  1.1  christos 	    v.lo = d;
    461  1.1  christos     }
    462  1.1  christos     else
    463  1.1  christos     {
    464  1.1  christos 	if (d > v.hi)
    465  1.1  christos 	    v.hi = d;
    466  1.1  christos 	if (c < v.lo)
    467  1.1  christos 	    v.lo = c;
    468  1.1  christos     }
    469  1.1  christos     return (v);
    470  1.1  christos }
    471  1.1  christos 
    472  1.1  christos INTERVAL
    473  1.1  christos vmul(double a, double b, INTERVAL v)
    474  1.1  christos {
    475  1.1  christos     return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
    476  1.1  christos }
    477  1.1  christos 
    478  1.1  christos int
    479  1.1  christos dcheck(INTERVAL v)
    480  1.1  christos {
    481  1.1  christos     if (v.hi >= 0. && v.lo <= 0.)
    482  1.1  christos     {
    483  1.1  christos 	printf("divisor  interval  contains  0.\n");
    484  1.1  christos 	return (1);
    485  1.1  christos     }
    486  1.1  christos     return (0);
    487  1.1  christos }
    488  1.1  christos 
    489  1.1  christos INTERVAL
    490  1.1  christos vdiv(double a, double b, INTERVAL v)
    491  1.1  christos {
    492  1.1  christos     return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
    493  1.1  christos }
    494  1.3  christos #line 493 "calc1.tab.c"
    495  1.1  christos 
    496  1.1  christos #if YYDEBUG
    497  1.2  christos #include <stdio.h>	/* needed for printf */
    498  1.1  christos #endif
    499  1.1  christos 
    500  1.1  christos #include <stdlib.h>	/* needed for malloc, etc */
    501  1.1  christos #include <string.h>	/* needed for memset */
    502  1.1  christos 
    503  1.1  christos /* allocate initial stack or double stack size, up to YYMAXDEPTH */
    504  1.1  christos static int yygrowstack(YYSTACKDATA *data)
    505  1.1  christos {
    506  1.1  christos     int i;
    507  1.1  christos     unsigned newsize;
    508  1.1  christos     YYINT *newss;
    509  1.1  christos     YYSTYPE *newvs;
    510  1.1  christos 
    511  1.1  christos     if ((newsize = data->stacksize) == 0)
    512  1.1  christos         newsize = YYINITSTACKSIZE;
    513  1.1  christos     else if (newsize >= YYMAXDEPTH)
    514  1.1  christos         return YYENOMEM;
    515  1.1  christos     else if ((newsize *= 2) > YYMAXDEPTH)
    516  1.1  christos         newsize = YYMAXDEPTH;
    517  1.1  christos 
    518  1.1  christos     i = (int) (data->s_mark - data->s_base);
    519  1.1  christos     newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
    520  1.1  christos     if (newss == 0)
    521  1.1  christos         return YYENOMEM;
    522  1.1  christos 
    523  1.1  christos     data->s_base = newss;
    524  1.1  christos     data->s_mark = newss + i;
    525  1.1  christos 
    526  1.1  christos     newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
    527  1.1  christos     if (newvs == 0)
    528  1.1  christos         return YYENOMEM;
    529  1.1  christos 
    530  1.1  christos     data->l_base = newvs;
    531  1.1  christos     data->l_mark = newvs + i;
    532  1.1  christos 
    533  1.1  christos     data->stacksize = newsize;
    534  1.1  christos     data->s_last = data->s_base + newsize - 1;
    535  1.1  christos     return 0;
    536  1.1  christos }
    537  1.1  christos 
    538  1.1  christos #if YYPURE || defined(YY_NO_LEAKS)
    539  1.1  christos static void yyfreestack(YYSTACKDATA *data)
    540  1.1  christos {
    541  1.1  christos     free(data->s_base);
    542  1.1  christos     free(data->l_base);
    543  1.1  christos     memset(data, 0, sizeof(*data));
    544  1.1  christos }
    545  1.1  christos #else
    546  1.1  christos #define yyfreestack(data) /* nothing */
    547  1.1  christos #endif
    548  1.1  christos 
    549  1.1  christos #define YYABORT  goto yyabort
    550  1.1  christos #define YYREJECT goto yyabort
    551  1.1  christos #define YYACCEPT goto yyaccept
    552  1.1  christos #define YYERROR  goto yyerrlab
    553  1.1  christos 
    554  1.1  christos int
    555  1.1  christos YYPARSE_DECL()
    556  1.1  christos {
    557  1.1  christos     int yym, yyn, yystate;
    558  1.1  christos #if YYDEBUG
    559  1.1  christos     const char *yys;
    560  1.1  christos 
    561  1.1  christos     if ((yys = getenv("YYDEBUG")) != 0)
    562  1.1  christos     {
    563  1.1  christos         yyn = *yys;
    564  1.1  christos         if (yyn >= '0' && yyn <= '9')
    565  1.1  christos             yydebug = yyn - '0';
    566  1.1  christos     }
    567  1.1  christos #endif
    568  1.1  christos 
    569  1.5  christos     /* yym is set below */
    570  1.5  christos     /* yyn is set below */
    571  1.1  christos     yynerrs = 0;
    572  1.1  christos     yyerrflag = 0;
    573  1.1  christos     yychar = YYEMPTY;
    574  1.1  christos     yystate = 0;
    575  1.1  christos 
    576  1.1  christos #if YYPURE
    577  1.1  christos     memset(&yystack, 0, sizeof(yystack));
    578  1.1  christos #endif
    579  1.1  christos 
    580  1.1  christos     if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
    581  1.1  christos     yystack.s_mark = yystack.s_base;
    582  1.1  christos     yystack.l_mark = yystack.l_base;
    583  1.1  christos     yystate = 0;
    584  1.1  christos     *yystack.s_mark = 0;
    585  1.1  christos 
    586  1.1  christos yyloop:
    587  1.1  christos     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
    588  1.1  christos     if (yychar < 0)
    589  1.1  christos     {
    590  1.2  christos         yychar = YYLEX;
    591  1.2  christos         if (yychar < 0) yychar = YYEOF;
    592  1.1  christos #if YYDEBUG
    593  1.1  christos         if (yydebug)
    594  1.1  christos         {
    595  1.2  christos             if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
    596  1.1  christos             printf("%sdebug: state %d, reading %d (%s)\n",
    597  1.1  christos                     YYPREFIX, yystate, yychar, yys);
    598  1.1  christos         }
    599  1.1  christos #endif
    600  1.1  christos     }
    601  1.2  christos     if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
    602  1.2  christos             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
    603  1.1  christos     {
    604  1.1  christos #if YYDEBUG
    605  1.1  christos         if (yydebug)
    606  1.1  christos             printf("%sdebug: state %d, shifting to state %d\n",
    607  1.1  christos                     YYPREFIX, yystate, yytable[yyn]);
    608  1.1  christos #endif
    609  1.2  christos         if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
    610  1.1  christos         yystate = yytable[yyn];
    611  1.1  christos         *++yystack.s_mark = yytable[yyn];
    612  1.1  christos         *++yystack.l_mark = yylval;
    613  1.1  christos         yychar = YYEMPTY;
    614  1.1  christos         if (yyerrflag > 0)  --yyerrflag;
    615  1.1  christos         goto yyloop;
    616  1.1  christos     }
    617  1.2  christos     if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
    618  1.2  christos             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
    619  1.1  christos     {
    620  1.1  christos         yyn = yytable[yyn];
    621  1.1  christos         goto yyreduce;
    622  1.1  christos     }
    623  1.2  christos     if (yyerrflag != 0) goto yyinrecovery;
    624  1.1  christos 
    625  1.1  christos     YYERROR_CALL("syntax error");
    626  1.1  christos 
    627  1.2  christos     goto yyerrlab; /* redundant goto avoids 'unused label' warning */
    628  1.1  christos yyerrlab:
    629  1.1  christos     ++yynerrs;
    630  1.1  christos 
    631  1.1  christos yyinrecovery:
    632  1.1  christos     if (yyerrflag < 3)
    633  1.1  christos     {
    634  1.1  christos         yyerrflag = 3;
    635  1.1  christos         for (;;)
    636  1.1  christos         {
    637  1.2  christos             if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
    638  1.2  christos                     yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
    639  1.1  christos             {
    640  1.1  christos #if YYDEBUG
    641  1.1  christos                 if (yydebug)
    642  1.1  christos                     printf("%sdebug: state %d, error recovery shifting\
    643  1.1  christos  to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
    644  1.1  christos #endif
    645  1.2  christos                 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
    646  1.1  christos                 yystate = yytable[yyn];
    647  1.1  christos                 *++yystack.s_mark = yytable[yyn];
    648  1.1  christos                 *++yystack.l_mark = yylval;
    649  1.1  christos                 goto yyloop;
    650  1.1  christos             }
    651  1.1  christos             else
    652  1.1  christos             {
    653  1.1  christos #if YYDEBUG
    654  1.1  christos                 if (yydebug)
    655  1.1  christos                     printf("%sdebug: error recovery discarding state %d\n",
    656  1.1  christos                             YYPREFIX, *yystack.s_mark);
    657  1.1  christos #endif
    658  1.1  christos                 if (yystack.s_mark <= yystack.s_base) goto yyabort;
    659  1.1  christos                 --yystack.s_mark;
    660  1.1  christos                 --yystack.l_mark;
    661  1.1  christos             }
    662  1.1  christos         }
    663  1.1  christos     }
    664  1.1  christos     else
    665  1.1  christos     {
    666  1.1  christos         if (yychar == YYEOF) goto yyabort;
    667  1.1  christos #if YYDEBUG
    668  1.1  christos         if (yydebug)
    669  1.1  christos         {
    670  1.2  christos             if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
    671  1.1  christos             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
    672  1.1  christos                     YYPREFIX, yystate, yychar, yys);
    673  1.1  christos         }
    674  1.1  christos #endif
    675  1.1  christos         yychar = YYEMPTY;
    676  1.1  christos         goto yyloop;
    677  1.1  christos     }
    678  1.1  christos 
    679  1.1  christos yyreduce:
    680  1.1  christos #if YYDEBUG
    681  1.1  christos     if (yydebug)
    682  1.1  christos         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
    683  1.1  christos                 YYPREFIX, yystate, yyn, yyrule[yyn]);
    684  1.1  christos #endif
    685  1.1  christos     yym = yylen[yyn];
    686  1.2  christos     if (yym > 0)
    687  1.1  christos         yyval = yystack.l_mark[1-yym];
    688  1.1  christos     else
    689  1.1  christos         memset(&yyval, 0, sizeof yyval);
    690  1.2  christos 
    691  1.1  christos     switch (yyn)
    692  1.1  christos     {
    693  1.1  christos case 3:
    694  1.1  christos #line 57 "calc1.y"
    695  1.1  christos 	{
    696  1.1  christos 		(void) printf("%15.8f\n", yystack.l_mark[-1].dval);
    697  1.1  christos 	}
    698  1.5  christos #line 697 "calc1.tab.c"
    699  1.1  christos break;
    700  1.1  christos case 4:
    701  1.1  christos #line 61 "calc1.y"
    702  1.1  christos 	{
    703  1.1  christos 		(void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
    704  1.1  christos 	}
    705  1.5  christos #line 704 "calc1.tab.c"
    706  1.1  christos break;
    707  1.1  christos case 5:
    708  1.1  christos #line 65 "calc1.y"
    709  1.1  christos 	{
    710  1.1  christos 		dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
    711  1.1  christos 	}
    712  1.5  christos #line 711 "calc1.tab.c"
    713  1.1  christos break;
    714  1.1  christos case 6:
    715  1.1  christos #line 69 "calc1.y"
    716  1.1  christos 	{
    717  1.1  christos 		vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
    718  1.1  christos 	}
    719  1.5  christos #line 718 "calc1.tab.c"
    720  1.1  christos break;
    721  1.1  christos case 7:
    722  1.1  christos #line 73 "calc1.y"
    723  1.1  christos 	{
    724  1.1  christos 		yyerrok;
    725  1.1  christos 	}
    726  1.5  christos #line 725 "calc1.tab.c"
    727  1.1  christos break;
    728  1.1  christos case 9:
    729  1.1  christos #line 80 "calc1.y"
    730  1.1  christos 	{
    731  1.1  christos 		yyval.dval = dreg[yystack.l_mark[0].ival];
    732  1.1  christos 	}
    733  1.5  christos #line 732 "calc1.tab.c"
    734  1.1  christos break;
    735  1.1  christos case 10:
    736  1.1  christos #line 84 "calc1.y"
    737  1.1  christos 	{
    738  1.1  christos 		yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
    739  1.1  christos 	}
    740  1.5  christos #line 739 "calc1.tab.c"
    741  1.1  christos break;
    742  1.1  christos case 11:
    743  1.1  christos #line 88 "calc1.y"
    744  1.1  christos 	{
    745  1.1  christos 		yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
    746  1.1  christos 	}
    747  1.5  christos #line 746 "calc1.tab.c"
    748  1.1  christos break;
    749  1.1  christos case 12:
    750  1.1  christos #line 92 "calc1.y"
    751  1.1  christos 	{
    752  1.1  christos 		yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
    753  1.1  christos 	}
    754  1.5  christos #line 753 "calc1.tab.c"
    755  1.1  christos break;
    756  1.1  christos case 13:
    757  1.1  christos #line 96 "calc1.y"
    758  1.1  christos 	{
    759  1.1  christos 		yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
    760  1.1  christos 	}
    761  1.5  christos #line 760 "calc1.tab.c"
    762  1.1  christos break;
    763  1.1  christos case 14:
    764  1.1  christos #line 100 "calc1.y"
    765  1.1  christos 	{
    766  1.1  christos 		yyval.dval = -yystack.l_mark[0].dval;
    767  1.1  christos 	}
    768  1.5  christos #line 767 "calc1.tab.c"
    769  1.1  christos break;
    770  1.1  christos case 15:
    771  1.1  christos #line 104 "calc1.y"
    772  1.1  christos 	{
    773  1.1  christos 		yyval.dval = yystack.l_mark[-1].dval;
    774  1.1  christos 	}
    775  1.5  christos #line 774 "calc1.tab.c"
    776  1.1  christos break;
    777  1.1  christos case 16:
    778  1.1  christos #line 110 "calc1.y"
    779  1.1  christos 	{
    780  1.1  christos 		yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
    781  1.1  christos 	}
    782  1.5  christos #line 781 "calc1.tab.c"
    783  1.1  christos break;
    784  1.1  christos case 17:
    785  1.1  christos #line 114 "calc1.y"
    786  1.1  christos 	{
    787  1.1  christos 		yyval.vval.lo = yystack.l_mark[-3].dval;
    788  1.1  christos 		yyval.vval.hi = yystack.l_mark[-1].dval;
    789  1.1  christos 		if ( yyval.vval.lo > yyval.vval.hi )
    790  1.1  christos 		{
    791  1.1  christos 			(void) printf("interval out of order\n");
    792  1.1  christos 			YYERROR;
    793  1.1  christos 		}
    794  1.1  christos 	}
    795  1.5  christos #line 794 "calc1.tab.c"
    796  1.1  christos break;
    797  1.1  christos case 18:
    798  1.1  christos #line 124 "calc1.y"
    799  1.1  christos 	{
    800  1.1  christos 		yyval.vval = vreg[yystack.l_mark[0].ival];
    801  1.1  christos 	}
    802  1.5  christos #line 801 "calc1.tab.c"
    803  1.1  christos break;
    804  1.1  christos case 19:
    805  1.1  christos #line 128 "calc1.y"
    806  1.1  christos 	{
    807  1.1  christos 		yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
    808  1.1  christos 		yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
    809  1.1  christos 	}
    810  1.5  christos #line 809 "calc1.tab.c"
    811  1.1  christos break;
    812  1.1  christos case 20:
    813  1.1  christos #line 133 "calc1.y"
    814  1.1  christos 	{
    815  1.1  christos 		yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
    816  1.1  christos 		yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
    817  1.1  christos 	}
    818  1.5  christos #line 817 "calc1.tab.c"
    819  1.1  christos break;
    820  1.1  christos case 21:
    821  1.1  christos #line 138 "calc1.y"
    822  1.1  christos 	{
    823  1.1  christos 		yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
    824  1.1  christos 		yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
    825  1.1  christos 	}
    826  1.5  christos #line 825 "calc1.tab.c"
    827  1.1  christos break;
    828  1.1  christos case 22:
    829  1.1  christos #line 143 "calc1.y"
    830  1.1  christos 	{
    831  1.1  christos 		yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
    832  1.1  christos 		yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
    833  1.1  christos 	}
    834  1.5  christos #line 833 "calc1.tab.c"
    835  1.1  christos break;
    836  1.1  christos case 23:
    837  1.1  christos #line 148 "calc1.y"
    838  1.1  christos 	{
    839  1.1  christos 		yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
    840  1.1  christos 	}
    841  1.5  christos #line 840 "calc1.tab.c"
    842  1.1  christos break;
    843  1.1  christos case 24:
    844  1.1  christos #line 152 "calc1.y"
    845  1.1  christos 	{
    846  1.1  christos 		yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
    847  1.1  christos 	}
    848  1.5  christos #line 847 "calc1.tab.c"
    849  1.1  christos break;
    850  1.1  christos case 25:
    851  1.1  christos #line 156 "calc1.y"
    852  1.1  christos 	{
    853  1.1  christos 		if (dcheck(yystack.l_mark[0].vval)) YYERROR;
    854  1.1  christos 		yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
    855  1.1  christos 	}
    856  1.5  christos #line 855 "calc1.tab.c"
    857  1.1  christos break;
    858  1.1  christos case 26:
    859  1.1  christos #line 161 "calc1.y"
    860  1.1  christos 	{
    861  1.1  christos 		if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
    862  1.1  christos 		yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
    863  1.1  christos 	}
    864  1.5  christos #line 863 "calc1.tab.c"
    865  1.1  christos break;
    866  1.1  christos case 27:
    867  1.1  christos #line 166 "calc1.y"
    868  1.1  christos 	{
    869  1.1  christos 		yyval.vval.hi = -yystack.l_mark[0].vval.lo;
    870  1.1  christos 		yyval.vval.lo = -yystack.l_mark[0].vval.hi;
    871  1.1  christos 	}
    872  1.5  christos #line 871 "calc1.tab.c"
    873  1.1  christos break;
    874  1.1  christos case 28:
    875  1.1  christos #line 171 "calc1.y"
    876  1.1  christos 	{
    877  1.1  christos 		yyval.vval = yystack.l_mark[-1].vval;
    878  1.1  christos 	}
    879  1.5  christos #line 878 "calc1.tab.c"
    880  1.1  christos break;
    881  1.5  christos #line 880 "calc1.tab.c"
    882  1.1  christos     }
    883  1.1  christos     yystack.s_mark -= yym;
    884  1.1  christos     yystate = *yystack.s_mark;
    885  1.1  christos     yystack.l_mark -= yym;
    886  1.1  christos     yym = yylhs[yyn];
    887  1.1  christos     if (yystate == 0 && yym == 0)
    888  1.1  christos     {
    889  1.1  christos #if YYDEBUG
    890  1.1  christos         if (yydebug)
    891  1.1  christos             printf("%sdebug: after reduction, shifting from state 0 to\
    892  1.1  christos  state %d\n", YYPREFIX, YYFINAL);
    893  1.1  christos #endif
    894  1.1  christos         yystate = YYFINAL;
    895  1.1  christos         *++yystack.s_mark = YYFINAL;
    896  1.1  christos         *++yystack.l_mark = yyval;
    897  1.1  christos         if (yychar < 0)
    898  1.1  christos         {
    899  1.2  christos             yychar = YYLEX;
    900  1.2  christos             if (yychar < 0) yychar = YYEOF;
    901  1.1  christos #if YYDEBUG
    902  1.1  christos             if (yydebug)
    903  1.1  christos             {
    904  1.2  christos                 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
    905  1.1  christos                 printf("%sdebug: state %d, reading %d (%s)\n",
    906  1.1  christos                         YYPREFIX, YYFINAL, yychar, yys);
    907  1.1  christos             }
    908  1.1  christos #endif
    909  1.1  christos         }
    910  1.1  christos         if (yychar == YYEOF) goto yyaccept;
    911  1.1  christos         goto yyloop;
    912  1.1  christos     }
    913  1.2  christos     if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
    914  1.2  christos             yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
    915  1.1  christos         yystate = yytable[yyn];
    916  1.1  christos     else
    917  1.1  christos         yystate = yydgoto[yym];
    918  1.1  christos #if YYDEBUG
    919  1.1  christos     if (yydebug)
    920  1.1  christos         printf("%sdebug: after reduction, shifting from state %d \
    921  1.1  christos to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
    922  1.1  christos #endif
    923  1.2  christos     if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
    924  1.1  christos     *++yystack.s_mark = (YYINT) yystate;
    925  1.1  christos     *++yystack.l_mark = yyval;
    926  1.1  christos     goto yyloop;
    927  1.1  christos 
    928  1.1  christos yyoverflow:
    929  1.1  christos     YYERROR_CALL("yacc stack overflow");
    930  1.1  christos 
    931  1.1  christos yyabort:
    932  1.1  christos     yyfreestack(&yystack);
    933  1.1  christos     return (1);
    934  1.1  christos 
    935  1.1  christos yyaccept:
    936  1.1  christos     yyfreestack(&yystack);
    937  1.1  christos     return (0);
    938  1.1  christos }
    939