def forcaseStat(): global token flag = intermediate.newTemp() forQuad = intermediate.nextQuad() intermediate.genQuad(":=", "0", "_", flag) while token[0] != "endforcase": if token[0] == "when": token = lexi.lex() (bTrue, bFalse) = condition() intermediate.backPatch(bTrue, intermediate.nextQuad()) if token[0] == "upDownTk": token = lexi.lex() statements() genQuad(":=", "1", "_", flag) intermediate.backPatch(bFalse, intermediate.nextQuad()) else: line = lexi.getLineAndColumn() print("Syntax error: expected ':' at line " + str(line[0]+1)+".") exit() else: line = lexi.getLineAndColumn() print("Syntax error: expected 'when' at line " + str(line[0]+1)+".") exit() intermediate.genQuad("=", flag, "1", forQuad) token = lexi.lex() return
def boolterm(): global token (r1True, r1False) = boolfactor() qTrue = r1True qFalse = r1False while token[0] == "and": token = lexi.lex() intermediate.backPatch(qTrue, nextQuad()) (r2True, r2False) = boolfactor() qFalse = intermediate.merge(qFalse, r2False) qTrue = r2True return (qTrue, qFalse)
def condition(): global token (q1True, q1False) = boolterm() bTrue = q1True bFalse = q1False while token[0] == "or": token = lexi.lex() intermediate.backPatch(bFalse, intermediate.nextQuad()) (q2True, q2False) = boolterm() bTrue = intermediate.merge(bTrue, q2True) bFalse = q2False return (bTrue, bFalse)
def whileStat(): global token q = intermediate.nextQuad() (bTrue, bFalse) = condition() intermediate.backPatch(bTrue, intermediate.nextQuad()) statements() intermediate.genQuad("jump","_","_", q) intermediate.backPatch(bFalse,nextQuad()) if token[0] == "endwhile": token = lexi.lex() return else: print("Syntax error: 'endwhile' statement is missing. " ) exit()
def switchStat(): global token exitList = intermediate.emptyList() e1 = expression() while token[0] != "endswitch": if token[0] == "case": token = lexi.lex() e2 = expression() if token[0] == "upDownTk": bTrue = intermediate.makeList(intermediate.nextQuad()) #references ["=", e1, e2, "_"] intermediate.genQuad("=", e1, e2, "_") bFalse = intermediate.makeList(intermediate.nextQuad()) #references ["jump", "_", "_", "_"] intermediate.genQuad("jump", "_", "_", "_") intermediate.backPatch(bTrue, intermediate.nextQuad()) # ["=", e1, e2, tells where to go] token = lexi.lex() statements() tList = intermediate.makeList(intermediate.nextQuad()) intermediate.genQuad("jump", "_", "_", "_") exitList = intermediate.merge(exitList, tList) intermediate.backPatch(bFalse, intermediate.nextQuad()) else: line = getLineAndColumn() print("Syntax error: expected ':' at line " + str(line[0]+1)+".") exit() else: line = lexi.getLineAndColumn() print("Syntax error: 'endswitch' or 'case' statement is missing .") exit() intermediate.backPatch(exitList, intermediate.nextQuad()) token = lexi.lex() return
def ifStat(): global token (bTrue, bFalse) = condition() if token[0] == "then": intermediate.backPatch(bTrue, intermediate.nextQuad()) token = lexi.lex() statements() ifList = intermediate.makeList(intermediate.nextQuad()) intermediate.genQuad("jump","_","_","_") intermediate.backPatch(bFalse, intermediate.nextQuad()) elsepart() intermediate.backPatch(ifList, intermediate.nextQuad()) if token[0] == "endif": token = lexi.lex() return else: print("Syntax error: 'endif' statement is missing.") exit() else: line = lexi.getLineAndColumn() print("Syntax error: 'then' statement is missing at line " + str(line[0]+1)+".") exit()