%{ int yylex(void); int yyerror(char *s); #define YYSTYPE glrNode* #include #include "../glrSymbolTable.h" #include "../glrForest.h" istream *input; glrNode *root=NULL; int iToken=0; glrSymbolTable symbols; map terminals; deque succ; %} %token NUM %token PL %token MI %token KR %token LO %token LZ %token PZ %% exp: exp PL texp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);succ.push_back($3);$$=new glrNonterminalNode(7,succ);root=$$;} | exp MI texp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);succ.push_back($3);$$=new glrNonterminalNode(7,succ);root=$$;} | texp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(7,succ);root=$$;} ; texp: texp KR fexp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);succ.push_back($3);$$=new glrNonterminalNode(8,succ);} | texp LO fexp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);succ.push_back($3);$$=new glrNonterminalNode(8,succ);} | fexp {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(8,succ);} ; fexp: NUM {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(9,succ);} | MI NUM {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);$$=new glrNonterminalNode(9,succ);} | LZ exp PZ {for(deque::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);succ.push_back($3);$$=new glrNonterminalNode(9,succ);} ; %% #include int yylex(void){ int ret=0; glrTerminal *terminal=new glrTerminal; (*input) >> (*terminal); if(terminal->size()){ ++iToken; yylval=new glrTerminalNode(terminals[(*terminal)],terminal,iToken); ret=terminals[(*terminal)]+257; } terminal->release(); return ret; } int main(int argc,char**argv){ terminals["0"]=symbols.addSymbol("NUM"); terminals["1"]=symbols.addSymbol("NUM"); terminals["2"]=symbols.addSymbol("NUM"); terminals["3"]=symbols.addSymbol("NUM"); terminals["4"]=symbols.addSymbol("NUM"); terminals["5"]=symbols.addSymbol("NUM"); terminals["6"]=symbols.addSymbol("NUM"); terminals["7"]=symbols.addSymbol("NUM"); terminals["8"]=symbols.addSymbol("NUM"); terminals["9"]=symbols.addSymbol("NUM"); terminals["+"]=symbols.addSymbol("PL"); terminals["-"]=symbols.addSymbol("MI"); terminals["*"]=symbols.addSymbol("KR"); terminals["/"]=symbols.addSymbol("LO"); terminals["("]=symbols.addSymbol("LZ"); terminals[")"]=symbols.addSymbol("PZ"); symbols.addSymbol("exp"); symbols.addSymbol("texp"); symbols.addSymbol("fexp"); int times=50000; time_t start_time,end_time,rep; time(&start_time); for(rep=0;reprelease(); } time(&end_time); cerr << "input parsed " << times << " times in " << end_time-start_time << " seconds " << endl; glrForest *forest=root->getSubtree(symbols); forest->print(cout); delete forest; } int yyerror(char *s){ printf("%s\n",s); }