BasicConditionSwitch.xtend 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation
  2. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.ReturnInformation
  3. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.util.SemanticAdaptationSwitch
  4. import org.eclipse.emf.ecore.EObject
  5. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Multi
  6. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Div
  7. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVType
  8. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Neg
  9. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.RealLiteral
  10. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.IntLiteral
  11. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Literal
  12. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.BoolLiteral
  13. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Min
  14. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Minus
  15. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Plus
  16. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.LessThan
  17. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.exceptions.TypeException
  18. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Or
  19. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.NotEquals
  20. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.GreaterThanOrEquals
  21. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.And
  22. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Not
  23. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.GreaterThan
  24. class BasicConditionSwitch extends SemanticAdaptationSwitch<ReturnInformation> {
  25. private def Object convertTypeToObject(SVType type, Literal object) {
  26. switch (type) {
  27. case Real: {
  28. return (object as RealLiteral).value.doubleValue;
  29. }
  30. case Integer: {
  31. return (object as IntLiteral).value;
  32. }
  33. case Boolean: {
  34. return Boolean.parseBoolean((object as BoolLiteral).value);
  35. }
  36. default: {
  37. }
  38. }
  39. }
  40. override ReturnInformation caseRealLiteral(RealLiteral object) {
  41. var retInfo = new ReturnInformation();
  42. retInfo.type = SVType.Real;
  43. retInfo.value = convertTypeToObject(retInfo.type, object);
  44. retInfo.code = '''«object.value»''';
  45. return retInfo;
  46. }
  47. override ReturnInformation caseIntLiteral(IntLiteral object) {
  48. var retInfo = new ReturnInformation();
  49. retInfo.type = SVType.Integer;
  50. retInfo.value = convertTypeToObject(retInfo.type, object);
  51. retInfo.code = '''«object.value»''';
  52. return retInfo;
  53. }
  54. override ReturnInformation caseBoolLiteral(BoolLiteral object) {
  55. var retInfo = new ReturnInformation();
  56. retInfo.type = SVType.Boolean;
  57. retInfo.value = convertTypeToObject(retInfo.type, object);
  58. retInfo.code = '''«object.value»''';
  59. return retInfo;
  60. }
  61. override ReturnInformation defaultCase(EObject object) {
  62. var retVal = new ReturnInformation();
  63. retVal.code = '''[«object.class»]''';
  64. return retVal;
  65. }
  66. override ReturnInformation caseMulti(Multi object) {
  67. val doSwitchLeft = doSwitch(object.left);
  68. val doSwitchRight = doSwitch(object.right);
  69. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  70. retVal.code = '''«doSwitchLeft.code» * «doSwitchRight.code»''';
  71. return retVal;
  72. }
  73. override ReturnInformation caseDiv(Div object) {
  74. val doSwitchLeft = doSwitch(object.left);
  75. val doSwitchRight = doSwitch(object.right);
  76. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  77. retVal.code = '''«doSwitchLeft.code» / «doSwitchRight.code»''';
  78. retVal.type = SVType.Real;
  79. retVal.forceType = true;
  80. return retVal;
  81. }
  82. override ReturnInformation caseNeg(Neg object) {
  83. var doSwitch = doSwitch(object.right);
  84. var retVal = new ReturnInformation(doSwitch);
  85. retVal.code = doSwitch.code;
  86. return retVal;
  87. }
  88. override ReturnInformation caseMin(Min object) {
  89. var retInfo = new ReturnInformation();
  90. var doSwitchResCode = newArrayList();
  91. for (expr : object.args) {
  92. val doSwitchRes_ = this.doSwitch(expr);
  93. doSwitchResCode.add(doSwitchRes_.code);
  94. retInfo = new ReturnInformation(retInfo, doSwitchRes_);
  95. }
  96. retInfo.code = '''min(«doSwitchResCode.join(",")»)'''
  97. return retInfo;
  98. }
  99. override ReturnInformation caseMinus(Minus object) {
  100. val doSwitchLeft = doSwitch(object.left);
  101. val doSwitchRight = doSwitch(object.right);
  102. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  103. retVal.code = '''«doSwitchLeft.code» - «doSwitchRight.code»''';
  104. return retVal;
  105. }
  106. override ReturnInformation casePlus(Plus object) {
  107. val doSwitchLeft = doSwitch(object.left);
  108. val doSwitchRight = doSwitch(object.right);
  109. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  110. retVal.code = '''«doSwitchLeft.code» + «doSwitchRight.code»''';
  111. return retVal;
  112. }
  113. override ReturnInformation caseGreaterThan(GreaterThan object)
  114. {
  115. var ret = new ReturnInformation();
  116. val left = doSwitch(object.left);
  117. val right = doSwitch(object.right);
  118. val code = '''«left.code» > «right.code»'''
  119. if(!Conversions.isTypeANumber(left.type) || !Conversions.isTypeANumber(right.type))
  120. {
  121. throw new TypeException('''Wrong types at: «code»''');
  122. }
  123. ret.type = SVType.Boolean;
  124. ret.code = code;
  125. return ret;
  126. }
  127. override ReturnInformation caseGreaterThanOrEquals(GreaterThanOrEquals object)
  128. {
  129. var ret = new ReturnInformation();
  130. val left = doSwitch(object.left);
  131. val right = doSwitch(object.right);
  132. val code = '''«left.code» >= «right.code»'''
  133. if(!Conversions.isTypeANumber(left.type) || !Conversions.isTypeANumber(right.type))
  134. {
  135. throw new TypeException('''Wrong types at: «code»''');
  136. }
  137. ret.type = SVType.Boolean;
  138. ret.code = code;
  139. return ret;
  140. }
  141. override ReturnInformation caseNotEquals(NotEquals object)
  142. {
  143. var ret = new ReturnInformation();
  144. val left = doSwitch(object.left);
  145. val right = doSwitch(object.right);
  146. val code = '''«left.code» != «right.code»'''
  147. if(left.type !== right.type)
  148. {
  149. throw new TypeException('''Wrong types at: «code»''');
  150. }
  151. ret.type = SVType.Boolean;
  152. ret.code = code;
  153. return ret;
  154. }
  155. override ReturnInformation caseLessThan(LessThan object)
  156. {
  157. var ret = new ReturnInformation();
  158. val left = doSwitch(object.left);
  159. val right = doSwitch(object.right);
  160. val code = '''«left.code» < «right.code»'''
  161. if(!Conversions.isTypeANumber(left.type) || !Conversions.isTypeANumber(right.type))
  162. {
  163. throw new TypeException('''Wrong types at: «code»''');
  164. }
  165. ret.type = SVType.Boolean;
  166. ret.code = code;
  167. return ret;
  168. }
  169. override ReturnInformation caseNot(Not object)
  170. {
  171. var ret = new ReturnInformation();
  172. val res = doSwitch(object.left);
  173. if(res.type !== SVType.Boolean)
  174. {
  175. throw new TypeException('''Wrong types at: «res.code»''');
  176. }
  177. ret.type = SVType.Boolean;
  178. ret.code = res.code;
  179. return ret;
  180. }
  181. override ReturnInformation caseAnd(And object)
  182. {
  183. var ret = new ReturnInformation();
  184. val left = doSwitch(object.left);
  185. val right = doSwitch(object.right);
  186. val code = '''«left.code» && «right.code»'''
  187. if(left.type !== SVType.Boolean || right.type !== SVType.Boolean)
  188. {
  189. throw new TypeException('''Wrong types at: «code»''');
  190. }
  191. ret.type = SVType.Boolean;
  192. ret.code = code;
  193. return ret;
  194. }
  195. override ReturnInformation caseOr(Or object)
  196. {
  197. var ret = new ReturnInformation();
  198. val left = doSwitch(object.left);
  199. val right = doSwitch(object.right);
  200. val code = '''«left.code» || «right.code»'''
  201. if(left.type !== SVType.Boolean || right.type !== SVType.Boolean)
  202. {
  203. throw new TypeException('''Wrong types at: «code»''');
  204. }
  205. ret.type = SVType.Boolean;
  206. ret.code = code;
  207. return ret;
  208. }
  209. }