ifndef GRAMMAR_PARSER_H define GRAMMAR_PARSER_H include <hush/ml/parser.h> //#include <hush/ml/scanner.h> include <hush/term.h> include <hush/iter.h> //AE #include <grammar/token.h> //#include <grammar/scanner.h> extern "C" { extern void free(void*); } ifndef yylex_defined define yylex_defined extern "C" { static int yylex() { return 0; } } endif typedef struct { char *t_name; int t_val; } yytoktype; ifndef YYSTYPE define YYSTYPE term* endif typedef int yytabelem; ifndef YYMAXDEPTH define YYMAXDEPTH 150 endif
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; };
inline void yacc_parser::yyerror(char* s) { _error = error(); yylval = mkterm("#error:",mkterm(_error)); cerr << _error << endl; //cerr << s << ": "; //error(); } endif
Hush Online Technology
hush@cs.vu.nl
11/03/98 |
![]() |
![]() |