Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define CAST_START(Type) auto Type##_Var = dynamic_cast<Type*>(p); if(Type##_Var!=0) { auto fn = [&o](void*hiddenptr_){Type&v=*(Type*)hiddenptr_;
- #define CAST_END }; fn(p); }
- void doRExpr(ostream& o, RExpr*p);
- void doRVal(ostream& o, Rval*p){
- CAST_START(RExprToRval)
- doRExpr(o, v.expr);
- CAST_END
- CAST_START(VarRval)
- o << v.v;
- CAST_END
- CAST_START(IntLiteral)
- o << v.v;
- CAST_END
- }
- void doRExpr(ostream& o, RExpr*p){
- CAST_START(AssigmentDeclare)
- doRVal(o, v.l); o<<"="; doRVal(o, v.r);
- CAST_END
- CAST_START(Add)
- doRVal(o, v.l); o<<"+"; doRVal(o, v.r);
- CAST_END
- }
- void doFuncBodyExpr(ostream& o, FuncBodyExpr*p) {
- #if 0
- auto RvalToFuncBodyExpr_Var = dynamic_cast<RvalToFuncBodyExpr*>(p);
- if(RvalToFuncBodyExpr_Var!=0) {
- auto fn = [](void*hiddenptr_){
- RvalToFuncBodyExpr&v=*(RvalToFuncBodyExpr*)hiddenptr_;
- doRVal(o, v.rval);
- CAST_END
- #else
- CAST_START(RvalToFuncBodyExpr)
- doRVal(o, v.rval);
- CAST_END
- #endif
- }
- void codeblock(ostream& o, FuncBodyLoop*p){
- for(auto ci = p->ls.begin(); ci!=p->ls.end(); ++ci){
- doFuncBodyExpr(o, *ci);
- o<<";"<<endl;
- }
- }
- void doFunc(ostream& o, DefineFunc*p){
- o << p->returnType->name<< " " << p->name << "() " << (p->IsReadonly?"const ":"") << "{"<<endl;
- codeblock(o, p->codeblock);
- o << "}"<<endl;
- }
- void start_global(ostream& o, IMySaveLoad*ast){
- auto p = dynamic_cast<GlobalLoop*>(ast);
- assert(p);
- for(auto cii = p->ls.cbegin(); cii!=p->ls.cend(); ++cii){
- DefineFunc* defineFunc = dynamic_cast<DefineFunc*>(*cii);
- if(defineFunc!=0){doFunc(o, defineFunc); continue; }
- }
- }
Add Comment
Please, Sign In to add comment