/**
  * Create Header for the jasmin assembler code and add the code of the input file as assembler
  * code
  */
 private static String createOutput(CodeGenerator codeGenerator, String fileName) {
   int size = codeGenerator.getSymbolTable().size() + 1;
   return ".bytecode 50.0\n"
       + ".class public "
       + fileName
       + "\n"
       + ".super java/lang/Object\n"
       + ".method public <init>()V\n"
       + "\t.limit stack 1\n"
       + "\t.limit locals 1\n"
       + "\taload_0\n"
       + "\tinvokespecial java/lang/Object/<init>()V\n"
       + "\treturn\n"
       + ".end method\n"
       + "\t.method public static main([Ljava/lang/String;)V\n"
       + "\t.limit stack "
       + codeGenerator.getStackHeight()
       + "\n"
       + // May work...
       "\t.limit locals "
       + size
       + "\n"
       + codeGenerator.getCode()
       + "\treturn\n"
       + ".end method\n";
 }
示例#2
0
  private static boolean rule_while(DefaultMutableTreeNode parent) {

    boolean error = false;
    DefaultMutableTreeNode node;

    node = new DefaultMutableTreeNode("while");
    parent.add(node);
    currentToken++;

    if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("(")) {
      node = new DefaultMutableTreeNode("(");
      parent.add(node);
      currentToken++;
    } else {
      error(8);
      while (currentToken < tokens.size()
          && !(tokens.get(currentToken).getWord().equals("!")
              || tokens.get(currentToken).getWord().equals("-")
              || tokens.get(currentToken).getToken().equals("INTEGER")
              || tokens.get(currentToken).getToken().equals("OCTAL")
              || tokens.get(currentToken).getToken().equals("HEXADECIMAL")
              || tokens.get(currentToken).getToken().equals("BINARY")
              || tokens.get(currentToken).getToken().equals("STRING")
              || tokens.get(currentToken).getToken().equals("CHARACTER")
              || tokens.get(currentToken).getToken().equals("FLOAT")
              || tokens.get(currentToken).getToken().equals("IDENTIFIER")
              || tokens.get(currentToken).getWord().equals("true")
              || tokens.get(currentToken).getWord().equals("false")
              || tokens.get(currentToken).getWord().equals("(")
              || tokens.get(currentToken).getWord().equals(")"))) {
        currentToken++;
      }
    }

    node = new DefaultMutableTreeNode("expression");
    parent.add(node);
    error = rule_expression(node);
    String type = SemanticAnalyzer.popStack();
    if (!type.equals("boolean")) SemanticAnalyzer.error(getgui(), 3, getlineno(), "");
    if (tokens.get(currentToken).getWord().equals(")")) {
      node = new DefaultMutableTreeNode(")");
      parent.add(node);
      currentToken++;
    } else {
      error(7);
      while (currentToken < tokens.size() && !tokens.get(currentToken).getWord().equals("{")) {
        currentToken++;
      }
    }
    CodeGenerator.addInstruction("JMC", "e" + label_count, "false");
    label_count++;
    node = new DefaultMutableTreeNode("program");
    parent.add(node);
    error = rule_program(node);

    CodeGenerator.addInstruction("JMP", "e" + label_count, "0");

    label_count++;
    return error;
  }
示例#3
0
 // while
 private static void rule_while(DefaultMutableTreeNode parent) {
   DefaultMutableTreeNode node = new DefaultMutableTreeNode("while");
   parent.add(node);
   String start = "whileS" + labelNum;
   final int num = labelNum;
   String end = "whileE" + labelNum;
   labelNum++;
   CodeGenerator.addLabel(start, codeLine);
   if (tokens.get(currentToken).getWord().equals("(")) {
     node = new DefaultMutableTreeNode("(");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
   }
   node = new DefaultMutableTreeNode("expression");
   parent.add(node);
   rule_expression(node);
   CodeGenerator.addInstruction("JMC", "#" + end, "false");
   codeLine++;
   int n = tokens.get(currentToken).getLine();
   String x = SemanticAnalyzer.popStack();
   if (!x.equals("BOOLEAN")) SemanticAnalyzer.error(gui, 3, n, "");
   if (tokens.get(currentToken).getWord().equals(")")) {
     node = new DefaultMutableTreeNode(")");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
   }
   node = new DefaultMutableTreeNode("program");
   parent.add(node);
   rule_program(node);
   CodeGenerator.addInstruction("JMP", "#" + start, "0");
   codeLine++;
   CodeGenerator.addLabel("whileE" + num, codeLine);
 }
