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