import ast import compiler def process(node): 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 ) ) ast.evaluate( node.body ) ast.outputInBlock( "branch %s" % ( forCondition ) ) ast.outputLabel( afterFor )