def callStat(callId): global token global a global param global counter global temp if counter == 0: a = intermediate.newTemp() param.append(a) counter += 1 if token[0] == "Id": functionItem, _ = symbolTable.findEntity(token[1]) procedureName = token[1] token = lexi.lex() actualPars(procedureName, functionItem) if token[0] == "rightparenthesisTk" or token[0]== "commaTk": intermediate.genQuad("par", temp, "RET", "_") intermediate.genQuad("call", callId, "_", "_") else: for i in range(1,len(param)): intermediate.genQuad("par",param[i],"in","_") intermediate.genQuad("par",param[0],"RET","_") intermediate.genQuad("call", callId, "_", "_") counter = 0 param = [] else: line = lexi.getLineAndColumn() print("Syntax error: 'function' name is missing at line " + str(line[0]+1)+".") exit()
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 term(): global token f1 = factor() #first term of factor while token[0] == "mulOperTk": tokenOper = token[1] #operator (* or /) mulOper() #moves lex to next token f2 = factor() #second term of factor w = intermediate.newTemp() # new variable intermediate.quads.append([tokenOper, f1, f2, w]) f1 = w #the total sum to this point return f1
def expression(): global token optionalSign() t1 = term() #first term of expression while token[0] == "addOperTk": tokenOper = token[1] #operator (+ or -) addOper() t2 = term() #second term of expression w = intermediate.newTemp() intermediate.genQuad(tokenOper,t1,t2,w) t1 = w return t1
def idTail(identifier): global var global token global funcList functionItem, _ = symbolTable.findEntity(identifier) a = actualPars(identifier, functionItem) if identifier in funcList: current_Temp = intermediate.newTemp() intermediate.genQuad("par",current_Temp,"RET","_") intermediate.genQuad("call",identifier,"_","_") intermediate.genQuad(":=",current_Temp,"_",var) return a
def actualParitem(functionItem, argumentId): global token global param global counter global temp if token[0] == "in": if functionItem.argumentList[argumentId].isIn == False: print("Expected 'inout' but found 'in'") exit() token = lexi.lex() actualParId = token[1] exp = expression() intermediate.genQuad("par", exp, "CV", "_") return elif token[0] == "inout": if functionItem.argumentList[argumentId].isIn == True: print("Expected 'in' but found 'inout'") exit() token = lexi.lex() if token[0] == "Id": checkUndeclaredIdentifier() actualParId = token[1] intermediate.genQuad("par", actualParId, "REF", "_") token = lexi.lex() return else: line = lexi.getLineAndColumn() print("Syntax error: 'Parameter' is missing at line " + str(line[0]+1)+".") exit() elif token[0] == "call": temp = intermediate.newTemp() param.append(temp) counter += 1 token = lexi.lex() callId = token[1] callStat(callId) else: line = lexi.getLineAndColumn() print("Syntax error: 'in' or 'inout' is missing at line " + str(line[0] + 1) +".") exit()