yacc_parser


  class yacc_parser : public parser {
  protected:
  
  yacc_parser() { }
  
  public:
  
  yacc_parser(iter<term>* l) : parser(this) {
  yyiter = l;
  yychar = -1;
  if YYMAXDEPTH > 0
  yys =  yy_yys;
  yyv =  yy_yyv;
  endif
  yystate = 0;
  }
  
  /*
  yacc_parser(scanner* l) : parser(this) {
  _scanner = l;
  yyiter = l;
  yychar = -1;
  if YYMAXDEPTH > 0
  yys =  yy_yys;
  yyv =  yy_yyv;
  endif
  } */
  
  //AE: iter<term>* yyiter;
  
  if YYMAXDEPTH > 0
  int yy_yys[YYMAXDEPTH];
  YYSTYPE yy_yyv[YYMAXDEPTH];
  endif
  
  int *yys;
  YYSTYPE *yyv;
  
  ifdef YYNMBCHARS
  int yycvtok(int i);
  endif
  
  YYSTYPE *yypv;                   /* top of value stack */
  int *yyps;                       /* top of state stack */
  
  int yystate;                     /* current state */
  int yytmp;                       /* extra var (lasts between blocks) */
  
  int yynerrs;                    /* number of errors */
  
  int yyerrflag;                  /* error recovery flag */
  int yychar;                     /* current input token number */
  
  // added for enabling garbage collection when sending a result
  void release()  { free(yys); free(yyv); } 
  // May be defined with -e option of ooyacc -- see documentation 
  virtual void yyerror(char* s); 
  virtual char* error() { return "syntax error"; }
  public:
  //AE: YYSTYPE yylval;
  //AE: YYSTYPE yyval;
  
  virtual int obsolete_yylex() {
          term* x = (*yyiter)();
          yylval = (term*) x;
          return (int) yylval->n;;
          }
  
  virtual term* operator()() {
          cerr << "ERROR: parser::()" << endl;
          return 0;
          }
  int yydebug;
  };

slide: yacc_parser