def whileLoop(condition, code): labels, jumps = addJumpPoints(1) return "" + labels[0] + \ condition[0] + \ code + \ "JUMP " + jumps[0] + "\n" + \ condition[1] + ""
def greater(value1, value2, lineno): to, jump = addJumpPoints(1) return loadVar(value2, "b", lineno) + \ loadVar(value1, "c", lineno) + \ "RESET d\n" + \ "ADD d c\n" + \ "SUB d b\n" + \ "JZERO d " + jump[0] + "\n" + \ "", to[0]
def greaterOrEqual(value1, value2, lineno): to, jump = addJumpPoints(2) return loadVar(value1, "b", lineno) + \ loadVar(value2, "c", lineno) + \ "RESET d\n" + \ "ADD d c\n" + \ "SUB d b\n" + \ "JZERO d " + jump[0] + "\n" + \ "JUMP " + jump[1] + "\n" + \ to[0], to[1]
def p_command_if_else(p): '''command : IF condition THEN commands ELSE commands ENDIF''' condition, ifCommand, elseCommand, lineno = p[2], p[4], p[6], p.lineno(1) labels, jumps = addJumpPoints(1) p[0] = condition[0] + \ ifCommand + \ "JUMP " + jumps[0] + "\n" + \ condition[1] + \ elseCommand + \ "" + labels[0]
def forDecLoop(iterator, begin, end, code, lineno): to, jump = addJumpPoints(3) temp = compiler.addVariableTempo() valTemp = ("id", temp) it = ("id", iterator) return loadVar(end, "e", lineno) + \ varAddress(valTemp, lineno) + \ "STORE e a\n" + \ loadVar(begin, "f", lineno) + \ varAddress(it, lineno) + \ "STORE f a\n" + to[2] +\ loadVar(valTemp, "e", lineno) + \ loadVar(it, "f", lineno) + \ "SUB e f\n" + \ "JZERO e " + jump[0] + "\n" + \ "JUMP " + jump[1] + "\n" + \ to[0] + code + \ loadVar(it, "f", lineno) + \ varAddress(it, lineno) + \ "JZERO f " + jump[1] + "\n" + \ "DEC f\n" + \ "STORE f a\n" + \ "JUMP " + jump[2] + "\n" + to[1]
def p_condition_repeat_greatereq(p): '''command : REPEAT commands UNTIL value GREATEREQ value SEMICOLON''' code, value1, value2, lineno = p[2], p[4], p[6], str(p.lineno(1)) condition = less(value1, value2, lineno) labels, jumps = addJumpPoints(1) p[0] = "" + labels[0] + code + condition[0] + "JUMP " + jumps[0] + "\n" + condition[1]
def p_condition_repeat_nequal(p): '''command : REPEAT commands UNTIL value NEQUALS value SEMICOLON''' code, value1, value2, lineno = p[2], p[4], p[6], str(p.lineno(1)) condition = equal(value1, value2, lineno) labels, jumps = addJumpPoints(1) p[0] = "" + labels[0] + code + condition[0] + "JUMP " + jumps[0] + "\n" + condition[1]