1 #include <cassert> 2 #include <iostream> 3 #include <sstream> 4 5 #include <FPG/AST.h> 6 #include <FPG/Error.h> 7 8 namespace AST { 9 10 void dumpPrefix(int level)11Node::dumpPrefix( int level ) 12 { 13 //int bla = level; 14 /*if( getType() != type_void ) { 15 while( bla-- ) std::cout << " "; 16 std::cout << "type: " << getType()->name() << std::endl; 17 bla = level; 18 }*/ 19 while( level-- ) std::cout << " "; 20 } 21 22 void dump(int level)23LiteralExpression::dump( int level ) { 24 dumpPrefix( level ); 25 switch(val.type) { 26 case Concrete_value::INTCONST : std::cout << "int(" << val.i << ")" << std::endl; break; 27 case Concrete_value::FLOATCONST: std::cout << "float(" << val.f << ")" << std::endl; break; 28 } 29 } 30 31 /* 32 void 33 StringLiteralExpression::dump( int level ) { 34 dumpPrefix( level ); 35 std::cout << "string literal at position " << offset << std::endl; 36 }*/ 37 38 void dump(int level)39IdentifierExpression::dump( int level ) { 40 dumpPrefix( level ); 41 std::cout << "var(" << var->type->name() << ":" << var->id << ")"<< std::endl; 42 } 43 44 void dump(int level)45UnaryExpression::dump( int level ) { 46 dumpPrefix( level ); 47 std::cout << "uexp " << operators[kind] << std::endl; 48 e->dump( level + 3 ); 49 } 50 51 void dump(int level)52BinaryExpression::dump( int level ) { 53 dumpPrefix( level ); 54 std::cout << "bexp " << operators[kind] << std::endl; 55 e1->dump( level + 3 ); 56 e2->dump( level + 3 ); 57 } 58 59 void dump(int level)60ConditionalExpression::dump( int level ) { 61 dumpPrefix( level ); 62 std::cout << "condexp"; 63 cond->dump ( level + 3); 64 e1->dump( level + 3 ); 65 e2->dump( level + 3 ); 66 } 67 68 /* 69 void 70 ArrayExpression::dump( int level ) { 71 dumpPrefix( level ); 72 std::cout << "array access" << std::endl; 73 a->dump( level + 3 ); 74 index->dump( level + 3 ); 75 }*/ 76 77 void dump(int level)78AssignmentExpression::dump( int level ) { 79 dumpPrefix( level ); 80 std::cout << " = " << std::endl; 81 e1->dump( level + 3 ); 82 e2->dump( level + 3 ); 83 } 84 85 void dump(int level)86FunctionCall::dump( int level ) { 87 dumpPrefix( level ); 88 assert( fun_type != nullptr ); 89 std::cout << "funcall " << fun_type->id << std::endl; 90 FOREACH_ARG 91 (*it)->dump( level + 3 ); 92 } 93 94 void dump(int level)95UnaryFunction::dump( int level ) { 96 dumpPrefix( level ); 97 switch( kind ) { 98 case XSIGN: std::cout << "sign" << std::endl; break; 99 case XSQRT: std::cout << "sqrt" << std::endl; break; 100 case XABS : std::cout << "fabs" << std::endl; break; 101 } 102 e->dump( level + 3 ); 103 } 104 105 void dump(int level)106ConditionalStatement::dump( int level ) { 107 dumpPrefix( level ); 108 std::cout << "if " << std::endl; 109 cond->dump( level + 3 ); 110 then_branch->dump( level + 3 ); 111 dumpPrefix( level + 3); 112 std::cout << "else" << std::endl; 113 cond->dump( level + 3 ); 114 if( else_branch != nullptr ) 115 else_branch->dump( level +3 ); 116 } 117 118 /* 119 void 120 SwitchStatement::dump( int level ) { 121 dumpPrefix( level ); 122 std::cout << "switch " << std::endl; 123 FOREACH_SWITCH_CASE { 124 dumpPrefix( level ); 125 std::cout << "case " << std::endl; 126 (*it)->first->dump( level + 3); 127 (*it)->second->dump( level + 3); 128 129 } 130 }*/ 131 132 void dump(int level)133Return::dump( int level ) { 134 dumpPrefix( level ); 135 std::cout << "return " << std::endl; 136 if(e) 137 e->dump(level+3); 138 } 139 140 void dump(int level)141PlainText::dump( int level ) { 142 dumpPrefix( level ); 143 std::cout << "plaintext: " << text << std::endl; 144 } 145 146 void dump(int level)147PlainTextExpression::dump( int level ) { 148 dumpPrefix( level ); 149 std::cout << "plaintextexpr " << text << std::endl; 150 } 151 152 /* 153 void 154 WhileLoop::dump( int level ) { 155 dumpPrefix( level ); 156 std::cout << "while (" <<std::endl; 157 if( cond ) cond->dump( level ); std::cout<<")"<<std::endl; 158 if( body ) body->dump( level + 3 ); 159 } 160 161 void 162 DoLoop::dump( int level ) { 163 dumpPrefix( level ); 164 std::cout << "do" <<std::endl; 165 if( body ) body->dump( level + 3 ); 166 std::cout << "while (" <<std::endl; 167 if( cond ) cond->dump( level ); std::cout<<")"<<std::endl; 168 } 169 170 void 171 ForLoop::dump( int level ) { 172 dumpPrefix( level ); 173 std::cout<< " for ( "<< std::endl; 174 if(init) init-> dump( level ); 175 if(cond) cond-> dump( level ); 176 if(iter) iter-> dump( level ); 177 dumpPrefix( level ); 178 std::cout<<")"<<std::endl; 179 if(body) body-> dump( level + 3 ); 180 } 181 182 void 183 Jump::dump( int level ) { 184 dumpPrefix( level ); 185 std::cout<< " jump "<<target<<std::endl; 186 }*/ 187 188 void dump(int level)189VariableDeclaration::dump( int level ) { 190 dumpPrefix( level ); 191 std::cout << "var declaration: " << var->type->name() << " " << var->id << std::endl; 192 } 193 194 195 void dump(int level)196ExpressionStatement::dump( int level ) { 197 dumpPrefix( level ); 198 std::cout << "expression statement " << std::endl; 199 if(e) 200 e->dump( level + 3 ); 201 else std::cout<< ";"<<std::endl; 202 } 203 204 void dump(int level)205CompoundStatement::dump( int level ) { 206 dumpPrefix( level ); 207 std::cout << "compound statement " << std::endl; 208 statements->dump( level + 3 ); 209 } 210 211 void dump(int level)212StatementList::dump( int level ) { 213 dumpPrefix( level ); 214 std::cout << "statement list" << std::endl; 215 FOREACH_STATEMENT 216 (*it)->dump( level + 3 ); 217 } 218 219 void dump(int level)220FunctionDefinition::dump( int level ) { 221 dumpPrefix( level ); 222 std::cout << "function definition: " << type->return_type->name() << " " << type->id << "("; 223 FOREACH_PARAMETER(type) 224 std::cout << (it == type->parameters.begin() ? "" : ", ") << (*it)->type->name() << " " << (*it)->id; 225 226 std::cout << ")" << std::endl; 227 body->dump( level + 3); 228 } 229 230 void dump(int level)231TranslationUnit::dump(int level ) { 232 global_statements->dump( level ); 233 FOREACH_FUNCTION 234 (*it)->dump( level ); 235 } 236 237 } 238