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)14visitorgenvisitor2::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()24visitorgenvisitor2::~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)30void 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)35void 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)45void 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)50void 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)57void 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)113void 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)120void 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)125void 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)130void 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)137void 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)152void 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)159void 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)167void 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)172void 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)179void 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