Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. int get_type(tree* tree){
  2. if(tree->rule == "expr expr PLUS term"){
  3. int exprtype=0,termtype=0,e=0;
  4. exprtype = get_type(tree->child.at(0));
  5. termtype = get_type(tree->child.at(2));
  6. if(exprtype == 1 && termtype == 1) {
  7. e=1;
  8. return e;
  9. }
  10. else if(exprtype == 0 && termtype == 1) {
  11. e=0;
  12. return e;
  13. }
  14. else if(exprtype == 1 && termtype == 0) {
  15. e=0;
  16. return e;
  17. }
  18. else cerr <<"ERROR invalid type operated" <<endl;
  19. }
  20. else if(tree->rule == "expr expr MINUS term"){
  21. int exprtype=0,termtype=0,g=0;
  22. exprtype = get_type(tree->child.at(0));
  23. termtype = get_type(tree->child.at(2));
  24. if(exprtype == 1 && termtype == 1) {
  25. g=1;
  26. return g;
  27. }
  28. else if(exprtype == 0 && termtype == 1) {
  29. g=0;
  30. return g;
  31. }
  32. else if(exprtype == 0 && termtype == 0) {
  33. g=1;
  34. return g;
  35. }
  36. else cerr <<"ERROR invalid type operated" <<endl;
  37. }
  38. else if(tree->rule == "expr term"){
  39. return get_type(tree->child.at(0));
  40. }
  41. else if(tree->rule == "term factor"){
  42. return get_type(tree->child.at(0));
  43. }
  44. else if(tree->rule == "term term STAR factor"){
  45. int exprtype=0,termtype=0,h=0;
  46. exprtype = get_type(tree->child.at(0));
  47. termtype = get_type(tree->child.at(2));
  48. if(exprtype == 1 && termtype == 1) {
  49. h=1;
  50. return h;
  51. }
  52. else cerr <<"ERROR invalid type operated" <<endl;
  53. }
  54. else if(tree->rule == "term term SLASH factor"){
  55. int exprtype=0,termtype=0,h=0;
  56. exprtype = get_type(tree->child.at(0));
  57. termtype = get_type(tree->child.at(2));
  58. if(exprtype == 1 && termtype == 1) {
  59. h=1;
  60. return h;
  61. }
  62. else cerr <<"ERROR invalid type operated" <<endl;
  63. }
  64. else if(tree->rule == "term term PCT factor"){
  65. int exprtype=0,termtype=0,h=0;
  66. exprtype = get_type(tree->child.at(0));
  67. termtype = get_type(tree->child.at(2));
  68. if(exprtype == 1 && termtype == 1) {
  69. h=1;
  70. return h;
  71. }
  72. else cerr <<"ERROR invalid type operated" <<endl;
  73. }
  74. else if(tree->rule == "factor ID"){
  75. int q = 0;
  76. table n_table;
  77. map<string,map<string,int> > temp;
  78. map<string,int> temp1;
  79. n_table = procedure_table["wain"];
  80. temp = n_table.sym_table;
  81. temp1 = temp[tree->child.at(0)->tokens.at(1)];
  82. //cerr << tree->child.at(0)->tokens.at(1) <<endl;
  83. for(map<string,int > ::iterator it2 = temp1.begin();it2 != temp1.end(); ++it2){
  84. //cerr << it2->first <<endl;
  85. if(it2->first == "int") q = 1;
  86. else if(it2->first == "int*") q = 0;
  87. }
  88. //cerr << q << endl;
  89. return q;
  90. }
  91. else if(tree->rule == "factor NUM"){
  92. int e = 1;
  93. return e;
  94. }
  95. else if(tree->rule == "factor NULL"){
  96. int e = 0;
  97. return e;
  98. }
  99. else if(tree->rule == "factor LPAREN expr RPAREN"){
  100. return get_type(tree->child.at(1));
  101. }
  102. else if(tree->rule == "factor AMP lvalue"){
  103. int x = get_type(tree->child.at(1));
  104. //cerr<<"lvalue gettype"<< x <<endl;
  105. if(x == 1) return 0;
  106. else cerr << "ERROR invalid, cannot do &(*int)" << endl;
  107. }
  108. else if(tree->rule == "factor STAR factor"){
  109. int x = get_type(tree->child.at(1));
  110. if(x == 0) return 1;
  111. else cerr << "ERROR invalid, cannot do *(int)" << endl;
  112. }
  113. else if(tree->rule == "factor NEW INT LBRACK expr RBRACK"){
  114. int e = 0;
  115. return e;
  116. }
  117. else if(tree->rule == "lvalue ID"){
  118. int q = 0;
  119. table n_table;
  120. map<string,map<string,int> > temp;
  121. map<string,int> temp1;
  122. n_table = procedure_table["wain"];
  123. temp = n_table.sym_table;
  124. temp1 = temp[tree->child.at(0)->tokens.at(1)];
  125. for(map<string,int > ::iterator it2 = temp1.begin();it2 != temp1.end(); ++it2){
  126. if(it2->first == "int") q = 1;
  127. else if(it2->first == "int*") q = 0;
  128. }
  129. return q;
  130. }
  131. else if(tree->rule == "lvalue STAR factor"){
  132. return get_type(tree->child.at(1));
  133. }
  134. else if(tree->rule == "lvalue LPAREN lvalue RPAREN"){
  135. return get_type(tree->child.at(1));
  136. }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement