예제 #1
0
  /**
   * This constructor is used when VARDECL is a STMT. We get the ID and the type, ensure that it is
   * a valid type, and add it to its parent body's vartable.
   *
   * @param b the parent body
   * @param c the Code object
   */
  public VARDECL(BODY b, Code c) {
    body = b;
    code = c.currentLine();
    lineNum = c.currentLineNum();

    String[] tokens = Code.tokenize(code);

    type = tokens[1];

    // Ensure that the type is int, string or bool.
    if (!Terminals.dataTypes.contains(type))
      Interpreter.error(
          "VARDECL", lineNum, code, "Invalid VARDECL data type. Must be int, string, or bool");
    if (type.equals(Terminals.VOID))
      Interpreter.error(
          "VARDECL", lineNum, code, "Invalid VARDECL data type. Must be int, string, or bool");

    // Get the ID
    id = ID.validate(tokens[2], c);

    if (tokens[tokens.length - 1] != Terminals.SEMICOLON) {
      Interpreter.error("VARDECL", lineNum, code, "Missing semicolon");
    }

    // Add to the varTable of the parent body
    body.varTable.add(this);
  }
예제 #2
0
  /**
   * Ensure that the var doesn't exist twice in the same varTable (it can exist in different
   * varTables)
   */
  public void validate() {
    Interpreter.writeln("validate", "Validating VARDECL");

    if (Collections.frequency(body.varTable, Interpreter.findVar(body, id)) > 1) {
      Interpreter.error(
          "VARDECL", lineNum, code, "Var " + id + " cannot be declared more than once!");
    }
  }