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