Advertisement
Guest User

Untitled

a guest
May 21st, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.34 KB | None | 0 0
  1. package rclang.impl;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5.  
  6. import rclang.g4.RCLangParser.AdditionExpContext;
  7. import rclang.g4.RCLangParser.AssignmentExpContext;
  8. import rclang.g4.RCLangParser.AtomExpContext;
  9. import rclang.g4.RCLangParser.MathExpContext;
  10. import rclang.g4.RCLangParser.MoveExpContext;
  11. import rclang.g4.RCLangParser.MultiplyExpContext;
  12. import rclang.g4.RCLangParser.OffExpContext;
  13. import rclang.g4.RCLangParser.PrintExpContext;
  14. import rclang.g4.RCLangParser.StopExpContext;
  15. import rclang.g4.RCLangParser.TurnExpContext;
  16. import rclang.g4.RCLangBaseVisitor;
  17.  
  18. public class RCLangBaseVisitorImpl extends RCLangBaseVisitor<String> {
  19. private ArrayList<String> mVariables = new ArrayList<String>();
  20. private ArrayList<String> mImports = new ArrayList<String>();
  21. private ArrayList<String> mExternalData = new ArrayList<String>();
  22. private HashMap<Integer, String> mFragments = new HashMap<Integer, String>();
  23. private Integer mLineCount = 0;
  24.  
  25. /**
  26. * @return the output
  27. */
  28. public ArrayList<String> getImports() {
  29. return mImports;
  30. }
  31.  
  32. /**
  33. * @return the output
  34. */
  35. public ArrayList<String> getExternalData() {
  36. return mExternalData;
  37. }
  38.  
  39. /**
  40. * @return the output
  41. */
  42. public HashMap<Integer, String> getFragments() {
  43. return mFragments;
  44. }
  45.  
  46. @Override
  47. public String visitAssignmentExp(AssignmentExpContext ctx) {
  48. String varID = ctx.VARIABLE().getText();
  49.  
  50. if (!mVariables.contains(varID)) {
  51. mVariables.add(varID);
  52. }
  53.  
  54. mLineCount++;
  55. mFragments.put(mLineCount, ctx.getText());
  56. return "Integer " + ctx.getText() + ";\n";
  57. }
  58.  
  59. @Override
  60. public String visitMoveExp(MoveExpContext ctx) {
  61. String[] imports = {
  62. "java.util.ArrayList",
  63. "lejos.hardware.motor.BasicMotor"
  64. };
  65. String[] data = {
  66. "public ArrayList<lejos.hardware.motor.RegulatedMotor> MOVE_MOTORS = new ArrayList<lejos.hardware.motor.BasicMotor>();"
  67. };
  68.  
  69. for (String im : imports) {
  70. if (!mImports.contains(im)) {
  71. mImports.add(im);
  72. }
  73. }
  74.  
  75. for (String dat : data) {
  76. if (!mExternalData.contains(dat)) {
  77. mExternalData.add(dat);
  78. }
  79. }
  80.  
  81. mLineCount++;
  82. mFragments.put(mLineCount, ctx.getText());
  83.  
  84. Integer speed = Integer.valueOf(this.visitMathExp(ctx.mathExp()));
  85. String stmt = ""
  86. + "for (lejos.hardware.motor.RegulatedMotor m : MOVE_MOTORS) {\n"
  87. + " m.setSpeed(" + Math.abs(speed) + ");\n"
  88. + " " + (speed > 0 ? "m.forward()" : "m.backward()") + ";\n"
  89. + " m.stop();\n"
  90. + ");\n";
  91.  
  92. mLineCount += 4;
  93. return stmt;
  94. }
  95.  
  96. @Override
  97. public String visitTurnExp(TurnExpContext ctx) {
  98. String[] imports = {
  99. "java.util.ArrayList",
  100. "lejos.hardware.motor.BasicMotor"
  101. };
  102. String[] data = {
  103. "public ArrayList<lejos.hardware.motor.BasicMotor> TURN_MOTORS = new ArrayList<lejos.hardware.motor.BasicMotor>();"
  104. };
  105.  
  106. for (String im : imports) {
  107. if (!mImports.contains(im)) {
  108. mImports.add(im);
  109. }
  110. }
  111.  
  112. for (String dat : data) {
  113. if (!mExternalData.contains(dat)) {
  114. mExternalData.add(dat);
  115. }
  116. }
  117.  
  118. mLineCount++;
  119. mFragments.put(mLineCount, ctx.getText());
  120.  
  121. String stmt = ""
  122. + "for (lejos.hardware.motor.BasicMotor m : TURN_MOTORS) {\n"
  123. + " m.rotate(" + this.visitMathExp(ctx.mathExp()) + ");\n"
  124. + ");\n";
  125.  
  126. mLineCount += 2;
  127. return stmt;
  128. }
  129.  
  130. @Override
  131. public String visitPrintExp(PrintExpContext ctx) {
  132. String[] imports = {
  133. "lejos.hardware.lcd.LCD"
  134. };
  135.  
  136. for (String im : imports) {
  137. if (!mImports.contains(im)) {
  138. mImports.add(im);
  139. }
  140. }
  141.  
  142. mLineCount++;
  143. mFragments.put(mLineCount, ctx.getText());
  144. return "LCD.drawString(" + ctx.getText() + ", 0, 4);\n";
  145. }
  146.  
  147. @Override
  148. public String visitStopExp(StopExpContext ctx) {
  149. // TODO: How to stop all currently connected motors?
  150. return super.visitStopExp(ctx);
  151. }
  152.  
  153. @Override
  154. public String visitOffExp(OffExpContext ctx) {
  155. // TODO: How to turn off the EV3 control unit?
  156. return super.visitOffExp(ctx);
  157. }
  158.  
  159. @Override
  160. public String visitAdditionExp(AdditionExpContext ctx) {
  161. Integer left = Integer.valueOf(this.visitMultiplyExp(ctx.left));
  162. Integer right = Integer.valueOf(this.visitMultiplyExp(ctx.right));
  163. char op = ctx.op.getText().charAt(0);
  164.  
  165. switch (op) {
  166. case '+':
  167. return String.valueOf(left + right);
  168. case '-':
  169. return String.valueOf(left - right);
  170. default:
  171. throw new IllegalArgumentException("Unknown operator " + op);
  172. }
  173. }
  174.  
  175. @Override
  176. public String visitMultiplyExp(MultiplyExpContext ctx) {
  177. Integer start = Integer.valueOf(this.visitAtomExp(ctx.start));
  178. Integer right = Integer.valueOf(this.visitAtomExp(ctx.right));
  179. char op = ctx.op.getText().charAt(0);
  180.  
  181. switch (op) {
  182. case '*':
  183. return String.valueOf(left * right);
  184. case '/':
  185. return String.valueOf(left / right);
  186. default:
  187. throw new IllegalArgumentException("Unknown operator " + op);
  188. }
  189. }
  190.  
  191. @Override
  192. public String visitAtomExp(AtomExpContext ctx) {
  193. String text = ctx.getText();
  194.  
  195. if (text.charAt(0) == '(') {
  196. // strip parenthesis and continue
  197. return this.visitAdditionExp(ctx.additionExp());
  198. }
  199.  
  200. //return this.visitNumber(ctx.number());
  201. return ctx.Number().getText();
  202. }
  203.  
  204. /*
  205. @Override
  206. public String visitNumber(NumberContext ctx) {
  207. mFragments.put(mLineCount, ctx.getText());
  208. return ctx.getText();
  209. }
  210. */
  211.  
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement