def eval_abs(childs: List[ASTNode]): izq = eval_expression(childs[0]) try: return abs(izq) except Exception as e: ne = globales.CError("Error al operar la abs({})".format(izq), childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')
def eval_shift_der(childs: List[ASTNode]): izq = eval_expression(childs[0]) der = eval_expression(childs[1]) try: return izq >> der except Exception as e: ne = globales.CError("Error al operar la suma", childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')
def eval_lte(childs: List[ASTNode]): izq = eval_expression(childs[0]) der = eval_expression(childs[1]) try: return 1 if izq <= der else 0 except Exception as e: ne = globales.CError("Error al operar la LTE", childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')
def eval_div(childs: List[ASTNode]): izq = eval_expression(childs[0]) der = eval_expression(childs[1]) is_number = (isinstance(izq, int) or isinstance( izq, float)) and (isinstance(der, int) or isinstance(der, float)) is_str = isinstance(izq, str) and isinstance(der, str) try: if is_number: resultado = izq / der return resultado else: ne = globales.CError("Error al operar la div", childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos') except: ne = globales.CError("Error al operar la div", childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')
def eval_unaria(childs: List[ASTNode]): izq = childs[0].typee der = eval_expression(childs[1]) try: if izq == '!': return 0 if der else 1 elif izq == '-': return der * -1 elif izq == '~': return ~der except Exception as e: ne = globales.CError("Error al operar la -({})".format(izq), childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')
def cast_value(childs: List[ASTNode]): izq = childs[0].childs[0].childs[0].typee der = eval_expression(childs[0].childs[1]) try: if izq == 'float': return float(der) if izq == 'int': try: intt = int(der) return intt except: intt = ord(der) return intt if izq == 'char': return chr(der) except Exception as e: ne = globales.CError("Error al operar casteo ({}) {}".format(izq, der), childs[0].line, 0, "semantico") globales.lErroresSemanticos.append(ne) console_handler('Error de operandos')