Guest User

Untitled

a guest
Jan 22nd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1.  
  2. #define CAST_START(Type) auto Type##_Var = dynamic_cast<Type*>(p); if(Type##_Var!=0) { auto fn = [&o](void*hiddenptr_){Type&v=*(Type*)hiddenptr_;
  3. #define CAST_END }; fn(p); }
  4.  
  5. void doRExpr(ostream& o, RExpr*p);
  6. void doRVal(ostream& o, Rval*p){
  7. CAST_START(RExprToRval)
  8. doRExpr(o, v.expr);
  9. CAST_END
  10.  
  11. CAST_START(VarRval)
  12. o << v.v;
  13. CAST_END
  14.  
  15. CAST_START(IntLiteral)
  16. o << v.v;
  17. CAST_END
  18. }
  19.  
  20. void doRExpr(ostream& o, RExpr*p){
  21. CAST_START(AssigmentDeclare)
  22. doRVal(o, v.l); o<<"="; doRVal(o, v.r);
  23. CAST_END
  24. CAST_START(Add)
  25. doRVal(o, v.l); o<<"+"; doRVal(o, v.r);
  26. CAST_END
  27. }
  28.  
  29. void doFuncBodyExpr(ostream& o, FuncBodyExpr*p) {
  30. #if 0
  31. auto RvalToFuncBodyExpr_Var = dynamic_cast<RvalToFuncBodyExpr*>(p);
  32. if(RvalToFuncBodyExpr_Var!=0) {
  33. auto fn = [](void*hiddenptr_){
  34. RvalToFuncBodyExpr&v=*(RvalToFuncBodyExpr*)hiddenptr_;
  35. doRVal(o, v.rval);
  36. CAST_END
  37. #else
  38. CAST_START(RvalToFuncBodyExpr)
  39. doRVal(o, v.rval);
  40. CAST_END
  41. #endif
  42. }
  43.  
  44. void codeblock(ostream& o, FuncBodyLoop*p){
  45.  
  46. for(auto ci = p->ls.begin(); ci!=p->ls.end(); ++ci){
  47. doFuncBodyExpr(o, *ci);
  48. o<<";"<<endl;
  49. }
  50. }
  51.  
  52. void doFunc(ostream& o, DefineFunc*p){
  53. o << p->returnType->name<< " " << p->name << "() " << (p->IsReadonly?"const ":"") << "{"<<endl;
  54. codeblock(o, p->codeblock);
  55. o << "}"<<endl;
  56. }
  57.  
  58. void start_global(ostream& o, IMySaveLoad*ast){
  59. auto p = dynamic_cast<GlobalLoop*>(ast);
  60. assert(p);
  61. for(auto cii = p->ls.cbegin(); cii!=p->ls.cend(); ++cii){
  62. DefineFunc* defineFunc = dynamic_cast<DefineFunc*>(*cii);
  63. if(defineFunc!=0){doFunc(o, defineFunc); continue; }
  64. }
  65. }
Add Comment
Please, Sign In to add comment