示例#4
0
  private static boolean rule_B(DefaultMutableTreeNode parent) {
    boolean error;
    DefaultMutableTreeNode node;
    int flag = 0;
    String operator = "";
    if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("-")) {
      node = new DefaultMutableTreeNode("-");
      parent.add(node);
      currentToken++;
      flag = 1;
      operator = "-";
      CodeGenerator.addInstruction("LIT", "0", "0");
    }

    node = new DefaultMutableTreeNode("C");
    parent.add(node);
    error = rule_C(node);
    if (flag == 1) {
      String s = SemanticAnalyzer.popStack();
      SemanticAnalyzer.pushStack(SemanticAnalyzer.calculateCube(s, operator));
      CodeGenerator.addInstruction("OPR", "3", "0");
      System.out.println("here");
    }
    return error;
  }
  @Override
  protected void genRecognizerHeaderFile(
      Tool tool, CodeGenerator generator, Grammar grammar, ST headerFileST, String extName)
      throws IOException {

    // Its better we remove the EOF Token, as it would have been defined everywhere in C.
    // we define it later as "EOF_TOKEN" instead of "EOF"
    List<?> tokens = (List<?>) headerFileST.getAttribute("tokens");
    for (int i = 0; i < tokens.size(); ++i) {
      boolean can_break = false;
      Object tok = tokens.get(i);
      if (tok instanceof Aggregate) {
        Aggregate atok = (Aggregate) tok;
        for (Map.Entry<String, Object> pairs : atok.properties.entrySet()) {
          if (pairs.getValue().equals("EOF")) {
            tokens.remove(i);
            can_break = true;
            break;
          }
        }
      }

      if (can_break) break;
    }

    // Pick up the file name we are generating. This method will return a
    // a file suffixed with .c, so we must substring and add the extName
    // to it as we cannot assign into strings in Java.
    ///
    String fileName = generator.getRecognizerFileName(grammar.name, grammar.type);
    fileName = fileName.substring(0, fileName.length() - 4) + extName;

    generator.write(headerFileST, fileName);
  }
示例#6
0
 // switch
 private static void rule_switch(DefaultMutableTreeNode parent) {
   DefaultMutableTreeNode node = null;
   DefaultMutableTreeNode parentS = parent;
   node = new DefaultMutableTreeNode("switch");
   parent.add(node);
   String id = "";
   if (tokens.get(currentToken).getWord().equals("(")) {
     node = new DefaultMutableTreeNode("(");
     parent.add(node);
     currentToken++;
   }
   if (tokens.get(currentToken).getToken().equals("IDENTIFIER")) {
     node = new DefaultMutableTreeNode("identifier(" + tokens.get(currentToken).getWord() + ")");
     parent.add(node);
     int line = tokens.get(currentToken).getLine();
     id = tokens.get(currentToken).getWord();
     String type = SemanticAnalyzer.doesExist(id);
     String value = SemanticAnalyzer.getValue(id);
     if (type.equals("error")) SemanticAnalyzer.error(gui, 0, line, id);
     currentToken++;
   }
   if (tokens.get(currentToken).getWord().equals(")")) {
     node = new DefaultMutableTreeNode(")");
     parent.add(node);
     currentToken++;
   }
   if (tokens.get(currentToken).getWord().equals("{")) {
     node = new DefaultMutableTreeNode("{");
     parent.add(node);
     currentToken++;
   }
   if (tokens.get(currentToken).getWord().equals("case")) {
     node = new DefaultMutableTreeNode("case");
     parentS.add(node);
     currentToken++;
   }
   rule_cases(parentS, node, id);
   if (tokens.get(currentToken).getWord().equals("default")) {
     node = new DefaultMutableTreeNode("default");
     parent.add(node);
     currentToken++;
     CodeGenerator.addInstruction("JMP", "#labelD", "0");
     codeLine++;
     rule_default(node);
   }
   if (tokens.get(currentToken).getWord().equals("}")) {
     node = new DefaultMutableTreeNode("}");
     parent.add(node);
     currentToken++;
   }
   // codeLine++;
   // codeLine++;
   CodeGenerator.addLabel("labelES", codeLine);
 }
  @Override
  protected void genRecognizerFile(
      Tool tool, CodeGenerator generator, Grammar grammar, ST outputFileST) throws IOException {

    // Before we write this, and cause it to generate its string,
    // we need to add all the string literals that we are going to match
    //
    outputFileST.add("literals", strings);
    String fileName = generator.getRecognizerFileName(grammar.name, grammar.type);
    generator.write(outputFileST, fileName);
  }
