1 #include "astgenvisitor2.h"
2 #include "ast.h"
3 #include "strutils.h"
4
5 #include <assert.h>
6 #include <iostream>
7
8 using std::vector;
9 using std::string;
10 using std::ios;
11
astgenvisitor2(const char * filename,const char * visitorFilename)12 astgenvisitor2::astgenvisitor2(const char* filename, const char* visitorFilename)
13 : m_out(filename, ios::app)
14 {
15 }
16
~astgenvisitor2()17 astgenvisitor2::~astgenvisitor2()
18 {
19 m_out << "#endif\n";
20 }
21
visit_lhs_IDENT_SEPARATOR(const lhs_IDENT_SEPARATOR * plhs_IDENT_SEPARATOR)22 void astgenvisitor2::visit_lhs_IDENT_SEPARATOR(const lhs_IDENT_SEPARATOR *plhs_IDENT_SEPARATOR)
23 {
24 m_rulename = *plhs_IDENT_SEPARATOR->m_IDENT;
25 }
26
visit_grammar_grammar_production(const grammar_grammar_production * pgrammar_grammar_production)27 void astgenvisitor2::visit_grammar_grammar_production(const grammar_grammar_production *pgrammar_grammar_production)
28 {
29 if (pgrammar_grammar_production->m_grammar.get() != 0) // start of the AST
30 {
31 pgrammar_grammar_production->m_grammar->accept(this);
32 }
33 pgrammar_grammar_production->m_production->accept(this);
34
35 }
36
visit_grammar_grammar_COMMENT(const grammar_grammar_COMMENT * pgrammar_grammar_COMMENT)37 void astgenvisitor2::visit_grammar_grammar_COMMENT(const grammar_grammar_COMMENT *pgrammar_grammar_COMMENT)
38 {
39 return;
40 }
41
visit_expression_base_OPT(const expression_base_OPT * pexpression_base_OPT)42 void astgenvisitor2::visit_expression_base_OPT(const expression_base_OPT *pexpression_base_OPT)
43 {
44 // not yet implemented
45 assert(0);
46 pexpression_base_OPT->m_base->accept(this);
47 }
48
visit_production_lhs_expressionListList_TERMINATOR(const production_lhs_expressionListList_TERMINATOR * pproduction_lhs_expressionListList_TERMINATOR)49 void astgenvisitor2::visit_production_lhs_expressionListList_TERMINATOR(const production_lhs_expressionListList_TERMINATOR *pproduction_lhs_expressionListList_TERMINATOR)
50 {
51
52 pproduction_lhs_expressionListList_TERMINATOR->m_lhs->accept(this);
53 // m_rulename is now set (by astgenvisitor2::visit_lhs_IDENT_SEPARATOR
54 if (!beginsWithStr(m_rulename))
55 {
56 if (pproduction_lhs_expressionListList_TERMINATOR->m_expressionListList.get() != 0)
57 {
58 if (pproduction_lhs_expressionListList_TERMINATOR->m_expressionListList->size() > 1)
59 {
60 if (!endsWithList(m_rulename))
61 {
62 for (vector<vector<expression*>*>::const_iterator i = pproduction_lhs_expressionListList_TERMINATOR->m_expressionListList->begin();
63 i != pproduction_lhs_expressionListList_TERMINATOR->m_expressionListList->end();
64 ++i)
65 {
66 if (*i)
67 {
68 write_destructor(i, false);
69 }
70 }
71 }
72 }
73 else
74 {
75 write_destructor(pproduction_lhs_expressionListList_TERMINATOR->m_expressionListList->begin(), true);
76 }
77 }
78 }
79 }
80
create_class_name(const vector<vector<expression * > * >::const_iterator i,vector<string> & idents)81 string astgenvisitor2::create_class_name(const vector<vector<expression*>*>::const_iterator i, vector<string>& idents)
82 {
83 // first build up the classname and gather the idents
84 string classname = m_rulename;
85 for (vector<expression*>::const_iterator j = (*i)->begin();
86 j != (*i)->end();
87 ++j)
88 {
89 m_literal.erase();
90 m_ident.erase();
91 (*j)->accept(this);
92 if (m_ident.length() > 0)
93 {
94 classname += "_" + m_ident;
95 idents.push_back(m_ident);
96 }
97 }
98 if ((*i)->size() == 0)
99 {
100 classname += "_empty";
101 }
102
103 return classname;
104 }
105
write_destructor(const vector<vector<expression * > * >::const_iterator i,bool simple)106 void astgenvisitor2::write_destructor(const vector<vector<expression*>*>::const_iterator i, bool simple)
107 {
108 // first build up the classname and gather the idents
109 vector<string> idents;
110 string classname;
111 if (simple)
112 {
113 create_class_name(i, idents);
114 classname = m_rulename;
115 }
116 else
117 classname = create_class_name(i, idents);
118
119 // write out the destructor
120 m_out << "inline " << classname << "::~" << classname << "()\n";
121 m_out << "{\n";
122 int arg_num = 1;
123 for (vector<string>::const_iterator i = idents.begin(); i!= idents.end(); ++i, ++arg_num)
124 {
125 if (endsWithList(*i))
126 {
127 m_out << "\twhile(!m_p" << *i << arg_num << "->empty())\n";
128 m_out << "\t{\n";
129 m_out << "\t\tdelete m_p" << *i << arg_num << "->front();\n";
130 m_out << "\t\tm_p" << *i << arg_num << "->pop_front();\n";
131 m_out << "\t}\n";
132 }
133 m_out << "\tdelete m_p" << *i << arg_num << ";\n";
134 }
135 m_out << "}\n\n";
136 }
137
visit_expression_base_PLUS(const expression_base_PLUS * pexpression_base_PLUS)138 void astgenvisitor2::visit_expression_base_PLUS(const expression_base_PLUS *pexpression_base_PLUS)
139 {
140 // not yet implemented
141 assert(0);
142 pexpression_base_PLUS->m_base->accept(this);
143 }
144
visit_expression_base(const expression_base * pexpression_base)145 void astgenvisitor2::visit_expression_base(const expression_base *pexpression_base)
146 {
147 pexpression_base->m_base->accept(this);
148 }
149
visit_base_LITERAL(const base_LITERAL * pbase_LITERAL)150 void astgenvisitor2::visit_base_LITERAL(const base_LITERAL *pbase_LITERAL)
151 {
152 m_literal = *pbase_LITERAL->m_LITERAL;
153 }
154
visit_expression_base_STAR(const expression_base_STAR * pexpression_base_STAR)155 void astgenvisitor2::visit_expression_base_STAR(const expression_base_STAR *pexpression_base_STAR)
156 {
157 // not yet implemented
158 assert(0);
159 pexpression_base_STAR->m_base->accept(this);
160 }
161
visit_base_LPAREN_expressionList_RPAREN(const base_LPAREN_expressionList_RPAREN * pbase_LPAREN_expressionList_RPAREN)162 void astgenvisitor2::visit_base_LPAREN_expressionList_RPAREN(const base_LPAREN_expressionList_RPAREN *pbase_LPAREN_expressionList_RPAREN)
163 {
164 // not yet implemented
165 assert(0);
166 if (pbase_LPAREN_expressionList_RPAREN->m_expressionList.get() != 0)
167 {
168 for (vector<expression*>::const_iterator i = pbase_LPAREN_expressionList_RPAREN->m_expressionList->begin();
169 i != pbase_LPAREN_expressionList_RPAREN->m_expressionList->end();
170 ++i)
171 {
172 (*i)->accept(this);
173 }
174 }
175 }
176
visit_expression_COMMENT(const expression_COMMENT * pexpression_COMMENT)177 void astgenvisitor2::visit_expression_COMMENT(const expression_COMMENT *pexpression_COMMENT)
178 {
179 // not yet implemented
180 assert(0);
181 (void)pexpression_COMMENT->m_COMMENT;
182 }
183
visit_alternation_expression_OR_expression(const alternation_expression_OR_expression * palternation_expression_OR_expression)184 void astgenvisitor2::visit_alternation_expression_OR_expression(const alternation_expression_OR_expression *palternation_expression_OR_expression)
185 {
186 // not yet implemented
187 assert(0);
188 palternation_expression_OR_expression->m_expression1->accept(this);
189 palternation_expression_OR_expression->m_expression2->accept(this);
190 }
191
visit_base_IDENT(const base_IDENT * pbase_IDENT)192 void astgenvisitor2::visit_base_IDENT(const base_IDENT *pbase_IDENT)
193 {
194 m_ident = *pbase_IDENT->m_IDENT;
195 }
196
visit_base_LPAREN_alternation_RPAREN(const base_LPAREN_alternation_RPAREN * pbase_LPAREN_alternation_RPAREN)197 void astgenvisitor2::visit_base_LPAREN_alternation_RPAREN(const base_LPAREN_alternation_RPAREN *pbase_LPAREN_alternation_RPAREN)
198 {
199 // not yet implemented
200 assert(0);
201 pbase_LPAREN_alternation_RPAREN->m_alternation->accept(this);
202 }
203
visit_alternation_alternation_OR_expression(const alternation_alternation_OR_expression * palternation_alternation_OR_expression)204 void astgenvisitor2::visit_alternation_alternation_OR_expression(const alternation_alternation_OR_expression *palternation_alternation_OR_expression)
205 {
206 // not yet implemented
207 assert(0);
208 palternation_alternation_OR_expression->m_alternation->accept(this);
209 palternation_alternation_OR_expression->m_expression->accept(this);
210 }
211
212
213