Exemplo n.º 1
0
 def evalToRegInstr(self, p, reg):
     try:
         isInitialized = self.identifier.declaration.initialized
         if isInitialized == False:
             raise Exception("Variable '%s' is not initialized" % self.identifier.pidentifier)
         if isinstance(self.identifier, ArrayAccess):
             return Instructions.LOAD_ARRAY_VALUE_TO_REGISTER(p, self.identifier, reg)
         return Instructions.LOAD_IDENTIFIER_VALUE_TO_REGISTER(p, self.identifier, reg)
     except Exception as err:
         raise Exception(str(err) + " at line %i" % self.lineNumber)
Exemplo n.º 2
0
    def memAddressToReg(self, p, reg1, reg2):
        declaration = self.declaration

        if not declaration.isArray():
            raise Exception("'%s' is not an Array" % declaration.pidentifier)

        memoryId = declaration.memoryId
        arrRangeFrom = declaration.rangeFrom
        arrRangeTo = declaration.rangeTo

        indexIdentifier = Identifier(self.index)

        # tab(5:15)         [memoryId:memoryId+10]
        # a := 7
        # tab(a)
        Instructions.LOAD_IDENTIFIER_VALUE_TO_REGISTER(p, indexIdentifier, reg2)  # reg2 = a.value
        Instructions.setRegisterConst(p, reg1, arrRangeFrom)                      # reg1 = arrRangeFrom
        Instructions.SUB(p, reg2, reg1)                                           # reg2 = reg2 - reg1 // offset
        Instructions.setRegisterConst(p, reg1, memoryId)                          # reg1 = memoryId
        Instructions.ADD(p, reg1, reg2)                                           # reg1 = reg1 + reg2 // memid + offset