Exemple #1
0
 def visit(self, node, variables : Variables):
     self.code.append(PushIL())
     p = variables.add_var(node.name.value)
     
     if node.expr != None:
         self.visit(node.expr, variables)
         r = variables.peek_last()
         self.code.append(VarToVarIL(variables.id(p), variables.id(r) ))
         variables.pop_var()
         self.code.append(PopIL(1))
Exemple #2
0
 def unary_op(self, node, variables : Variables , symb : str):
     self.code.append(CommentIL('Unary_op'))
     res = variables.add_temp()
     self.code.append(PushIL())
 
     self.visit(node.expr, variables)
     l = variables.peek_last()
     
     self.code.append(UnaryOpIL(variables.id(res), variables.id(l), symb))
     variables.pop_var()
     self.code.append(PopIL(1))
Exemple #3
0
    def bin_op(self, node, variables : Variables, sym : str):
        self.code.append(CommentIL('Binary_op'))
        self.code.append(PushIL(0))
        res = variables.add_temp()


        self.visit(node.left,  variables)
        l = variables.peek_last()
        self.visit(node.right, variables)
        r = variables.peek_last()  
        
        self.code.append(BinOpIL(variables.id(res), variables.id(l), variables.id(r), sym))
        
        variables.pop_var()
        variables.pop_var()
        self.code.append(PopIL(2))
Exemple #4
0
    def create_constructor(self, attrs):
        self.code.append(LabelIL(self.cur_class, 'Constructor', True))
        
        variables = Variables()
        variables.add_var('self')
        variables.add_temp() # return address

        for node in attrs:
            if node.value == None:
                continue
            self.visit(node.value, variables)
            p = variables.peek_last()
            idx = self.vt.get_attr_id(self.cur_class, node.name.value) 
            self.code.append(VarToMemoIL(variables.id('self'), variables.id(p), idx))
            variables.pop_var()
            self.code.append(PopIL(1))
        
        self.code.append(PushIL()) #No result, but needed in logic
        self.code.append(ReturnIL())