Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package nl.saxion.cos;
- import org.antlr.v4.runtime.tree.ParseTreeProperty;
- public class CodeGenerator extends MusicLangBaseVisitor<Void> {
- private JasminBytecode jasminCode;
- public JasminBytecode getJasminCode() {
- return jasminCode;
- }
- private ParseTreeProperty<DataType> types;
- private ParseTreeProperty<Symbol> symbols;
- private int unique = 0;
- private String nextLabel() {
- return "L" + ++unique;
- }
- private String ifLabel = "";
- private String doneLabel = "";
- private boolean isLast = false;
- public CodeGenerator(JasminBytecode jasminCode, ParseTreeProperty<DataType> types,
- ParseTreeProperty<Symbol> symbols) {
- this.jasminCode = jasminCode;
- this.types = types;
- this.symbols = symbols;
- }
- private int localStorageCounter = 0;
- private int getNextIndex() {
- return ++localStorageCounter;
- }
- @Override
- public Void visitProgram(MusicLangParser.ProgramContext ctx) {
- for (MusicLangParser.FunctionContext f : ctx.function()) {
- visit(f);
- }
- jasminCode.add(".method public static main([Ljava/lang/String;)V");
- jasminCode.add(".limit stack 99");
- jasminCode.add(".limit locals 99");
- jasminCode.add("");
- visit(ctx.main_method);
- jasminCode.add("return");
- jasminCode.add(".end method");
- return null;
- }
- @Override
- public Void visitFunction(MusicLangParser.FunctionContext ctx) {
- String returnType = ";";
- if (ctx.type() != null) {
- returnType = "I";
- } else {
- returnType = "V";
- }
- String paramTypes = "";
- // for (MusicLangParser.ParametersContext param : ctx.parameters()) {
- // if (param.type().getText().equals("number")) {
- // paramTypes += "I";
- // }
- // }
- if (ctx.parameters() != null) {
- for (MusicLangParser.TypeContext t : ctx.parameters().type()) {
- if (t.getText().equals("number")) {
- paramTypes += "I";
- }
- }
- }
- jasminCode.add(".method public static " + ctx.IDENTIFIER() + "(" + paramTypes + ")" + returnType);
- jasminCode.add(".limit stack 99");
- jasminCode.add(".limit locals 99");
- jasminCode.add("");
- if (!ctx.statement().isEmpty()) {
- for (MusicLangParser.StatementContext stat : ctx.statement()) {
- visit(stat);
- }
- }
- if (returnType.equals("I")) {
- returnType = "i";
- } else {
- returnType = "";
- }
- if (ctx.expression() != null) {
- visit(ctx.expression());
- }
- jasminCode.add(returnType + "return");
- jasminCode.add(".end method");
- return null;
- }
- @Override
- public Void visitDclNum(MusicLangParser.DclNumContext ctx) {
- visit(ctx.num_decl());
- return null;
- }
- @Override
- public Void visitDclSound(MusicLangParser.DclSoundContext ctx) {
- visit(ctx.sound_decl());
- return null;
- }
- @Override
- public Void visitSound_decl(MusicLangParser.Sound_declContext ctx) {
- // jasminCode.add(" ldc \"" + ctx.SOUND_VALUE().getText() + "\"");
- // jasminCode.add(" astore " + getNextIndex());
- String soundAsString = ctx.SOUND_VALUE().getText();
- int soundAsNum = soundToNumber(soundAsString);
- jasminCode.add(" ldc " + soundAsNum);
- jasminCode.add(" istore " + getNextIndex());
- return null;
- }
- @Override
- public Void visitNum_decl(MusicLangParser.Num_declContext ctx) {
- if (ctx.INT_VALUE() != null) {
- jasminCode.add(" ldc " + ctx.INT_VALUE().getText());
- } else if (ctx.scan_num() != null) {
- visit(ctx.scan_num());
- }
- jasminCode.add(" istore " + getNextIndex());
- return null;
- }
- @Override
- public Void visitDclNote(MusicLangParser.DclNoteContext ctx) {
- visit(ctx.note_decl());
- return null;
- }
- @Override
- public Void visitNote_decl(MusicLangParser.Note_declContext ctx) {
- jasminCode.add(" new nl/saxion/cos/Note");
- jasminCode.add(" dup");
- jasminCode.add(" ldc \"" + ctx.SOUND_VALUE().getText() + "\"");
- jasminCode.add(" ldc " + ctx.INT_VALUE().getText());
- jasminCode.add(" invokenonvirtual nl/saxion/cos/Note/<init>(Ljava/lang/String;I)V");
- jasminCode.add(" astore " + getNextIndex());
- return null;
- }
- @Override
- public Void visitPlay(MusicLangParser.PlayContext ctx) {
- jasminCode.add("getstatic java/lang/System/out Ljava/io/PrintStream;");
- MusicLangParser.ExpressionContext expression = ctx.expression();
- visit(expression);
- System.out.println("type of expresiion " + types.get(expression));
- if (types.get(expression) == DataType.NUM) {
- jasminCode.add("invokevirtual java/io/PrintStream/println(I)V");
- } else if (types.get(expression) == DataType.SOUND) {
- jasminCode.add("invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V");
- }
- return null;
- }
- @Override
- public Void visitScan_num(MusicLangParser.Scan_numContext ctx) {
- jasminCode.add(" new java/util/Scanner");
- jasminCode.add(" dup");
- jasminCode.add(" getstatic java/lang/System/in Ljava/io/InputStream;");
- jasminCode.add(" invokenonvirtual java/util/Scanner/<init>(Ljava/io/InputStream;)V");
- int index = getNextIndex();
- jasminCode.add(" astore " + index);
- jasminCode.add(" aload " + index);
- jasminCode.add(" invokevirtual java/util/Scanner/nextInt()I");
- return null;
- }
- @Override
- public Void visitRepeat(MusicLangParser.RepeatContext ctx) {
- if (ctx.INT_VALUE() != null) {
- jasminCode.add(" ldc 0");
- int index = getNextIndex();
- jasminCode.add(" istore " + index);
- jasminCode.add(" iload " + index);
- jasminCode.add(" ldc " + ctx.INT_VALUE().getText());
- String loopLabel = nextLabel();
- jasminCode.add(loopLabel + ":");
- String outLabel = nextLabel();
- jasminCode.add(" if_icmpge " + outLabel);
- visit(ctx.repeat_body);
- jasminCode.add(" iinc " + index + " " + 1);
- jasminCode.add(" goto " + loopLabel);
- jasminCode.add(outLabel + ":");
- }
- return null;
- }
- @Override
- public Void visitExNegate(MusicLangParser.ExNegateContext ctx) {
- visit(ctx.expression());
- jasminCode.add("ineg");
- return null;
- }
- @Override
- public Void visitExIdentifier(MusicLangParser.ExIdentifierContext ctx) {
- Symbol symbol = symbols.get(ctx);
- // String instruction = symbol.getType() != DataType.NUM ? "iload" : "aload";
- String instruction = " iload";
- jasminCode.add(instruction + " " + symbol.getLocalSlot());
- return null;
- }
- @Override
- public Void visitExMulOp(MusicLangParser.ExMulOpContext ctx) {
- visit(ctx.left);
- visit(ctx.right);
- jasminCode.add(" imul");
- return null;
- }
- @Override
- public Void visitExSoundLiteral(MusicLangParser.ExSoundLiteralContext ctx) {
- //jasminCode.add(" ldc \"" + ctx.SOUND_VALUE().getText() + "\"");
- String soundAsString = ctx.SOUND_VALUE().getText();
- int soundAsNum = soundToNumber(soundAsString);
- jasminCode.add(" ldc " + soundAsNum);
- return null;
- }
- @Override
- public Void visitExAddOp(MusicLangParser.ExAddOpContext ctx) {
- visit(ctx.left);
- visit(ctx.right);
- if (ctx.op.getText().equals(ctx.PLUS_SIGN().getText())) {
- jasminCode.add(" iadd");
- } else {
- jasminCode.add(" isub");
- }
- return null;
- }
- @Override
- public Void visitExIntLiteral(MusicLangParser.ExIntLiteralContext ctx) {
- jasminCode.add(" ldc " + ctx.INT_VALUE().getText());
- return null;
- }
- @Override
- public Void visitExParentheses(MusicLangParser.ExParenthesesContext ctx) {
- visit(ctx.expression());
- return null;
- }
- @Override
- public Void visitIf_statement(MusicLangParser.If_statementContext ctx) {
- System.out.println("par - " + ctx.parent.getText());
- if (ctx.else_statement() != null) {
- isLast = false;
- visit(ctx.if_else_body());
- if (doneLabel.equals("")) {
- doneLabel = nextLabel();
- }
- jasminCode.add(" goto " + doneLabel);
- jasminCode.add(" " + ifLabel + ":");
- System.out.println("done1 - " + doneLabel);
- if (ctx.else_statement().if_statement() == null) {
- System.out.println("this is else statement");
- visit(ctx.else_statement());
- jasminCode.add(" " + doneLabel + ":");
- System.out.println("done2 - " + doneLabel);
- ifLabel = "";
- doneLabel = "";
- } else {
- System.out.println("this is else if statement");
- visit(ctx.else_statement());
- }
- } else {
- isLast = true;
- if (doneLabel.equals("")) {
- doneLabel = nextLabel();
- }
- visit(ctx.if_else_body());
- System.out.println(ctx.parent);
- System.out.println(ctx.children);
- if (!jasminCode.getLines().contains(doneLabel)) {
- jasminCode.add(" " + doneLabel + ":");
- System.out.println("done3 - " + doneLabel);
- ifLabel = "";
- doneLabel = "";
- }
- }
- return null;
- }
- @Override
- public Void visitIf_else_body(MusicLangParser.If_else_bodyContext ctx) {
- visit(ctx.my_boolean());
- for (MusicLangParser.StatementContext s : ctx.statement()) {
- visit(s);
- }
- return null;
- }
- @Override
- public Void visitElse_statement(MusicLangParser.Else_statementContext ctx) {
- return super.visitElse_statement(ctx);
- }
- @Override
- public Void visitMy_boolean(MusicLangParser.My_booleanContext ctx) {
- MusicLangParser.ExpressionContext left = ctx.left;
- MusicLangParser.ExpressionContext right = ctx.right;
- visit(left);
- visit(right);
- String operator = reverseComparison(ctx.BOOLEAN_OPERATOR().getText());
- if (isLast) {
- jasminCode.add(" if_icmp" + operator + " " + doneLabel);
- } else {
- System.out.println(ctx.left.getText());
- ifLabel = nextLabel();
- jasminCode.add(" if_icmp" + operator + " " + ifLabel);
- }
- return null;
- }
- private String reverseComparison(String text) {
- switch (text) {
- case "<":
- return "ge";
- case "<=":
- return "gt";
- case ">":
- return "le";
- case ">=":
- return "lt";
- case "==":
- return "ne";
- case "!=":
- return "eq";
- default:
- return null;
- }
- }
- private int soundToNumber(String sound) {
- switch (sound) {
- case "C":
- case "B#":
- return 0;
- case "C#":
- case "Db":
- return 1;
- case "Cb":
- case "B":
- return 11;
- case "D":
- return 2;
- case "D#":
- case "Eb":
- return 3;
- case "E":
- case "Fb":
- return 4;
- case "E#":
- case "F":
- return 5;
- case "F#":
- case "Gb":
- return 6;
- case "G":
- return 7;
- case "G#":
- case "Ab":
- return 8;
- case "A":
- return 9;
- case "A#":
- case "Bb":
- return 10;
- default:
- return -1;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement