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)11yaccgenvisitor1::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()21yaccgenvisitor1::~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)68void 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)74void 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)87void 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)92void 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)99void 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)136void 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)143void 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)148void 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)153void 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)160void 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)175void 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)182void 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)190void 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)199void 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)206void 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