1 %{
2 
3 int yylex(void);
4 int yyerror(char *s);
5 
6 #define YYSTYPE glrNode*
7 
8 #include <fstream>
9 
10 #include "../glrSymbolTable.h"
11 #include "../glrForest.h"
12 
13 istream *input;
14 glrNode *root=NULL;
15 int iToken=0;
16 glrSymbolTable symbols;
17 map<string,int> terminals;
18 deque<glrNode*> succ;
19 
20 %}
21 
22 %token NUM
23 %token PL
24 %token MI
25 %token KR
26 %token LO
27 %token LZ
28 %token PZ
29 
30 %%
31 
32 exp:   exp PL texp {for(deque<glrNode*>::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=$$;}
33      | exp MI texp {for(deque<glrNode*>::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=$$;}
34      | texp {for(deque<glrNode*>::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(7,succ);root=$$;} ;
35 
36 texp:   texp KR fexp {for(deque<glrNode*>::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);}
37       | texp LO fexp {for(deque<glrNode*>::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);}
38       | fexp {for(deque<glrNode*>::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(8,succ);} ;
39 
40 fexp:   NUM {for(deque<glrNode*>::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);$$=new glrNonterminalNode(9,succ);}
41       | MI NUM {for(deque<glrNode*>::iterator i=succ.begin();i!=succ.end();(*i)->release(),++i);succ.clear();succ.push_back($1);succ.push_back($2);$$=new glrNonterminalNode(9,succ);}
42       | LZ exp PZ {for(deque<glrNode*>::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);} ;
43 
44 %%
45 
46 #include<stdio.h>
47 
48 int yylex(void){
49   int ret=0;
50   glrTerminal *terminal=new glrTerminal;
51   (*input) >> (*terminal);
52   if(terminal->size()){
53     ++iToken;
54     yylval=new glrTerminalNode(terminals[(*terminal)],terminal,iToken);
55     ret=terminals[(*terminal)]+257;
56   }
57   terminal->release();
58   return ret;
59 }
60 
main(int argc,char ** argv)61 int main(int argc,char**argv){
62   terminals["0"]=symbols.addSymbol("NUM");
63   terminals["1"]=symbols.addSymbol("NUM");
64   terminals["2"]=symbols.addSymbol("NUM");
65   terminals["3"]=symbols.addSymbol("NUM");
66   terminals["4"]=symbols.addSymbol("NUM");
67   terminals["5"]=symbols.addSymbol("NUM");
68   terminals["6"]=symbols.addSymbol("NUM");
69   terminals["7"]=symbols.addSymbol("NUM");
70   terminals["8"]=symbols.addSymbol("NUM");
71   terminals["9"]=symbols.addSymbol("NUM");
72   terminals["+"]=symbols.addSymbol("PL");
73   terminals["-"]=symbols.addSymbol("MI");
74   terminals["*"]=symbols.addSymbol("KR");
75   terminals["/"]=symbols.addSymbol("LO");
76   terminals["("]=symbols.addSymbol("LZ");
77   terminals[")"]=symbols.addSymbol("PZ");
78   symbols.addSymbol("exp");
79   symbols.addSymbol("texp");
80   symbols.addSymbol("fexp");
81 
82   int times=50000;
83   time_t start_time,end_time,rep;
84   time(&start_time);
85   for(rep=0;rep<times;++rep){
86     input=new ifstream("vyraz");
87     yyparse();
88     delete input;
89     if(rep!=times-1)root->release();
90   }
91   time(&end_time);
92   cerr << "input parsed " << times << " times in " << end_time-start_time << " seconds " << endl;
93   glrForest *forest=root->getSubtree(symbols);
94   forest->print(cout);
95   delete forest;
96 }
97 
yyerror(char * s)98 int yyerror(char *s){
99   printf("%s\n",s);
100 }
101