示例#8
0
  public static void main(String[] args) {
    Symbol result = null;
    AST root = null;
    CodeGenerator cg = new CodeGenerator();
    ArrayList<ErrorObject> scannerErrors, parserErrors;
    int nbExceptions = 0;

    try {
      FileReader myFile = new FileReader(args[0]);
      mScanner = new Scanner(myFile);
      mParser = new Parser(mScanner);
    } catch (Exception e) {
      nbExceptions++;
      System.err.println("Invalid file");
    }

    try {
      result = mParser.parse();
    } catch (Exception e) {
      nbExceptions++;
      if (DEBUG) {
        System.err.println("Parse error: " + e);
        e.printStackTrace();
      } else System.err.println("A parsing error has occured.");
    }

    scannerErrors = mScanner.getErrors();
    for (ErrorObject err : scannerErrors) System.err.println("\t" + args[0] + err);

    parserErrors = mParser.errors;
    for (ErrorObject err : parserErrors) System.err.println("\t" + args[0] + err);

    if (scannerErrors.size() == 0 && parserErrors.size() == 0) {
      try {
        root = (AST) result.value;
      } catch (Exception e) {
        nbExceptions++;
        if (DEBUG) {
          System.err.println("Result error: " + e);
        } else System.err.println("An internal error has occured.");
      }
      cg.setRoot(root);

      if (nbExceptions == 0) cg.generateCode("tests/output/" + args[1] + "/src/gen/Main.java");
    }

    if (scannerErrors.size() != 0 || parserErrors.size() != 0 || nbExceptions != 0) {
      System.err.println(
          "\n\t>> Code generation aborted; see the compiler error output for details.");
    }
  }
示例#9
0
 public static DefaultMutableTreeNode run(Vector<Token> t, Gui gui) {
   Parser.gui = gui;
   tokens = t;
   currentToken = 0;
   root = new DefaultMutableTreeNode("program");
   CodeGenerator.clear(gui);
   //
   rule_program(root);
   CodeGenerator.addInstruction("OPR", "0", "0");
   codeLine++;
   gui.writeSymbolTable(SemanticAnalyzer.getSymbolTable());
   CodeGenerator.writeCode(gui);
   //
   return root;
 }
示例#10
0
 // and
 private static void rule_x(DefaultMutableTreeNode parent) {
   int counter = 0;
   DefaultMutableTreeNode node = new DefaultMutableTreeNode("Y");
   parent.add(node);
   rule_y(node);
   counter++;
   while (tokens.get(currentToken).getWord().equals("&")) {
     node = new DefaultMutableTreeNode("&");
     parent.add(node);
     node = new DefaultMutableTreeNode("Y");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
     rule_y(node);
     counter++;
     // if visited twice
     if (counter == 2) {
       CodeGenerator.addInstruction("OPR", "9", "0");
       codeLine++;
       String x = SemanticAnalyzer.popStack();
       String y = SemanticAnalyzer.popStack();
       String result = SemanticAnalyzer.calculateCube(x, y, "&");
       SemanticAnalyzer.pushStack(result);
       counter--;
     }
   }
 }
