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)11 Node::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)23 LiteralExpression::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)39 IdentifierExpression::dump( int level ) {
40     dumpPrefix( level );
41     std::cout << "var(" << var->type->name() << ":" << var->id << ")"<< std::endl;
42 }
43 
44 void
dump(int level)45 UnaryExpression::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)52 BinaryExpression::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)60 ConditionalExpression::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)78 AssignmentExpression::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)86 FunctionCall::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)95 UnaryFunction::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)106 ConditionalStatement::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)133 Return::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)141 PlainText::dump( int level ) {
142     dumpPrefix( level );
143     std::cout << "plaintext: " << text << std::endl;
144 }
145 
146 void
dump(int level)147 PlainTextExpression::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)189 VariableDeclaration::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)196 ExpressionStatement::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)205 CompoundStatement::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)212 StatementList::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)220 FunctionDefinition::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)231 TranslationUnit::dump(int level ) {
232     global_statements->dump( level );
233     FOREACH_FUNCTION
234     (*it)->dump( level );
235 }
236 
237 }
238