def p_instruccion5_error(p): '''instruccion5 : IDENTIFICADOR instruccion6 error''' global build_errors build_errors.append("Cuidado! Puede faltar ';'") types.push(p[1]) pOper.push(p[1]) if values.size() >= 1: global counter,temp_counter #For compatibility oepration valor = values.pop() tipo = types.pop() #For quadruples operder =pOper.pop() operizq = pOper.pop() operador = pilaO.pop() #Checks semantics respuesta_semantica = operacion_compatible(operador,valor,tipo) #Get logical directions for vm if respuesta_semantica == "": dir_der=obtener_direccion(operder) dir_izq=obtener_direccion(operizq) else: dir_der=obtener_direccion(operder) dir_izq=obtener_direccion(operizq) build_errors.append(respuesta_semantica) #Insert result to stack pOper.push("temp"+str(temp_counter)) cuadruplos[counter] = [operador,dir_izq,dir_der,""] counter+=1
def p_instruccion5_error(p): '''instruccion5 : IDENTIFICADOR instruccion6 error''' global build_errors build_errors.append("Cuidado! Puede faltar ';'") types.push(p[1]) pOper.push(p[1]) if values.size() >= 1: global counter, temp_counter #For compatibility oepration valor = values.pop() tipo = types.pop() #For quadruples operder = pOper.pop() operizq = pOper.pop() operador = pilaO.pop() #Checks semantics respuesta_semantica = operacion_compatible(operador, valor, tipo) #Get logical directions for vm if respuesta_semantica == "": dir_der = obtener_direccion(operder) dir_izq = obtener_direccion(operizq) else: dir_der = obtener_direccion(operder) dir_izq = obtener_direccion(operizq) build_errors.append(respuesta_semantica) #Insert result to stack pOper.push("temp" + str(temp_counter)) cuadruplos[counter] = [operador, dir_izq, dir_der, ""] counter += 1
def p_instruccion5(p): '''instruccion5 : IDENTIFICADOR instruccion6 ENDLINE''' types.push(p[1]) pOper.push(p[1]) if values.size() >= 1: global counter,temp_counter valor = values.pop() tipo = types.pop() operder =pOper.pop() operizq = pOper.pop() operador = pilaO.pop() #Checks semantics respuesta_semantica = operacion_compatible(operador,valor,tipo) global build_errors if respuesta_semantica == "": dir_der=obtener_direccion(operder) dir_izq=obtener_direccion(operizq) else: dir_der=obtener_direccion(operder) dir_izq=obtener_direccion(operizq) build_errors.append(respuesta_semantica) pOper.push("temp"+str(temp_counter)) cuadruplos[counter] = [operador,dir_izq,dir_der,""] counter+=1
def p_instruccion5(p): '''instruccion5 : IDENTIFICADOR instruccion6 ENDLINE''' types.push(p[1]) pOper.push(p[1]) if values.size() >= 1: global counter, temp_counter valor = values.pop() tipo = types.pop() operder = pOper.pop() operizq = pOper.pop() operador = pilaO.pop() #Checks semantics respuesta_semantica = operacion_compatible(operador, valor, tipo) global build_errors if respuesta_semantica == "": dir_der = obtener_direccion(operder) dir_izq = obtener_direccion(operizq) else: dir_der = obtener_direccion(operder) dir_izq = obtener_direccion(operizq) build_errors.append(respuesta_semantica) pOper.push("temp" + str(temp_counter)) cuadruplos[counter] = [operador, dir_izq, dir_der, ""] counter += 1
def p_exp2(p): '''exp2 : RESTA termino | SUMA termino''' pass pilaO.push(p[1]) if pilaO.top() == "+" or pilaO.top() == "-": global counter,temp_counter operador = pilaO.pop() operDer = pOper.pop() operIzq = pOper.pop() #Construction of structure for operations on vm dir_der = obtener_direccion(operDer) dir_izq = obtener_direccion(operIzq) dir_temp = obtener_direccion("temp"+str(temp_counter)) pOper.push("temp"+str(temp_counter)) temp_counter+=1 cuadruplos[counter] = [operador,dir_izq,dir_der,dir_temp] counter+=1
def p_exp2(p): '''exp2 : RESTA termino | SUMA termino''' pass pilaO.push(p[1]) if pilaO.top() == "+" or pilaO.top() == "-": global counter, temp_counter operador = pilaO.pop() operDer = pOper.pop() operIzq = pOper.pop() #Construction of structure for operations on vm dir_der = obtener_direccion(operDer) dir_izq = obtener_direccion(operIzq) dir_temp = obtener_direccion("temp" + str(temp_counter)) pOper.push("temp" + str(temp_counter)) temp_counter += 1 cuadruplos[counter] = [operador, dir_izq, dir_der, dir_temp] counter += 1
def p_termino3(p): '''termino3 : DIVISION varcte | MULTIPLICACION varcte''' pass pilaO.push(p[1]) if (pilaO.top() == "*" or pilaO.top() == "/") and (pOper.size() > 1): global counter,temp_counter #To keep consistency in stacks operador = pilaO.pop() operDer = pOper.pop() operIzq = pOper.pop() #For operations dir_der = obtener_direccion(operDer) dir_izq = obtener_direccion(operIzq) dir_temp = obtener_direccion("temp"+str(temp_counter)) pOper.push("temp"+str(temp_counter)) temp_counter+=1 cuadruplos[counter] = [operador,dir_izq,dir_der,dir_temp] counter+=1
def p_termino3(p): '''termino3 : DIVISION varcte | MULTIPLICACION varcte''' pass pilaO.push(p[1]) if (pilaO.top() == "*" or pilaO.top() == "/") and (pOper.size() > 1): global counter, temp_counter #To keep consistency in stacks operador = pilaO.pop() operDer = pOper.pop() operIzq = pOper.pop() #For operations dir_der = obtener_direccion(operDer) dir_izq = obtener_direccion(operIzq) dir_temp = obtener_direccion("temp" + str(temp_counter)) pOper.push("temp" + str(temp_counter)) temp_counter += 1 cuadruplos[counter] = [operador, dir_izq, dir_der, dir_temp] counter += 1
def p_laberinto(p): '''laberinto : laberinto3 laberinto1 laberinto2 varcte''' pass if values.size() >= 1: global counter,temp_counter valor = values.pop() tipo = types.pop() operation = pilaO.pop() operadorizq=pOper.pop() operador=pOper.pop() global build_errors ##Checks semantics respuesta_semantica = operacion_compatible(operation,tipo,valor) if respuesta_semantica == "": dir_izq = obtener_direccion(operadorizq) dir_der = obtener_direccion(operador) dir_temp = obtener_direccion("temp"+str(temp_counter)) else: build_errors.append(respuesta_semantica) dir_izq = 0 dir_der=0 dir_temp=0 #Creates structure of operators for vm temp_counter+=1 cuadruplos[counter]=[operation,dir_izq,dir_der,dir_temp] counter+=1 #In case of a negative operator if not negative.isEmpty(): dir_temp2 = obtener_direccion("temp"+str(temp_counter)) cuadruplos[counter]=[negative.pop(),dir_temp,"",dir_temp2] temp_counter+=1 dir_temp = dir_temp2 counter+=1 pSaltos.push(counter) #Constructor of logic operator cuadruplos[counter]=["gotof",dir_temp,"",""] counter+=1
def p_laberinto(p): '''laberinto : laberinto3 laberinto1 laberinto2 varcte''' pass if values.size() >= 1: global counter, temp_counter valor = values.pop() tipo = types.pop() operation = pilaO.pop() operadorizq = pOper.pop() operador = pOper.pop() global build_errors ##Checks semantics respuesta_semantica = operacion_compatible(operation, tipo, valor) if respuesta_semantica == "": dir_izq = obtener_direccion(operadorizq) dir_der = obtener_direccion(operador) dir_temp = obtener_direccion("temp" + str(temp_counter)) else: build_errors.append(respuesta_semantica) dir_izq = 0 dir_der = 0 dir_temp = 0 #Creates structure of operators for vm temp_counter += 1 cuadruplos[counter] = [operation, dir_izq, dir_der, dir_temp] counter += 1 #In case of a negative operator if not negative.isEmpty(): dir_temp2 = obtener_direccion("temp" + str(temp_counter)) cuadruplos[counter] = [negative.pop(), dir_temp, "", dir_temp2] temp_counter += 1 dir_temp = dir_temp2 counter += 1 pSaltos.push(counter) #Constructor of logic operator cuadruplos[counter] = ["gotof", dir_temp, "", ""] counter += 1
def p_convierte(p): '''convierte : HACERESCRITA OPENCOND expresion CLOSECOND''' pass pilaO.push(p[1]) if values.size() >= 1: global counter,temp_counter valor = values.pop() values.push("escrita") tipo ="escrita" operizq =pOper.pop() operador = pilaO.pop() respuesta_semantica = operacion_compatible(operador,valor,tipo) global build_errors if respuesta_semantica == "": dir_izq=obtener_direccion(operizq) dir_temp = obtener_direccion("temp"+str(temp_counter)) else: dir_izq=obtener_direccion(operizq) dir_temp = obtener_direccion("temp"+str(temp_counter)) build_errors.append(respuesta_semantica) pOper.push("temp"+str(temp_counter)) temp_counter+=1 cuadruplos[counter] = [operador,dir_izq,"",dir_temp] counter+=1
def p_convierte(p): '''convierte : HACERESCRITA OPENCOND expresion CLOSECOND''' pass pilaO.push(p[1]) if values.size() >= 1: global counter, temp_counter valor = values.pop() values.push("escrita") tipo = "escrita" operizq = pOper.pop() operador = pilaO.pop() respuesta_semantica = operacion_compatible(operador, valor, tipo) global build_errors if respuesta_semantica == "": dir_izq = obtener_direccion(operizq) dir_temp = obtener_direccion("temp" + str(temp_counter)) else: dir_izq = obtener_direccion(operizq) dir_temp = obtener_direccion("temp" + str(temp_counter)) build_errors.append(respuesta_semantica) pOper.push("temp" + str(temp_counter)) temp_counter += 1 cuadruplos[counter] = [operador, dir_izq, "", dir_temp] counter += 1