def llamado_proc_valido(linea):
    cortado = re.split("\((.*)\)", linea)
    if cortado and len(cortado) > 1:
        if re.search("\(|\)", cortado[1]):
            sintax_error("Se realizo llamado de funcion dentro de llamado de funcion")
        return True
    return False
def param_funcion(linea):
    param = re.split("PARAM", linea)
    if len(param) > 1:
        if Proc.PROC:
            return "params[" + param[1] + "]"
        else:
            sintax_error("Uso de la palabra reservada PARAM fuera de una funcion")
    return
def revisar_proc_fin(linea, proc):
    if not proc and re.search("\^\$", linea):
        sintax_error("Cierre de funcion sin entrar en ella")
    if re.search("\^\$", linea):
        return False
    if proc:
        return proc
    return False
def revisar_return(linea):
    formato_return = re.search("^\s*#", linea)
    if formato_return:
        if not Proc.PROC:
            sintax_error("Return fuera de una funcion")
        sin_espacios = " ".join(re.split("#|\s+", linea)[1:])
        retorno = nombre_valor_valido(sin_espacios)
        if retorno:
            return "return " + retorno
    return ""
def revisar_proc_inicio(linea, proc):
    nombre = re.sub("\)", "", linea)
    nombre = re.split("\$\^PROC\s*\(", nombre)
    if proc and re.search("\$\^PROC", linea):
        sintax_error("Funcion dentro de funcion")
    if proc:
        return proc, None
    if re.search("\$\^PROC\s*\(", linea):
        return True, nombre[1]
    return False, None
def nombre_valor_valido(linea):
    if linea_vacia(linea):
        sintax_error("No hay valor para asignar a la variable")
    elif re.search("^PARAM[0-9]+$", linea):
        return "params[" + re.split("PARAM", linea)[1] + "]"
    elif revisarifelse(linea):
        return formatearifelse(linea)
    elif llamado_proc_valido(linea):
        return formatear_llamado_proc(linea)
    elif len(re.split("^TRUE$", linea)) == 2:
        return "True"
    elif len(re.split("^FALSE$", linea)) == 2:
        return "False"
    elif len(re.split("[[\-0-9]*|[0-9]*]", linea)) == 2:
        return eliminar_espacios(linea)
    elif not nombre_variable_valido(linea):
        return eliminar_espacios(linea)
    else:
        sintax_error("Asignacion de variable invalida")
    return
def generar_valor_variable(asignacion_izq, asignacion_der):
    if len(asignacion_izq) > 1:
        variable = re.split("VAR\(\s*(.*)\)", asignacion_izq[0])
        if len(variable) == 1:
            sintax_error("Asignacion de una variable sin el uso de VAR")
        variable = variable[1]
        valor = asignacion_izq[1]
    elif len(asignacion_der) > 1:
        variable = re.split("VAR\(\s*(.*)\)", asignacion_der[1])
        if len(variable) == 1:
            sintax_error("Asignacion de una variable sin el uso de VAR")
        variable = variable[1]
        valor = asignacion_der[0]
    else:
        sintax_error("Expresion invalida")
        return
    return variable, valor
def nombre_variable_valido(linea):
    if len(borrar_nulos(re.split("\s*", linea))) != 1:
        if len(re.split("[^a-zA-Z]*", linea)) != 1:
            sintax_error("Uso de caracteres no permitidos para una variable")
    return
def creacion_variable_valido(linea):
    if re.search("^PARAM[0-9]+$", linea):
        sintax_error("Uso de nombre reservado para creacion de variable")
    return