visitIf
unknown
python
a year ago
2.5 kB
2
Indexable
def visitIf(self, ast, o): if_exprCode, if_exprType = self.visit(ast.expr, Access(o.frame, o.sym, False, True)) self.emit.printout(if_exprCode) # print("COMPARE CODE >>>",if_exprCode) labelExit = o.frame.getNewLabel() if ast.elseStmt is not None: labelElse = o.frame.getNewLabel() labelElif = o.frame.getNewLabel() self.emit.printout(self.emit.emitIFFALSE(labelElif, o.frame)) self.emit.printout(self.emit.emitIFTRUE(labelExit, o.frame)) self.visit(ast.thenStmt, o) # print('ELSE >>>', ast.elseStmt) self.emit.printout(self.emit.emitLABEL(labelElif, o.frame)) labelElif_list = list() for _ in len(ast.elifStmt[1:]): # print('STMT >>>',stmt) labelElif = o.frame.getNewLabel() labelElif_list.append(labelElif) for expr, stmt in ast.elifStmt: # print('STMT >>>',stmt) labelElif = labelElif_list.pop(0) self.emit.printout(self.emit.emitLABEL(labelElif, o.frame)) exprCode, _ = self.visit(expr, Access(o.frame, o.sym, False, True)) self.emit.printout(exprCode) self.emit.printout(self.emit.emitIFTRUE(labelExit, o.frame)) self.emit.printout(self.emit.emitIFFALSE(labelElif, o.frame)) self.visit(stmt, o) # if self.has_return == False: # self.emit.printout(self.emit.emitGOTO(labelExit, o.frame)) self.emit.printout(self.emit.emitLABEL(labelElse, o.frame)) self.visit(ast.elseStmt, o) # self.emit.printout(self.emit.emitGOTO(labelExit, o.frame)) #if self.has_return == False: self.emit.printout(self.emit.emitLABEL(labelExit, o.frame)) else: self.visit(ast.thenStmt, o) self.emit.printout(self.emit.emitIFFALSE(labelExit, o.frame)) for stmt_element in ast.elifStmt: expr, stmt = stmt_element # print('STMT >>>',stmt) exprCode, exprType = self.visit(expr, Access(o.frame, o.sym, False, True)) self.emit.printout(exprCode) self.emit.printout(self.emit.emitIFTRUE(labelExit, o.frame)) self.visit(stmt, o) self.emit.printout(self.emit.emitLABEL(labelExit, o.frame))
Editor is loading...
Leave a Comment