⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encoder.java

📁 The triangle language processor will be consist of a compiler, an interpreter, and a disassembler
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
  }  public Object visitTypeDeclaration(TypeDeclaration ast, Object o) {    // just to ensure the type's representation is decided    ast.T.visit(this, null);    return new Integer(0);  }  public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast,					      Object o) {    return new Integer(0);  }  public Object visitVarDeclaration(VarDeclaration ast, Object o) {    Frame frame = (Frame) o;    int extraSize;    extraSize = ((Integer) ast.T.visit(this, null)).intValue();    emit(Machine.PUSHop, 0, 0, extraSize);    ast.entity = new KnownAddress(Machine.addressSize, frame.level, frame.size);    writeTableDetails(ast);    return new Integer(extraSize);  }  // Array Aggregates  public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast,					    Object o) {    Frame frame = (Frame) o;    int elemSize = ((Integer) ast.E.visit(this, frame)).intValue();    Frame frame1 = new Frame(frame, elemSize);    int arraySize = ((Integer) ast.AA.visit(this, frame1)).intValue();    return new Integer(elemSize + arraySize);  }  public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) {    return ast.E.visit(this, o);  }  // Record Aggregates  public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast,					     Object o) {    Frame frame = (Frame) o;    int fieldSize = ((Integer) ast.E.visit(this, frame)).intValue();    Frame frame1 = new Frame (frame, fieldSize);    int recordSize = ((Integer) ast.RA.visit(this, frame1)).intValue();    return new Integer(fieldSize + recordSize);  }  public Object visitSingleRecordAggregate(SingleRecordAggregate ast,					   Object o) {    return ast.E.visit(this, o);  }  // Formal Parameters  public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) {    Frame frame = (Frame) o;    int valSize = ((Integer) ast.T.visit(this, null)).intValue();    ast.entity = new UnknownValue (valSize, frame.level, -frame.size - valSize);    writeTableDetails(ast);    return new Integer(valSize);  }  public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) {    Frame frame = (Frame) o;    int argsSize = Machine.closureSize;    ast.entity = new UnknownRoutine (Machine.closureSize, frame.level,				  -frame.size - argsSize);    writeTableDetails(ast);    return new Integer(argsSize);  }  public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) {    Frame frame = (Frame) o;    int argsSize = Machine.closureSize;    ast.entity = new UnknownRoutine (Machine.closureSize, frame.level,				  -frame.size - argsSize);    writeTableDetails(ast);    return new Integer(argsSize);  }  public Object visitVarFormalParameter(VarFormalParameter ast, Object o) {    Frame frame = (Frame) o;    ast.T.visit(this, null);    ast.entity = new UnknownAddress (Machine.addressSize, frame.level,				  -frame.size - Machine.addressSize);    writeTableDetails(ast);    return new Integer(Machine.addressSize);  }  public Object visitEmptyFormalParameterSequence(	 EmptyFormalParameterSequence ast, Object o) {    return new Integer(0);  }  public Object visitMultipleFormalParameterSequence( 	 MultipleFormalParameterSequence ast, Object o) {    Frame frame = (Frame) o;    int argsSize1 = ((Integer) ast.FPS.visit(this, frame)).intValue();    Frame frame1 = new Frame(frame, argsSize1);    int argsSize2 = ((Integer) ast.FP.visit(this, frame1)).intValue();    return new Integer(argsSize1 + argsSize2);  }  public Object visitSingleFormalParameterSequence(	 SingleFormalParameterSequence ast, Object o) {    return ast.FP.visit (this, o);  }  // Actual Parameters  public Object visitConstActualParameter(ConstActualParameter ast, Object o) {    return ast.E.visit (this, o);  }  public Object visitFuncActualParameter(FuncActualParameter ast, Object o) {    Frame frame = (Frame) o;    if (ast.I.decl.entity instanceof KnownRoutine) {      ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address;      // static link, code address      emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0);      emit(Machine.LOADAop, 0, Machine.CBr, address.displacement);    } else if (ast.I.decl.entity instanceof UnknownRoutine) {      ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address;      emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level,           address.level), address.displacement);    } else if (ast.I.decl.entity instanceof PrimitiveRoutine) {      int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement;      // static link, code address      emit(Machine.LOADAop, 0, Machine.SBr, 0);      emit(Machine.LOADAop, 0, Machine.PBr, displacement);    }    return new Integer(Machine.closureSize);  }  public Object visitProcActualParameter(ProcActualParameter ast, Object o) {    Frame frame = (Frame) o;    if (ast.I.decl.entity instanceof KnownRoutine) {      ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address;      // static link, code address      emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0);      emit(Machine.LOADAop, 0, Machine.CBr, address.displacement);    } else if (ast.I.decl.entity instanceof UnknownRoutine) {      ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address;      emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level,           address.level), address.displacement);    } else if (ast.I.decl.entity instanceof PrimitiveRoutine) {      int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement;      // static link, code address      emit(Machine.LOADAop, 0, Machine.SBr, 0);      emit(Machine.LOADAop, 0, Machine.PBr, displacement);    }    return new Integer(Machine.closureSize);  }  public Object visitVarActualParameter(VarActualParameter ast, Object o) {    encodeFetchAddress(ast.V, (Frame) o);    return new Integer(Machine.addressSize);  }  public Object visitEmptyActualParameterSequence(	 EmptyActualParameterSequence ast, Object o) {    return new Integer(0);  }  public Object visitMultipleActualParameterSequence(	 MultipleActualParameterSequence ast, Object o) {    Frame frame = (Frame) o;    int argsSize1 = ((Integer) ast.AP.visit(this, frame)).intValue();    Frame frame1 = new Frame (frame, argsSize1);    int argsSize2 = ((Integer) ast.APS.visit(this, frame1)).intValue();    return new Integer(argsSize1 + argsSize2);  }  public Object visitSingleActualParameterSequence(	 SingleActualParameterSequence ast, Object o) {    return ast.AP.visit (this, o);  }  // Type Denoters  public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) {    return new Integer(0);  }  public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) {    int typeSize;    if (ast.entity == null) {      int elemSize = ((Integer) ast.T.visit(this, null)).intValue();      typeSize = Integer.parseInt(ast.IL.spelling) * elemSize;      ast.entity = new TypeRepresentation(typeSize);      writeTableDetails(ast);    } else      typeSize = ast.entity.size;    return new Integer(typeSize);  }  public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) {    if (ast.entity == null) {      ast.entity = new TypeRepresentation(Machine.booleanSize);      writeTableDetails(ast);    }    return new Integer(Machine.booleanSize);  }  public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) {    if (ast.entity == null) {      ast.entity = new TypeRepresentation(Machine.characterSize);      writeTableDetails(ast);    }    return new Integer(Machine.characterSize);  }  public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) {    return new Integer(0);  }  public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast,					   Object o) {    return new Integer(0);  }  public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) {    if (ast.entity == null) {      ast.entity = new TypeRepresentation(Machine.integerSize);      writeTableDetails(ast);    }    return new Integer(Machine.integerSize);  }  public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) {    int typeSize;    if (ast.entity == null) {      typeSize = ((Integer) ast.FT.visit(this, new Integer(0))).intValue();      ast.entity = new TypeRepresentation(typeSize);      writeTableDetails(ast);    } else      typeSize = ast.entity.size;    return new Integer(typeSize);  }  public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast,					      Object o) {    int offset = ((Integer) o).intValue();    int fieldSize;    if (ast.entity == null) {      fieldSize = ((Integer) ast.T.visit(this, null)).intValue();      ast.entity = new Field (fieldSize, offset);      writeTableDetails(ast);    } else      fieldSize = ast.entity.size;    Integer offset1 = new Integer(offset + fieldSize);    int recSize = ((Integer) ast.FT.visit(this, offset1)).intValue();    return new Integer(fieldSize + recSize);  }  public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast,					    Object o) {    int offset = ((Integer) o).intValue();    int fieldSize;    if (ast.entity == null) {      fieldSize = ((Integer) ast.T.visit(this, null)).intValue();      ast.entity = new Field (fieldSize, offset);      writeTableDetails(ast);    } else      fieldSize = ast.entity.size;    return new Integer(fieldSize);  }  // Literals, Identifiers and Operators  public Object visitCharacterLiteral(CharacterLiteral ast, Object o) {    return null;  }  public Object visitIdentifier(Identifier ast, Object o) {    Frame frame = (Frame) o;    if (ast.decl.entity instanceof KnownRoutine) {      ObjectAddress address = ((KnownRoutine) ast.decl.entity).address;      emit(Machine.CALLop, displayRegister(frame.level, address.level),	   Machine.CBr, address.displacement);    } else if (ast.decl.entity instanceof UnknownRoutine) {      ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address;      emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level,           address.level), address.displacement);      emit(Machine.CALLIop, 0, 0, 0);    } else if (ast.decl.entity instanceof PrimitiveRoutine) {      int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement;      if (displacement != Machine.idDisplacement)        emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement);    } else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\="      int displacement = ((EqualityRoutine) ast.decl.entity).displacement;      emit(Machine.LOADLop, 0, 0, frame.size / 2);      emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement);    }    return null;  }  public Object visitIntegerLiteral(IntegerLiteral ast, Object o) {    return null;  }  public Object visitOperator(Operator ast, Object o) {    Frame frame = (Frame) o;    if (ast.decl.entity instanceof KnownRoutine) {      ObjectAddress address = ((KnownRoutine) ast.decl.entity).address;      emit(Machine.CALLop, displayRegister (frame.level, address.level),	   Machine.CBr, address.displacement);    } else if (ast.decl.entity instanceof UnknownRoutine) {      ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address;      emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level,           address.level), address.displacement);      emit(Machine.CALLIop, 0, 0, 0);    } else if (ast.decl.entity instanceof PrimitiveRoutine) {      int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement;      if (displacement != Machine.idDisplacement)        emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement);    } else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\="      int displacement = ((EqualityRoutine) ast.decl.entity).displacement;      emit(Machine.LOADLop, 0, 0, frame.size / 2);      emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement);    }    return null;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -