📄 encoder.java
字号:
} 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 + -