示例#11
0
  /**
   * Generate the classfile instructions for this operand
   *
   * @param codeGen the code generator
   */
  public void generateInstructions(CodeGenerator codeGen) {
    int opcode;

    switch (getType()) {
      case ClassfileConstants2.TYP_REFERENCE:
        opcode = ClassfileConstants2.opc_aload;
        break;
      case ClassfileConstants2.TYP_DOUBLE:
        opcode = ClassfileConstants2.opc_dload;
        break;
      case ClassfileConstants2.TYP_FLOAT:
        opcode = ClassfileConstants2.opc_fload;
        break;
      case ClassfileConstants2.TYP_INT:
        opcode = ClassfileConstants2.opc_iload;
        break;
      case ClassfileConstants2.TYP_LONG:
        opcode = ClassfileConstants2.opc_lload;
        break;
      case ClassfileConstants2.TYP_ADDRESS:
        opcode = ClassfileConstants2.opc_aload;
        break;
      default:
        throw new InconsistencyException("unknows type : " + getType());
    }
    codeGen.addInstruction(new LocalVarInstruction(opcode, register));
  }
  public List<DirtyBicycle> getDirtyBicycles(final Year year, final String file)
      throws PriceReaderException {
    List<DirtyBicycle> toReturn = new ArrayList<DirtyBicycle>();
    HSSFSheet sheet = getSheet(file, 0);
    List<PriceRow> rows = getPriceRows(sheet, Brand.STELS);
    for (PriceRow row : rows) {
      String dirtyName = row.getModelName().trim();
      List<SimpleBicycle> km;
      if (year.equals(Year.YEAR_2016)) {
        km = knownModels;
      } else if (year.equals(Year.YEAR_2015)) {
        km = knownModels2015;
      } else {
        LOGGER.error("YEAR is not defined");
        return Collections.emptyList();
      }
      for (SimpleBicycle simpleBicycle : km) {
        if (simpleBicycle.getDirtyModel().equals(dirtyName.trim())) {
          DirtyBicycle bicycle = new DirtyBicycle(simpleBicycle);
          bicycle.setPrice(getRoundedPrice(row.getRetailPrice()));
          bicycle.setDescription(row.getDescription());
          bicycle.setProdCode(CodeGenerator.generateCode(bicycle));
          toReturn.add(bicycle);
        }
      }
    }

    return toReturn;
  }
示例#13
0
 // div and mult
 private static void rule_a(DefaultMutableTreeNode parent) {
   int counter = 0;
   DefaultMutableTreeNode node = new DefaultMutableTreeNode("B");
   parent.add(node);
   rule_b(node);
   counter++;
   String op = "";
   while (tokens.get(currentToken).getWord().equals("/")
       || tokens.get(currentToken).getWord().equals("*")) {
     op = tokens.get(currentToken).getWord();
     // get operator number
     String getOpNum = "";
     if (op.equals("/")) getOpNum = "5";
     else if (op.equals("*")) getOpNum = "4";
     node = new DefaultMutableTreeNode(tokens.get(currentToken).getWord());
     parent.add(node);
     node = new DefaultMutableTreeNode("B");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
     rule_b(node);
     counter++;
     if (counter == 2) {
       CodeGenerator.addInstruction("OPR", getOpNum, "0");
       codeLine++;
       String x = SemanticAnalyzer.popStack();
       String y = SemanticAnalyzer.popStack();
       String result = SemanticAnalyzer.calculateCube(x, y, op);
       SemanticAnalyzer.pushStack(result);
       counter--;
     }
   }
 }
示例#14
0
文件: Main.java 项目: nd33/Heels
  public static void main(String[] args) {

    try {
      Scanner consoleInput = new Scanner(System.in);
      System.out.println("Enter file name: ");
      String fileName = consoleInput.next();

      if (!fileName.endsWith(".t")) {
        System.out.println("Expecting a LOGO file");
        return;
      }

      Root program = Parser.parse(Lexer.tokenise(FileManager.contentsOfFile(fileName)));

      System.out.println("Enter output file name");
      String outFileName = consoleInput.next();
      if (!outFileName.endsWith(".ps") && !outFileName.endsWith(".eps")) {
        outFileName += ".ps";
      }

      String output = CodeGenerator.generateCodeText(program);

      if (ErrorLog.containsErrors()) {
        ErrorLog.displayErrors();
        return;
      } else {
        FileManager.writeStringToFile(output, outFileName);
      }

    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    } catch (IOException IO) {
      System.out.println(IO.getMessage());
    }
  }
示例#15
0
  private static boolean rule_X(DefaultMutableTreeNode parent) {

    int flag = 1;
    String operator = "";
    boolean error = false;
    DefaultMutableTreeNode node;
    node = new DefaultMutableTreeNode("Y");
    parent.add(node);
    error = rule_Y(node);

    while (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("&")) {
      node = new DefaultMutableTreeNode("&");
      parent.add(node);
      currentToken++;
      node = new DefaultMutableTreeNode("Y");
      parent.add(node);
      error = rule_Y(node);
      flag++;
      operator = "&";
      if (flag == 2) {
        String type1 = SemanticAnalyzer.popStack();
        String type2 = SemanticAnalyzer.popStack();
        System.out.println("result: " + SemanticAnalyzer.calculateCube(type1, type2, operator));
        SemanticAnalyzer.pushStack(SemanticAnalyzer.calculateCube(type1, type2, operator));
        CodeGenerator.addInstruction("OPR", "9", "0");
        flag = 1;

      } else flag = 1;
    }
    return error;
  }
示例#16
0
  private static boolean rule_Y(DefaultMutableTreeNode parent) {
    // System.out.println("Inside Y");
    int flag = 0;
    String operator = "";
    boolean error = false;
    DefaultMutableTreeNode node;
    if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("!")) {
      node = new DefaultMutableTreeNode("!");
      parent.add(node);
      currentToken++;
      flag = 1;
      operator = "!";
    }
    node = new DefaultMutableTreeNode("R");
    parent.add(node);
    error = rule_R(node);
    if (flag == 1) {
      String s = SemanticAnalyzer.popStack();
      SemanticAnalyzer.pushStack(SemanticAnalyzer.calculateCube(s, operator));
      CodeGenerator.addInstruction("OPR", "10", "0");
      System.out.println("Here in Y");
    }

    return error;
  }
示例#17
0
  private static boolean rule_variable(DefaultMutableTreeNode parent) {
    boolean error = false;
    DefaultMutableTreeNode node;

    String type = tokens.get(currentToken).getWord();
    String iden = "";
    node = new DefaultMutableTreeNode(tokens.get(currentToken).getWord());
    parent.add(node);
    currentToken++;
    if (currentToken < tokens.size()
        && tokens.get(currentToken).getToken().equalsIgnoreCase("identifier")) {
      SemanticAnalyzer.checkVariable(
          tokens.get(currentToken - 1).getWord(), tokens.get(currentToken).getWord());
      node =
          new DefaultMutableTreeNode("identifier" + "(" + tokens.get(currentToken).getWord() + ")");
      iden = tokens.get(currentToken).getWord();
      CodeGenerator.addVariable(type, iden);
      parent.add(node);
      currentToken++;
    } else {

      error(6);
    }

    return error;
  }
示例#18
0
  private static boolean rule_assignment(DefaultMutableTreeNode parent) {

    boolean error = false;
    DefaultMutableTreeNode node;

    String iden = tokens.get(currentToken).getWord();
    node =
        new DefaultMutableTreeNode("identifier" + "(" + tokens.get(currentToken).getWord() + ")");
    parent.add(node);

    String s = tokens.get(currentToken).getWord();
    if (SemanticAnalyzer.getSymbolTable().get(s) != null)
      SemanticAnalyzer.pushStack(SemanticAnalyzer.getSymbolTable().get(s).firstElement().getType());
    else {
      SemanticAnalyzer.pushStack("ERROR");
      SemanticAnalyzer.error(getgui(), 0, getlineno(), s);
    }

    currentToken++;
    if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("=")) {
      node = new DefaultMutableTreeNode("=");
      parent.add(node);
      currentToken++;
    } else {
      error(5);
      while (currentToken < tokens.size()
          && !(tokens.get(currentToken).getWord().equals("!")
              || tokens.get(currentToken).getWord().equals("-")
              || tokens.get(currentToken).getToken().equals("INTEGER")
              || tokens.get(currentToken).getToken().equals("OCTAL")
              || tokens.get(currentToken).getToken().equals("HEXADECIMAL")
              || tokens.get(currentToken).getToken().equals("BINARY")
              || tokens.get(currentToken).getToken().equals("STRING")
              || tokens.get(currentToken).getToken().equals("CHARACTER")
              || tokens.get(currentToken).getToken().equals("FLOAT")
              || tokens.get(currentToken).getToken().equals("IDENTIFIER")
              || tokens.get(currentToken).getWord().equals("true")
              || tokens.get(currentToken).getWord().equals("false")
              || tokens.get(currentToken).getWord().equals("(")
              || tokens.get(currentToken).getWord().equals(")")
              || tokens.get(currentToken).getWord().equals(";"))) {
        currentToken++;
      }
    }

    node = new DefaultMutableTreeNode("expression");
    parent.add(node);
    error = rule_expression(node);

    String s1 = SemanticAnalyzer.popStack();
    String s2 = SemanticAnalyzer.popStack();
    String operator = "=";
    String res = SemanticAnalyzer.calculateCube(s1, s2, operator);
    CodeGenerator.addInstruction("STO", iden, "0");

    if (res.equals("ERROR")) SemanticAnalyzer.error(getgui(), 2, getlineno(), "");

    return error;
  }
示例#19
0
  private static boolean rule_R(DefaultMutableTreeNode parent) {
    int flag = 1;
    String operator = "";
    String operator_num = "";

    boolean error = false;
    DefaultMutableTreeNode node;
    node = new DefaultMutableTreeNode("E");
    parent.add(node);
    error = rule_E(node);

    while (currentToken < tokens.size()
        && (tokens.get(currentToken).getWord().equals("<")
            || tokens.get(currentToken).getWord().equals(">")
            || tokens.get(currentToken).getWord().equals("==")
            || tokens.get(currentToken).getWord().equals("!="))) {
      if (tokens.get(currentToken).getWord().equals("<")) {
        node = new DefaultMutableTreeNode("<");
        parent.add(node);
        operator = "<";
        operator_num = "12";
      }
      if (tokens.get(currentToken).getWord().equals(">")) {
        node = new DefaultMutableTreeNode(">");
        parent.add(node);
        operator = ">";
        operator_num = "11";
      }
      if (tokens.get(currentToken).getWord().equals("==")) {
        node = new DefaultMutableTreeNode("==");
        parent.add(node);
        operator = "==";
        operator_num = "15";
      }
      if (tokens.get(currentToken).getWord().equals("!=")) {
        node = new DefaultMutableTreeNode("!=");
        parent.add(node);
        operator = "!=";
        operator_num = "16";
      }

      currentToken++;
      node = new DefaultMutableTreeNode("E");
      parent.add(node);
      error = rule_E(node);
      flag++;
      if (flag == 2) {
        String type1 = SemanticAnalyzer.popStack();
        String type2 = SemanticAnalyzer.popStack();
        System.out.println("result: " + SemanticAnalyzer.calculateCube(type1, type2, operator));
        SemanticAnalyzer.pushStack(SemanticAnalyzer.calculateCube(type1, type2, operator));
        CodeGenerator.addInstruction("OPR", operator_num, "0");
        flag = 1;

      } else flag = 1;
    }
    return error;
  }
示例#20
0
  private static boolean rule_return(DefaultMutableTreeNode parent) {
    boolean error = false;
    DefaultMutableTreeNode node;

    node = new DefaultMutableTreeNode(tokens.get(currentToken).getWord());
    parent.add(node);
    currentToken++;
    CodeGenerator.addInstruction("OPR", "1", "0");
    return error;
  }
示例#21
0
 // default
 private static void rule_default(DefaultMutableTreeNode parent) {
   DefaultMutableTreeNode node = null;
   node = new DefaultMutableTreeNode("default");
   parent.add(node);
   if (tokens.get(currentToken).getWord().equals(":")) {
     node = new DefaultMutableTreeNode(":");
     parent.add(node);
     currentToken++;
   }
   CodeGenerator.addLabel("labelD", codeLine);
   rule_program(parent);
 }
示例#22
0
 // if
 private static void rule_if(DefaultMutableTreeNode parent) {
   DefaultMutableTreeNode node = new DefaultMutableTreeNode("if");
   parent.add(node);
   String end = "ifE" + ifNum;
   int num = ifNum;
   ifNum++;
   if (tokens.get(currentToken).getWord().equals("(")) {
     node = new DefaultMutableTreeNode("(");
     parent.add(node);
     node = new DefaultMutableTreeNode("expression");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
     rule_expression(node);
     CodeGenerator.addInstruction("JMC", "#ifE" + ifNum, "false");
     codeLine++;
     int n = tokens.get(currentToken).getLine();
     String x = SemanticAnalyzer.popStack();
     if (!x.equals("BOOLEAN")) SemanticAnalyzer.error(gui, 3, n, "");
     if (tokens.get(currentToken).getWord().equals(")")) {
       node = new DefaultMutableTreeNode(")");
       parent.add(node);
       node = new DefaultMutableTreeNode("program");
       parent.add(node);
       if (currentToken < tokens.size() - 1) currentToken++;
       rule_program(node);
       CodeGenerator.addInstruction("JMP", "#ifE" + num, "0");
       codeLine++;
       CodeGenerator.addLabel("ifE" + ifNum, codeLine);
       if (tokens.get(currentToken).getWord().equals("else")) {
         node = new DefaultMutableTreeNode("else");
         parent.add(node);
         node = new DefaultMutableTreeNode("program");
         parent.add(node);
         if (currentToken < tokens.size() - 1) currentToken++;
         rule_program(node);
       }
       CodeGenerator.addLabel("ifE" + num, codeLine);
     }
   }
 }
示例#23
0
  private static boolean rule_E(DefaultMutableTreeNode parent) {

    boolean error;
    DefaultMutableTreeNode node;
    node = new DefaultMutableTreeNode("A");
    parent.add(node);
    error = rule_A(node);

    int flag = 1;

    String operator = new String();
    String operator_num = "";
    while (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("+")
        || currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("-")) {

      if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("+")) {
        operator = tokens.get(currentToken).getWord();
        node = new DefaultMutableTreeNode("+");
        parent.add(node);
        currentToken++;
        node = new DefaultMutableTreeNode("A");
        parent.add(node);
        error = rule_A(node);
        operator = "+";
        operator_num = "2";
        flag++;
      } else if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("-")) {
        operator = tokens.get(currentToken).getWord();
        node = new DefaultMutableTreeNode("-");
        parent.add(node);
        currentToken++;
        node = new DefaultMutableTreeNode("A");
        parent.add(node);
        error = rule_A(node);
        operator = "-";
        operator_num = "3";
        flag++;
      }

      if (flag == 2) {
        String type1 = SemanticAnalyzer.popStack();
        String type2 = SemanticAnalyzer.popStack();
        System.out.println("result: " + SemanticAnalyzer.calculateCube(type1, type2, operator));
        SemanticAnalyzer.pushStack(SemanticAnalyzer.calculateCube(type1, type2, operator));
        CodeGenerator.addInstruction("OPR", operator_num, "0");
        flag = 1;

      } else flag = 1;
    }
    return error;
  }
示例#24
0
  public CompiledScript compile(Script script, String className) {
    try (CodeSizeAnalysis analysis = new CodeSizeAnalysis()) {
      analysis.submit(script);
    } catch (CodeSizeException e) {
      e.printStackTrace();
      throw new CompilationException(e.getMessage());
    }

    // set-up
    // prepend '#' to mark generated classes, cf. ErrorPrototype
    String clazzName = "#" + className;
    String superClassName = Types.CompiledScript.getInternalName();
    Code code = new Code(clazzName, superClassName, script.getSourceFile(), sourceMap(script));

    // generate code
    try (CodeGenerator codegen = new CodeGenerator(code, script.getOptions())) {
      codegen.compile(script);
    }

    // finalize
    CodeLoader loader = new CodeLoader();
    List<ClassCode> classes = code.getClasses();
    for (ClassCode classCode : classes) {
      byte[] bytes = classCode.toByteArray();
      if (compilerOptions.contains(Option.Debug)) {
        debug(bytes);
      }
      // System.out.printf("define class '%s'%n", classCode.className);
      loader.defineClass(classCode.className, bytes);
    }

    try {
      Class<?> c = loader.loadClass(clazzName);
      return (CompiledScript) c.newInstance();
    } catch (ReflectiveOperationException e) {
      throw new RuntimeException(e);
    }
  }
示例#25
0
 // negative
 private static void rule_b(DefaultMutableTreeNode parent) {
   DefaultMutableTreeNode node = null;
   boolean b = false;
   if (tokens.get(currentToken).getWord().equals("-")) {
     b = true;
     node = new DefaultMutableTreeNode(tokens.get(currentToken).getWord());
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
     CodeGenerator.addInstruction("LIT", "0", "0");
     codeLine++;
   }
   node = new DefaultMutableTreeNode("C");
   parent.add(node);
   if (b) {
     String x = SemanticAnalyzer.popStack();
     String result = SemanticAnalyzer.calculateCube(x, "-");
     SemanticAnalyzer.pushStack(result);
   }
   rule_c(node);
   if (b) {
     CodeGenerator.addInstruction("OPR", "3", "0");
     codeLine++;
   }
 }
