Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package rclang.impl;
- import java.util.ArrayList;
- import java.util.HashMap;
- import rclang.g4.RCLangParser.AdditionExpContext;
- import rclang.g4.RCLangParser.AssignmentExpContext;
- import rclang.g4.RCLangParser.AtomExpContext;
- import rclang.g4.RCLangParser.MathExpContext;
- import rclang.g4.RCLangParser.MoveExpContext;
- import rclang.g4.RCLangParser.MultiplyExpContext;
- import rclang.g4.RCLangParser.OffExpContext;
- import rclang.g4.RCLangParser.PrintExpContext;
- import rclang.g4.RCLangParser.StopExpContext;
- import rclang.g4.RCLangParser.TurnExpContext;
- import rclang.g4.RCLangBaseVisitor;
- public class RCLangBaseVisitorImpl extends RCLangBaseVisitor<String> {
- private ArrayList<String> mVariables = new ArrayList<String>();
- private ArrayList<String> mImports = new ArrayList<String>();
- private ArrayList<String> mExternalData = new ArrayList<String>();
- private HashMap<Integer, String> mFragments = new HashMap<Integer, String>();
- private Integer mLineCount = 0;
- /**
- * @return the output
- */
- public ArrayList<String> getImports() {
- return mImports;
- }
- /**
- * @return the output
- */
- public ArrayList<String> getExternalData() {
- return mExternalData;
- }
- /**
- * @return the output
- */
- public HashMap<Integer, String> getFragments() {
- return mFragments;
- }
- @Override
- public String visitAssignmentExp(AssignmentExpContext ctx) {
- String varID = ctx.VARIABLE().getText();
- if (!mVariables.contains(varID)) {
- mVariables.add(varID);
- }
- mLineCount++;
- mFragments.put(mLineCount, ctx.getText());
- return "Integer " + ctx.getText() + ";\n";
- }
- @Override
- public String visitMoveExp(MoveExpContext ctx) {
- String[] imports = {
- "java.util.ArrayList",
- "lejos.hardware.motor.BasicMotor"
- };
- String[] data = {
- "public ArrayList<lejos.hardware.motor.RegulatedMotor> MOVE_MOTORS = new ArrayList<lejos.hardware.motor.BasicMotor>();"
- };
- for (String im : imports) {
- if (!mImports.contains(im)) {
- mImports.add(im);
- }
- }
- for (String dat : data) {
- if (!mExternalData.contains(dat)) {
- mExternalData.add(dat);
- }
- }
- mLineCount++;
- mFragments.put(mLineCount, ctx.getText());
- Integer speed = Integer.valueOf(this.visitMathExp(ctx.mathExp()));
- String stmt = ""
- + "for (lejos.hardware.motor.RegulatedMotor m : MOVE_MOTORS) {\n"
- + " m.setSpeed(" + Math.abs(speed) + ");\n"
- + " " + (speed > 0 ? "m.forward()" : "m.backward()") + ";\n"
- + " m.stop();\n"
- + ");\n";
- mLineCount += 4;
- return stmt;
- }
- @Override
- public String visitTurnExp(TurnExpContext ctx) {
- String[] imports = {
- "java.util.ArrayList",
- "lejos.hardware.motor.BasicMotor"
- };
- String[] data = {
- "public ArrayList<lejos.hardware.motor.BasicMotor> TURN_MOTORS = new ArrayList<lejos.hardware.motor.BasicMotor>();"
- };
- for (String im : imports) {
- if (!mImports.contains(im)) {
- mImports.add(im);
- }
- }
- for (String dat : data) {
- if (!mExternalData.contains(dat)) {
- mExternalData.add(dat);
- }
- }
- mLineCount++;
- mFragments.put(mLineCount, ctx.getText());
- String stmt = ""
- + "for (lejos.hardware.motor.BasicMotor m : TURN_MOTORS) {\n"
- + " m.rotate(" + this.visitMathExp(ctx.mathExp()) + ");\n"
- + ");\n";
- mLineCount += 2;
- return stmt;
- }
- @Override
- public String visitPrintExp(PrintExpContext ctx) {
- String[] imports = {
- "lejos.hardware.lcd.LCD"
- };
- for (String im : imports) {
- if (!mImports.contains(im)) {
- mImports.add(im);
- }
- }
- mLineCount++;
- mFragments.put(mLineCount, ctx.getText());
- return "LCD.drawString(" + ctx.getText() + ", 0, 4);\n";
- }
- @Override
- public String visitStopExp(StopExpContext ctx) {
- // TODO: How to stop all currently connected motors?
- return super.visitStopExp(ctx);
- }
- @Override
- public String visitOffExp(OffExpContext ctx) {
- // TODO: How to turn off the EV3 control unit?
- return super.visitOffExp(ctx);
- }
- @Override
- public String visitAdditionExp(AdditionExpContext ctx) {
- Integer left = Integer.valueOf(this.visitMultiplyExp(ctx.left));
- Integer right = Integer.valueOf(this.visitMultiplyExp(ctx.right));
- char op = ctx.op.getText().charAt(0);
- switch (op) {
- case '+':
- return String.valueOf(left + right);
- case '-':
- return String.valueOf(left - right);
- default:
- throw new IllegalArgumentException("Unknown operator " + op);
- }
- }
- @Override
- public String visitMultiplyExp(MultiplyExpContext ctx) {
- Integer start = Integer.valueOf(this.visitAtomExp(ctx.start));
- Integer right = Integer.valueOf(this.visitAtomExp(ctx.right));
- char op = ctx.op.getText().charAt(0);
- switch (op) {
- case '*':
- return String.valueOf(left * right);
- case '/':
- return String.valueOf(left / right);
- default:
- throw new IllegalArgumentException("Unknown operator " + op);
- }
- }
- @Override
- public String visitAtomExp(AtomExpContext ctx) {
- String text = ctx.getText();
- if (text.charAt(0) == '(') {
- // strip parenthesis and continue
- return this.visitAdditionExp(ctx.additionExp());
- }
- //return this.visitNumber(ctx.number());
- return ctx.Number().getText();
- }
- /*
- @Override
- public String visitNumber(NumberContext ctx) {
- mFragments.put(mLineCount, ctx.getText());
- return ctx.getText();
- }
- */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement