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