BasicConditionSwitch.xtend 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. class BasicConditionSwitch extends SemanticAdaptationSwitch<ReturnInformation> {
  22. private def Object convertTypeToObject(SVType type, Literal object) {
  23. switch (type) {
  24. case Real: {
  25. return (object as RealLiteral).value.doubleValue;
  26. }
  27. case Integer: {
  28. return (object as IntLiteral).value;
  29. }
  30. case Boolean: {
  31. return Boolean.parseBoolean((object as BoolLiteral).value);
  32. }
  33. default: {
  34. }
  35. }
  36. }
  37. override ReturnInformation caseRealLiteral(RealLiteral object) {
  38. var retInfo = new ReturnInformation();
  39. retInfo.type = SVType.Real;
  40. retInfo.value = convertTypeToObject(retInfo.type, object);
  41. retInfo.code = '''«object.value»''';
  42. return retInfo;
  43. }
  44. override ReturnInformation caseIntLiteral(IntLiteral object) {
  45. var retInfo = new ReturnInformation();
  46. retInfo.type = SVType.Integer;
  47. retInfo.value = convertTypeToObject(retInfo.type, object);
  48. retInfo.code = '''«object.value»''';
  49. return retInfo;
  50. }
  51. override ReturnInformation caseBoolLiteral(BoolLiteral object) {
  52. var retInfo = new ReturnInformation();
  53. retInfo.type = SVType.Boolean;
  54. retInfo.value = convertTypeToObject(retInfo.type, object);
  55. retInfo.code = '''«object.value»''';
  56. return retInfo;
  57. }
  58. override ReturnInformation defaultCase(EObject object) {
  59. var retVal = new ReturnInformation();
  60. retVal.code = '''[«object.class»]''';
  61. return retVal;
  62. }
  63. override ReturnInformation caseMulti(Multi object) {
  64. val doSwitchLeft = doSwitch(object.left);
  65. val doSwitchRight = doSwitch(object.right);
  66. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  67. retVal.code = '''«doSwitchLeft.code» * «doSwitchRight.code»''';
  68. return retVal;
  69. }
  70. override ReturnInformation caseDiv(Div object) {
  71. val doSwitchLeft = doSwitch(object.left);
  72. val doSwitchRight = doSwitch(object.right);
  73. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  74. retVal.code = '''«doSwitchLeft.code» / «doSwitchRight.code»''';
  75. retVal.type = SVType.Real;
  76. retVal.forceType = true;
  77. return retVal;
  78. }
  79. override ReturnInformation caseNeg(Neg object) {
  80. var doSwitch = doSwitch(object.right);
  81. var retVal = new ReturnInformation(doSwitch);
  82. retVal.code = doSwitch.code;
  83. return retVal;
  84. }
  85. override ReturnInformation caseMin(Min object) {
  86. var retInfo = new ReturnInformation();
  87. var doSwitchResCode = newArrayList();
  88. for (expr : object.args) {
  89. val doSwitchRes_ = this.doSwitch(expr);
  90. doSwitchResCode.add(doSwitchRes_.code);
  91. retInfo = new ReturnInformation(retInfo, doSwitchRes_);
  92. }
  93. retInfo.code = '''min(«doSwitchResCode.join(",")»)'''
  94. return retInfo;
  95. }
  96. override ReturnInformation caseMinus(Minus object) {
  97. val doSwitchLeft = doSwitch(object.left);
  98. val doSwitchRight = doSwitch(object.right);
  99. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  100. retVal.code = '''«doSwitchLeft.code» - «doSwitchRight.code»''';
  101. return retVal;
  102. }
  103. override ReturnInformation casePlus(Plus object) {
  104. val doSwitchLeft = doSwitch(object.left);
  105. val doSwitchRight = doSwitch(object.right);
  106. var retVal = new ReturnInformation(doSwitchLeft, doSwitchRight);
  107. retVal.code = '''«doSwitchLeft.code» + «doSwitchRight.code»''';
  108. return retVal;
  109. }
  110. override ReturnInformation caseGreaterThanOrEquals(GreaterThanOrEquals object)
  111. {
  112. var ret = new ReturnInformation();
  113. val left = doSwitch(object.left);
  114. val right = doSwitch(object.right);
  115. val code = '''«left.code» >= «right.code»'''
  116. if(!Conversions.isTypeANumber(left.type) || !Conversions.isTypeANumber(right.type))
  117. {
  118. throw new TypeException('''Wrong types at: «code»''');
  119. }
  120. ret.type = SVType.Boolean;
  121. ret.code = code;
  122. return ret;
  123. }
  124. override ReturnInformation caseNotEquals(NotEquals object)
  125. {
  126. var ret = new ReturnInformation();
  127. val left = doSwitch(object.left);
  128. val right = doSwitch(object.right);
  129. val code = '''«left.code» != «right.code»'''
  130. if(left.type !== right.type)
  131. {
  132. throw new TypeException('''Wrong types at: «code»''');
  133. }
  134. ret.type = SVType.Boolean;
  135. ret.code = code;
  136. return ret;
  137. }
  138. override ReturnInformation caseLessThan(LessThan object)
  139. {
  140. var ret = new ReturnInformation();
  141. val left = doSwitch(object.left);
  142. val right = doSwitch(object.right);
  143. val code = '''«left.code» < «right.code»'''
  144. if(!Conversions.isTypeANumber(left.type) || !Conversions.isTypeANumber(right.type))
  145. {
  146. throw new TypeException('''Wrong types at: «code»''');
  147. }
  148. ret.type = SVType.Boolean;
  149. ret.code = code;
  150. return ret;
  151. }
  152. override ReturnInformation caseOr(Or object)
  153. {
  154. var ret = new ReturnInformation();
  155. val left = doSwitch(object.left);
  156. val right = doSwitch(object.right);
  157. val code = '''«left.code» || «right.code»'''
  158. if(left.type !== SVType.Boolean || right.type !== SVType.Boolean)
  159. {
  160. throw new TypeException('''Wrong types at: «code»''');
  161. }
  162. ret.type = SVType.Boolean;
  163. ret.code = code;
  164. return ret;
  165. }
  166. }