示例#26
0
  private CompiledFunction compile(FunctionNode function, String className) {
    try (CodeSizeAnalysis analysis = new CodeSizeAnalysis()) {
      analysis.submit(function);
    } catch (CodeSizeException e) {
      throw new CompilationException(e.getMessage());
    }

    // set-up
    // prepend '#' to mark generated classes, cf. ErrorPrototype
    String clazzName = "#" + className;
    String superClassName = Types.CompiledFunction.getInternalName();
    Code code = new Code(clazzName, superClassName, "<Function>", null);

    // generate code
    try (CodeGenerator codegen = new CodeGenerator(code, optionsFrom(function))) {
      codegen.compileFunction(function);
    }

    // finalize
    CodeLoader loader = new CodeLoader();
    List<ClassCode> classes = code.getClasses();
    for (ClassCode classCode : classes) {
      byte[] bytes = classCode.toByteArray();
      if (compilerOptions.contains(Option.Debug)) {
        debug(bytes);
      }
      loader.defineClass(classCode.className, bytes);
    }

    try {
      Class<?> c = loader.loadClass(clazzName);
      return (CompiledFunction) c.newInstance();
    } catch (ReflectiveOperationException e) {
      throw new RuntimeException(e);
    }
  }
示例#27
0
  @Override
  void add(Node n, Context context) {
    Node parent = n.getParent();
    if (parent != null && (parent.isBlock() || parent.isScript())) {
      if (n.isFunction()) {
        add(getFunctionAnnotation(n));
      } else if (n.isExprResult() && n.getFirstChild().isAssign()) {
        Node rhs = n.getFirstChild().getLastChild();
        add(getTypeAnnotation(rhs));
      } else if (n.isVar() && n.getFirstChild().getFirstChild() != null) {
        add(getTypeAnnotation(n.getFirstChild().getFirstChild()));
      }
    }

    super.add(n, context);
  }
示例#28
0
 // variable
 private static void rule_variable(DefaultMutableTreeNode parent) {
   String type = tokens.get(currentToken - 1).getWord();
   String id = tokens.get(currentToken).getWord();
   DefaultMutableTreeNode node = new DefaultMutableTreeNode(type);
   parent.add(node);
   if (tokens.get(currentToken).getToken().equals("IDENTIFIER")) {
     SemanticAnalyzer.checkVariable(
         tokens.get(currentToken - 1).getWord(),
         tokens.get(currentToken).getWord(),
         tokens.get(currentToken).getLine(),
         gui);
     node = new DefaultMutableTreeNode("identifier(" + id + ")");
     parent.add(node);
     if (currentToken < tokens.size() - 1) currentToken++;
     CodeGenerator.addVariable(type, id);
   }
 }
  @Test
  public void runCodegen() throws IOException {
    final Rule rule = parser.parseRule(ruleForTest(), true).withId("1");

    final String sourceCode = CodeGenerator.sourceCodeForRule(rule);
    Files.write(sourceCode, OUTFILE.toFile(), StandardCharsets.UTF_8);

    log.info("Code:\n{}", sourceCode);

    try {

      ClassLoader ruleClassloader = new ClassLoader() {};
      //noinspection unchecked
      Class<GeneratedRule> rule$1 =
          (Class<GeneratedRule>)
              JCC.loadFromJava(
                  ruleClassloader,
                  "org.graylog.plugins.pipelineprocessor.$dynamic.rules.rule$1",
                  sourceCode);

      //noinspection unchecked
      final Set<Constructor> constructors =
          ReflectionUtils.getConstructors(rule$1, input -> input.getParameterCount() == 1);
      final Constructor onlyElement = Iterables.getOnlyElement(constructors);
      final GeneratedRule generatedRule = (GeneratedRule) onlyElement.newInstance(functionRegistry);

      final Message message = new Message("hello", "jenkins.torch.sh", Tools.nowUTC());
      message.addField("message", "#1234");
      message.addField("something_that_doesnt_exist", "foo");
      final EvaluationContext context = new EvaluationContext(message);

      final boolean when = generatedRule.when(context);
      if (when) {
        generatedRule.then(context);
      }
      log.info("created dynamic rule {} matches: {}", generatedRule.name(), when);

      assertThat(context.currentMessage().hasField("some_identifier")).isTrue();

    } catch (InvocationTargetException
        | ClassNotFoundException
        | InstantiationException
        | IllegalAccessException e) {
      log.error("Cannot load dynamically created class!", e);
    }
  }
  public void writeBody(CodeGenerator generator) {
    generator.writeType(getTypeName());
    generator.writeType(" ");
    generator.write(getName());

    if (getInitialValue() != null) {
      generator.write(" = ");
      generator.write(getInitialValue());
    }

    generator.write(";");
  }