import ast def process(node): pass def processComprehension( node, dest, expr ): #ast.diag( node ) #ast.diag( node.assign ) #ast.diag( node.list ) #ast.diag( node.ifs ) forCondition = ast.nextLabel() afterFor = ast.nextLabel() iterator = ast.nextPRegister() list = ast.nextPRegister() iteratorVariable = ast.nextPRegister() ast.outputInBlock(".include \"iterator.pasm\"") ast.outputInBlock("%s = %s" % ( list, ast.evaluate( node.list ) ) ) ast.outputInBlock("new %s, .Iterator, %s" % ( iterator, list ) ) ast.outputInBlock("set %s, .ITERATE_FROM_START" % ( iterator ) ) ast.outputLabel( forCondition ) ast.outputInBlock( "unless %s, %s" % ( iterator, afterFor ) ) ast.outputInBlock("shift %s, %s" % ( iteratorVariable, iterator ) ) ast.outputInBlock("%s = %s" % ( ast.evaluate( node.assign ), iteratorVariable ) ) #body #ast.evaluate( node.body ) if len( node.ifs ): for x in node.ifs: ast.ListCompIf.processComprehension( x, dest, expr) else: ast.outputInBlock( "%s.append( %s, %s )" % ( dest, dest, ast.evaluate( expr ) ) ) ast.outputInBlock( "branch %s" % ( forCondition ) ) ast.outputLabel( afterFor )