The DejaVU Framework -- hush 3.0
[.] Papers Tutorials Examples Manuals Interfaces Sources Packages Resources ?

source: yacc.c hush-3.1/grammar/ml/abc


[.] - [up] [top] - index text make include source grammar scripts slides talks
  #line 1 <yacc.c>
  extern "C" {  extern char *malloc(int), *realloc(char*,int); }
  extern "C" {  extern void free(void*); }
  # define A 257
  # define B 258
  
  //  line 3 "tmp.yacc.y"
  include "grammar/yacc.h"
  inline ostream& operator<<(ostream& c, token& t) { c << t.str(); return c; }
  define yyclearin yychar = -1
  define yyerrok yyerrflag = 0
  // extern int yychar;
  // extern int yyerrflag;
  ifndef YYMAXDEPTH
  define YYMAXDEPTH 150
  endif
  ifndef YYSTYPE
  define YYSTYPE token
  endif
  // YYSTYPE yylval, yyval;
  # define YYERRCODE 256
  
  //  line 13 "tmp.yacc.y"
  
  static int yyexca[] ={
  -1, 1,
          0, -1,
          -2, 0,
          };
  # define YYNPROD 6
  # define YYLAST 9
  static int yyact[]={
  
       2,     3,     1,     5,     4,     0,     0,     6,     7 };
  static int yypact[]={
  
    -257, -1000, -1000, -1000,  -257,  -257, -1000, -1000 };
  static int yypgo[]={
  
       0,     2,     4,     3 };
  static int yyr1[]={
  
       0,     1,     2,     1,     3,     1 };
  static int yyr2[]={
  
       0,     1,     1,     6,     1,     6 };
  static int yychk[]={
  
   -1000,    -1,   257,   258,    -2,    -3,    -1,    -1 };
  static int yydef[]={
  
       1,    -2,     2,     4,     1,     1,     3,     5 };
  // typedef struct { char *t_name; int t_val; } yytoktype;
  ifndef YYDEBUG
  #        define YYDEBUG        0        /* don't allow debugging */
  endif
  
  if YYDEBUG
  
  static yytoktype yytoks[] =
  {
          "A",        257,
          "B",        258,
          "-unknown-",        -1        /* ends search */
  };
  
  static char * yyreds[] =
  {
          "-no such reduction-",
          "sequence : /* empty */",
          "sequence : A",
          "sequence : A sequence",
          "sequence : B",
          "sequence : B sequence",
  };
  endif /* YYDEBUG */
  // line 1 "/usr/lib/yaccpar"
  /*	@(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10	*/
  
  /*
  ** Skeleton parser driver for yacc output
  */
  
  /*
  ** yacc user known macros and defines
  */
  define YYERROR                goto yyerrlab
  define YYACCEPT { free(yys); free(yyv); YYSTYPE t(0); return t; /* return YYSTYPE(0); */ }
  define YYABORT { free(yys); free(yyv); return YYSTYPE(1); }
  define YYBACKUP( newtoken, newvalue )\
  {\
          if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
          {\
                  yyerror( "syntax error - cannot backup" );\
                  goto yyerrlab;\
          }\
          yychar = newtoken;\
          yystate = *yyps;\
          yylval = newvalue;\
          goto yynewstate;\
  }
  define YYRECOVERING()        (!!yyerrflag)
  ifndef YYDEBUG
  #        define YYDEBUG        1        /* make debugging available */
  endif
  
  /*
  ** user known globals
  */
  // int yydebug;                        /* set to 1 to get debugging */
  
  /*
  ** driver internal defines
  */
  define YYFLAG                (-1000)
  
  /*
  ** static variables used by the parser
  */
  // static YYSTYPE *yyv;                        /* value stack */
  // static int *yys;                        /* state stack */
  // 
  // static YYSTYPE *yypv;                        /* top of value stack */
  // static int *yyps;                        /* top of state stack */
  // 
  // static int yystate;                        /* current state */
  // static int yytmp;                        /* extra var (lasts between blocks) */
  // 
  // // int yynerrs;                        /* number of errors */
  // 
  // int yyerrflag;                        /* error recovery flag */
  // int yychar;                        /* current input token number */
  // 
  
  /*
  ** yyparse - return 0 if worked, 1 if syntax error not recovered from
  */
  
  ifndef NAME
  define NAME yacc
  endif
  
  ifndef YYRTYPE
  define YYRTYPE int
  endif
  YYSTYPE NAME::yyparse()
  {
          register YYSTYPE *yypvt;        /* top of value stack for vars */
          unsigned yymaxdepth = YYMAXDEPTH;
  
          /*
  	** Initialize externals - yyparse may be called more than once
  	*/
          yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE));
          yys = (int*)malloc(yymaxdepth*sizeof(int));
          if (!yyv || !yys)
          {
                  yyerror( "out of memory" );
                  return(1);
          }
          yypv = &yyv[-1];
          yyps = &yys[-1];
          yystate = 0;
          yytmp = 0;
          yynerrs = 0;
          yyerrflag = 0;
          yychar = -1;
  
          goto yystack;
          {
                  register YYSTYPE *yy_pv;        /* top of value stack */
                  register int *yy_ps;                /* top of state stack */
                  register int yy_state;                /* current state */
                  register int  yy_n;                /* internal state number info */
  
                  /*
  		** get globals into registers.
  		** branch to here only if YYBACKUP was called.
  		*/
          yynewstate:
                  yy_pv = yypv;
                  yy_ps = yyps;
                  yy_state = yystate;
                  goto yy_newstate;
  
                  /*
  		** get globals into registers.
  		** either we just started, or we just finished a reduction
  		*/
          yystack:
                  yy_pv = yypv;
                  yy_ps = yyps;
                  yy_state = yystate;
  
                  /*
  		** top of for (;;) loop while no reductions done
  		*/
          yy_stack:
                  /*
  		** put a state and value onto the stacks
  		*/
  if YYDEBUG
                  /*
  		** if debugging, look up token value in list of value vs.
  		** name pairs.  0 and negative (-1) are special values.
  		** Note: linear search is used since time is not a real
  		** consideration while debugging.
  		*/
                  if ( yydebug )
                  {
                          register int yy_i;
  
                          (void)printf( "State %d, token ", yy_state );
                          if ( yychar == 0 )
                                  (void)printf( "end-of-file\n" );
                          else if ( yychar < 0 )
                                  (void)printf( "-none-\n" );
                          else
                          {
                                  for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
                                          yy_i++ )
                                  {
                                          if ( yytoks[yy_i].t_val == yychar )
                                                  break;
                                  }
                                  (void)printf( "%s\n", yytoks[yy_i].t_name );
                          }
                  }
  endif /* YYDEBUG */
                  if ( ++yy_ps >= &yys[ yymaxdepth ] )        /* room on stack? */
                  {
                          /*
  			** reallocate and recover.  Note that pointers
  			** have to be reset, or bad things will happen
  			*/
                          int yyps_index = (yy_ps - yys);
                          int yypv_index = (yy_pv - yyv);
                          int yypvt_index = (yypvt - yyv);
                          yymaxdepth += YYMAXDEPTH;
                          yyv = (YYSTYPE*)realloc((char*)yyv,
                                  yymaxdepth * sizeof(YYSTYPE));
                          yys = (int*)realloc((char*)yys,
                                  yymaxdepth * sizeof(int));
                          if (!yyv || !yys)
                          {
                                  yyerror( "yacc stack overflow" );
                                  return(1);
                          }
                          yy_ps = yys + yyps_index;
                          yy_pv = yyv + yypv_index;
                          yypvt = yyv + yypvt_index;
                  }
  		*yy_ps = yy_state;
  		*++yy_pv = yyval;
  
                  /*
  		** we have a new state - find out what to do
  		*/
          yy_newstate:
                  if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
                          goto yydefault;                /* simple state */
  if YYDEBUG
                  /*
  		** if debugging, need to mark whether new token grabbed
  		*/
                  yytmp = yychar < 0;
  endif
                  if ( ( yychar < 0 ) && ( ( yychar = ( yylval = (*yylex)() ) ) < 0 ) )
                          yychar = 0;                /* reached EOF */
  if YYDEBUG
                  if ( yydebug && yytmp )
                  {
                          register int yy_i;
  
                          (void)printf( "Received token " );
                          if ( yychar == 0 )
                                  (void)printf( "end-of-file\n" );
                          else if ( yychar < 0 )
                                  (void)printf( "-none-\n" );
                          else
                          {
                                  for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
                                          yy_i++ )
                                  {
                                          if ( yytoks[yy_i].t_val == yychar )
                                                  break;
                                  }
                                  (void)printf( "%s\n", yytoks[yy_i].t_name );
                          }
                  }
  endif /* YYDEBUG */
                  if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
                          goto yydefault;
                  if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar )        /*valid shift*/
                  {
                          yychar = -1;
                          yyval = yylval;
                          yy_state = yy_n;
                          if ( yyerrflag > 0 )
                                  yyerrflag--;
                          goto yy_stack;
                  }
  
          yydefault:
                  if ( ( yy_n = yydef[ yy_state ] ) == -2 )
                  {
  if YYDEBUG
                          yytmp = yychar < 0;
  endif
                          if ( ( yychar < 0 ) && ( ( yychar = ( yylval = (*yylex)() ) ) < 0 ) )
                                  yychar = 0;                /* reached EOF */
  if YYDEBUG
                          if ( yydebug && yytmp )
                          {
                                  register int yy_i;
  
                                  (void)printf( "Received token " );
                                  if ( yychar == 0 )
                                          (void)printf( "end-of-file\n" );
                                  else if ( yychar < 0 )
                                          (void)printf( "-none-\n" );
                                  else
                                  {
                                          for ( yy_i = 0;
                                                  yytoks[yy_i].t_val >= 0;
                                                  yy_i++ )
                                          {
                                                  if ( yytoks[yy_i].t_val
                                                          == yychar )
                                                  {
                                                          break;
                                                  }
                                          }
                                          (void)printf( "%s\n", yytoks[yy_i].t_name );
                                  }
                          }
  endif /* YYDEBUG */
                          /*
  			** look through exception table
  			*/
                          {
                                  register int *yyxi = yyexca;
  
                                  while ( ( *yyxi != -1 ) ||
                                          ( yyxi[1] != yy_state ) )
                                  {
                                          yyxi += 2;
                                  }
                                  while ( ( *(yyxi += 2) >= 0 ) &&
                                          ( *yyxi != yychar ) )
                                          ;
                                  if ( ( yy_n = yyxi[1] ) < 0 )
                                          YYACCEPT;
                          }
                  }
  
                  /*
  		** check for syntax error
  		*/
                  if ( yy_n == 0 )        /* have an error */
                  {
                          /* no worry about speed here! */
                          switch ( yyerrflag )
                          {
                          case 0:                /* new error */
                                  yyerror( "syntax error" );
                                  goto skip_init;
                          yyerrlab:
                                  /*
  				** get globals into registers.
  				** we have a user generated syntax type error
  				*/
                                  yy_pv = yypv;
                                  yy_ps = yyps;
                                  yy_state = yystate;
                                  yynerrs++;
                          skip_init:
                          case 1:
                          case 2:                /* incompletely recovered error */
                                          /* try again... */
                                  yyerrflag = 3;
                                  /*
  				** find state where "error" is a legal
  				** shift action
  				*/
                                  while ( yy_ps >= yys )
                                  {
                                          yy_n = yypact[ *yy_ps ] + YYERRCODE;
                                          if ( yy_n >= 0 && yy_n < YYLAST &&
                                                  yychk[yyact[yy_n]] == YYERRCODE)                                        {
                                                  /*
  						** simulate shift of "error"
  						*/
                                                  yy_state = yyact[ yy_n ];
                                                  goto yy_stack;
                                          }
                                          /*
  					** current state has no shift on
  					** "error", pop stack
  					*/
  if YYDEBUG
  #        define _POP_ "Error recovery pops state %d, uncovers state %d\n"
                                          if ( yydebug )
                                                  (void)printf( _POP_, *yy_ps,
                                                          yy_ps[-1] );
  #        undef _POP_
  endif
                                          yy_ps--;
                                          yy_pv--;
                                  }
                                  /*
  				** there is no state on stack with "error" as
  				** a valid shift.  give up.
  				*/
                                  YYABORT;
                          case 3:                /* no shift yet; eat a token */
  if YYDEBUG
                                  /*
  				** if debugging, look up token in list of
  				** pairs.  0 and negative shouldn't occur,
  				** but since timing doesn't matter when
  				** debugging, it doesn't hurt to leave the
  				** tests here.
  				*/
                                  if ( yydebug )
                                  {
                                          register int yy_i;
  
                                          (void)printf( "Error recovery discards " );
                                          if ( yychar == 0 )
                                                  (void)printf( "token end-of-file\n" );
                                          else if ( yychar < 0 )
                                                  (void)printf( "token -none-\n" );
                                          else
                                          {
                                                  for ( yy_i = 0;
                                                          yytoks[yy_i].t_val >= 0;
                                                          yy_i++ )
                                                  {
                                                          if ( yytoks[yy_i].t_val
                                                                  == yychar )
                                                          {
                                                                  break;
                                                          }
                                                  }
                                                  (void)printf( "token %s\n",
                                                          yytoks[yy_i].t_name );
                                          }
                                  }
  endif /* YYDEBUG */
                                  if ( yychar == 0 )        /* reached EOF. quit */
                                          YYABORT;
                                  yychar = -1;
                                  goto yy_newstate;
                          }
                  }/* end if ( yy_n == 0 ) */
                  /*
  		** reduction by production yy_n
  		** put stack tops, etc. so things right after switch
  		*/
  if YYDEBUG
                  /*
  		** if debugging, print the string that is the user's
  		** specification of the reduction which is just about
  		** to be done.
  		*/
                  if ( yydebug )
                          (void)printf( "Reduce by (%d) \"%s\"\n",
                                  yy_n, yyreds[ yy_n ] );
  endif
                  yytmp = yy_n;                        /* value to switch over */
                  yypvt = yy_pv;                        /* vars top of value stack */
                  /*
  		** Look in goto table for next state
  		** Sorry about using yy_state here as temporary
  		** register variable, but why not, if it works...
  		** If yyr2[ yy_n ] doesn't have the low order bit
  		** set, then there is no action to be done for
  		** this reduction.  So, no saving & unsaving of
  		** registers done.  The only difference between the
  		** code just after the if and the body of the if is
  		** the goto yy_stack in the body.  This way the test
  		** can be made before the choice of what to do is needed.
  		*/
                  {
                          /* length of production doubled with extra bit */
                          register int yy_len = yyr2[ yy_n ];
  
                          if ( !( yy_len & 01 ) )
                          {
                                  yy_len >>= 1;
                                  yyval = ( yy_pv -= yy_len )[1];        /* $$ = $1 */
                                  yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  					*( yy_ps -= yy_len ) + 1;
                                  if ( yy_state >= YYLAST ||
                                          yychk[ yy_state =
                                          yyact[ yy_state ] ] != -yy_n )
                                  {
                                          yy_state = yyact[ yypgo[ yy_n ] ];
                                  }
                                  goto yy_stack;
                          }
                          yy_len >>= 1;
                          yyval = ( yy_pv -= yy_len )[1];        /* $$ = $1 */
                          yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  				*( yy_ps -= yy_len ) + 1;
                          if ( yy_state >= YYLAST ||
                                  yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
                          {
                                  yy_state = yyact[ yypgo[ yy_n ] ];
                          }
                  }
                                          /* save until reenter driver code */
                  yystate = yy_state;
                  yyps = yy_ps;
                  yypv = yy_pv;
          }
          /*
  	** code supplied by user is placed in this switch
  	*/
          switch( yytmp )
          {
                  
  case 1:
  //  line 9 "tmp.yacc.y"
  { cout << "empty\n"; } break;
  case 2:
  //  line 10 "tmp.yacc.y"
  { cout << yypvt[-0].str() << " : A\n"; } break;
  case 4:
  //  line 11 "tmp.yacc.y"
  { cout << yypvt[-0] << " : B\n"; } break;
          }
          goto yystack;                /* reset registers in driver code */
  }
  

[.] Papers Tutorials Examples Manuals Interfaces Sources Packages Resources ?
Hush Online Technology
hush@cs.vu.nl
11/03/98