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