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