コード例 #1
0
 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
コード例 #2
0
 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))
コード例 #3
0
 def compile(self, state: "Generator.GeneratorState", program: "Generator.Trac42Program"):
     raise Generator.CompilerException("Cannot have identifier list inside function, "
                                       "nested functions are not allowed")