def compile(self, state: "Generator.GeneratorState", program: "Generator.Trac42Program"): if str(self.__identifier) == "print": unused, arguments_type = self.__expression.compile(state, program) for arg in reversed(arguments_type): if arg == TypeChecker.Types.INT: program.emit( Generator.Instruction(Generator.OpCode.WRITEINT)) elif arg == TypeChecker.Types.BOOL: program.emit( Generator.Instruction(Generator.OpCode.WRITEBOOL)) else: raise Generator.CompilerException( "print only accepts parameters of type int or bool, " "{0} given".format(arg)) # remove the parameter that was just printed program.emit(Generator.Instruction(Generator.OpCode.POP, 1)) return self.__expected_return_type else: # allocate space for return value program.emit(Generator.Instruction(Generator.OpCode.DECL, 1)) # evaluate params in reverse order arguments_quantity, unused = self.__expression.compile( state, program) # call function program.emit( Generator.Instruction(Generator.OpCode.BSR, target=str(self.__identifier))) if arguments_quantity > 0: # remove all arguments program.emit( Generator.Instruction(Generator.OpCode.POP, argument=arguments_quantity)) return self.__expected_return_type
def compile(self, state: "Generator.GeneratorState", program: "Generator.Trac42Program"): if self.__expression is not None: return_offset = state.offset_map['return'] program.emit(Generator.Instruction(Generator.OpCode.LVAL, argument=return_offset)) self.__expression.compile(state, program) if self.__expected_return_type == TypeChecker.Types.INT: program.emit(Generator.Instruction(Generator.OpCode.ASSINT)) elif self.__expected_return_type == TypeChecker.Types.BOOL: program.emit(Generator.Instruction(Generator.OpCode.ASSBOOL)) else: raise Generator.CompilerException("Invalid return type {0}".format(self.__expected_return_type)) program.emit(Generator.Instruction(Generator.OpCode.UNLINK)) program.emit(Generator.Instruction(Generator.OpCode.RTS))
def compile(self, state: "Generator.GeneratorState", program: "Generator.Trac42Program"): raise Generator.CompilerException("Cannot have identifier list inside function, " "nested functions are not allowed")