Пример #1
0
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()
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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()