Beispiel #1
0
def condicion():
    expresion()
    if((Lexico.token != Lexico.simbolo.igl) and (Lexico.token != Lexico.simbolo.nig) and (Lexico.token != Lexico.simbolo.mnr) and (Lexico.token != Lexico.simbolo.mei) and (Lexico.token != Lexico.simbolo.myr) and (Lexico.token != Lexico.simbolo.mai)):
        error(20) #error 20: Se esperaba un operador relacional
    else:
        Scanner.obtoken()
        expresion()
Beispiel #2
0
def inicio():
    if (Lexico.token == Lexico.simbolo.dputok):
        Scanner.obtoken()
        bloque(True)
    else:
        error(29)
        return
Beispiel #3
0
def condicionExt():
    condicion()
    if((Lexico.token == Lexico.simbolo.andtok) or (Lexico.token == Lexico.simbolo.ortok)):
        Scanner.obtoken()
        condicionExt()
    else:
        return
Beispiel #4
0
def agregarTipoAIdents(tipao, numError):
    if (Lexico.token == Lexico.simbolo.ident):
        poner(tipao)
        Scanner.obtoken()
        return True
    else:
        error(numError)
        return False
Beispiel #5
0
def main(argv):
    global fp
    if argv == None:
        print(
            "\nNo se ha proporcionado el nombre del programa fuente (uso: parser1 progfuente)"
        )

    else:
        fp = open(argv, "r")
        if fp == None:
            print("\nNo se encontro el programa fuente indicado")
        else:
            timer = datetime.datetime.today()

            #print("\n\nCompilador de cpiton version 69.0/parser1 --- Octubre de 2019 --- \n")
            #print(timer)
            #print("\nLexema                  Token\n")

            from auxiliares import inicializar_espec
            #print(auxiliares.hola)

            inicializar_espec()

            scanner.consolef.write(
                "\n\nCompilador de cpiton version 69.0/parser1 --- Octubre de 2019 --- \n"
            )
            scanner.consolef.write(timer.strftime('%d/%m/%Y'))
            scanner.consolef.write("\nLexema                  Token\n")

            scanner.ch = ' '
            scanner.fin_de_archivo = 0
            scanner.offset = -1
            scanner.ll = 0
            No_de_errores = 0

            #inicializacion de conjuntos de estabilizacion (en conjuntos.py)
            inicializar_conjuntos()

            scanner.obtoken()

            tds.it = 0
            #global token
            #token = scanner.obtoken()
            #while(token != lexico.simbolo.mdputok):
            #    token = scanner.obtoken()
            #
            parseador.inicio()

            from auxiliares import error
            if lexico.token != lexico.simbolo.mdputok:
                error(32)

            from auxiliares import estadisticas
            estadisticas()
            scanner.consolef.close()
            fp.close()

    return 0
Beispiel #6
0
def expresion():
    if(Lexico.token == Lexico.simbolo.mas or Lexico.token == Lexico.simbolo.menos):
        Scanner.obtoken()
        termino()
    else:
        termino()
    while(Lexico.token == Lexico.simbolo.mas or Lexico.token == Lexico.simbolo.menos):
        Scanner.obtoken()
        termino()
Beispiel #7
0
def termino():
    #Apesar de que el ident tambien entra en valor lo verifico aparte pues me tengo que asegurar que este
    #declarado a la hora de utilizarlo en operaciones    
    if(not verificarIdent()):
        #Si trae false es que el token no es Ident
        #Si el token no existe tira error y muere el programa
        valor()   
    while(Lexico.token == Lexico.simbolo.por or Lexico.token == Lexico.simbolo.barra):
        Scanner.obtoken()
        if(not verificarIdent()):
            valor()
Beispiel #8
0
def cuerpoLlavesInstruccion():
    if(Lexico.token == Lexico.simbolo.llaveatok):
        Scanner.obtoken()
        instruccion()
        if(Lexico.token == Lexico.simbolo.llavectok):
            Scanner.obtoken()
            return True
        else:
            error(27)
    else:
        error(26)
Beispiel #9
0
def InstruccionMientras():
    if (Lexico.token == Lexico.simbolo.parena):
        Scanner.obtoken()
        condicionExt()
        if (Lexico.token == Lexico.simbolo.parenc):
            Scanner.obtoken()
            cuerpoLlavesInstruccion()
        else:
            error(21)
    else:
        error(22)
Beispiel #10
0
def cuerposiosi():
    if(Lexico.token == Lexico.simbolo.parena):
        Scanner.obtoken()
        condicionExt()
        if(Lexico.token == Lexico.simbolo.parenc):
            Scanner.obtoken()
            val = cuerpoLlavesInstruccion()
            return val
        else:
            error(21)
    else:
        error(22)
Beispiel #11
0
def verificarIdent():    
    if(Lexico.token == Lexico.simbolo.ident):
        i = posicion(Scanner.lex)
        if(i == -1):
            error(10)
        else:
            if(tabla[i].tipo == objeto.FUNCION):
                error(20)
            else:
                Scanner.obtoken()
                return True
    else:        
        return False
Beispiel #12
0
def VerificarIdentsExistAndTypes(tipao):
    if(Lexico.token != Lexico.simbolo.ident):
            error(14)
    else:
        i = posicion(Scanner.lex)
        if(i == -1):
            error(10)
        else:
            if(tabla[i].tipo == tipao):
                Scanner.obtoken()
                return True
            else:
                error(6)
Beispiel #13
0
def VerificarIdentExist(checkInTDS,tipao):    
    if(Lexico.token != Lexico.simbolo.ident):
            return
    else:
        if(checkInTDS):
            i = posicion(Scanner.lex)
            if(i == -1):
                error(10)
            else:
                Scanner.obtoken()
                return True
        else:
            agregarTipoAIdents(tipao,16)
            return True;
Beispiel #14
0
def valor():
    global lextoken
    if (Lexico.token == Lexico.simbolo.parena):
        Scanner.obtoken()
        expresion()
        if (Lexico.token != Lexico.simbolo.parenc):
            error(21)
            return
    elif (Lexico.token == Lexico.simbolo.llaveatok):
        Scanner.obtoken()
        valor()
        while (Lexico.token == Lexico.simbolo.coma):
            Scanner.obtoken()
            valor()
        if (Lexico.token != Lexico.simbolo.llavectok):
            error(27)
            return
    else:
        if (Lexico.token != Lexico.simbolo.numero
                and Lexico.token != Lexico.simbolo.truetok
                and Lexico.token != Lexico.simbolo.ident
                and Lexico.token != Lexico.simbolo.falsetok
                and Lexico.token != Lexico.simbolo.decimal
                and Lexico.token != Lexico.simbolo.caracter
                and Lexico.token != Lexico.simbolo.texto):
            expresion()
    Scanner.obtoken()
    return
Beispiel #15
0
def verificarIdent():
    if (Lexico.token == Lexico.simbolo.ident):
        i = posicion(Scanner.lex)
        if (i == -1):
            error_iden(10, Scanner.lex)
            return 2  #error que no existe identificador
        else:
            if (tabla[i].tipo == objeto.FUNCION):
                error(20)
                return 2  #error que el identificador es una funcion
            else:
                Scanner.obtoken()
                return 1  #Success
    else:
        return 0  #No es un identificador
Beispiel #16
0
def VerificarIdentExist(checkInTDS, tipao):
    if (Lexico.token != Lexico.simbolo.ident):
        return
    else:
        if (checkInTDS):
            i = posicion(Scanner.lex)
            if (i == -1):
                #Para no leer el mismo token infinitamente
                Scanner.obtoken()
                error(10)
                return False
            else:
                Scanner.obtoken()
                return True
        else:
            return agregarTipoAIdents(tipao, 16)
Beispiel #17
0
def termino():
    #Apesar de que el ident tambien entra en valor lo verifico aparte pues me tengo que asegurar que este
    #declarado a la hora de utilizarlo en operaciones
    verif = verificarIdent()
    if (verif == 0):
        #Si trae 0 es que el token no es Ident
        if (Lexico.token == Lexico.simbolo.numero
                or Lexico.token == Lexico.simbolo.decimal):
            #Meterlo a la pila?
            Scanner.obtoken()
        else:
            error(47)  #se esperaba un numero o un decimal
            return
        #valor() este tenia antes
    elif (verif == 2):
        return
    while (Lexico.token == Lexico.simbolo.por
           or Lexico.token == Lexico.simbolo.barra):
        Scanner.obtoken()
        verif = verificarIdent()
        if (verif == 0):
            #Si trae 0 es que el token no es Ident
            if (Lexico.token == Lexico.simbolo.numero
                    or Lexico.token == Lexico.simbolo.decimal):
                #Meterlo a la pila?
                Scanner.obtoken()
            else:
                error(47)  #se esperaba un numero o un decimal
                return
        elif (verif == 2):
            #Si trae 2 es error por esto se retorna
            return
Beispiel #18
0
def declaracionvariable():
    tipao = tipo()
    if (tipao is None):
        return
    Scanner.obtoken()
    #si da error retorna false
    if (not agregarTipoAIdents(tipao, 16)):
        return
    if (Lexico.token == Lexico.simbolo.corchab):
        Scanner.obtoken()
        if (Lexico.token == Lexico.simbolo.numero):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.corchcr):
                Scanner.obtoken()
            else:
                error(45)
                return
        else:
            error(1)
            return
    while (Lexico.token == Lexico.simbolo.coma):
        Scanner.obtoken()
        if (not agregarTipoAIdents(tipao, 4)):
            return
    if (Lexico.token == Lexico.simbolo.puntoycoma):
        Scanner.obtoken()
    else:
        asignacion(False, tipao)
    #bloque()
    return
Beispiel #19
0
def llamarFunciones():
    if (Lexico.token.value >= 300 and Lexico.token.value <= 315):
        if (Lexico.token == Lexico.simbolo.elev
                or Lexico.token == Lexico.simbolo.modulo):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.parena):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.numero
                        or Lexico.token == Lexico.simbolo.ident):
                    Scanner.obtoken()
                    if (Lexico.token == Lexico.simbolo.coma):
                        Scanner.obtoken()
                        if (Lexico.token == Lexico.simbolo.numero
                                or Lexico.token == Lexico.simbolo.ident):
                            Scanner.obtoken()
                            if (Lexico.token == Lexico.simbolo.parenc):
                                Scanner.obtoken()
                            else:
                                error(21)
                        else:
                            error(41)
                    else:
                        error(42)
                else:
                    error(41)
            else:
                error(22)
        elif (Lexico.token == Lexico.simbolo.raizc
              or Lexico.token == Lexico.simbolo.abs
              or Lexico.token == Lexico.simbolo.aproxar
              or Lexico.token == Lexico.simbolo.log
              or Lexico.token == Lexico.simbolo.cptexto
              or Lexico.token == Lexico.simbolo.tamtxt
              or Lexico.token == Lexico.simbolo.aproxab
              or Lexico.token == Lexico.simbolo.imp
              or Lexico.token == Lexico.simbolo.cArch
              or Lexico.token == Lexico.simbolo.escArch):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.parena):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.ident):
                    Scanner.obtoken()
                    if (Lexico.token == Lexico.simbolo.parenc):
                        Scanner.obtoken()
                    else:
                        error(21)
                else:
                    error(16)
            else:
                error(22)
        elif (Lexico.token == Lexico.simbolo.euxp):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.parena):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.ident
                        or Lexico.token == Lexico.simbolo.numero):
                    Scanner.obtoken()
                    if (Lexico.token == Lexico.simbolo.parenc):
                        Scanner.obtoken()
                    else:
                        error(21)
                else:
                    error(41)
            else:
                error(22)
        elif (Lexico.token == Lexico.simbolo.leerstd
              or Lexico.token == Lexico.simbolo.leerArch):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.parena):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.ident):
                    Scanner.obtoken()
                    if (Lexico.token == Lexico.simbolo.coma):
                        Scanner.obtoken()
                        if (Lexico.token == Lexico.simbolo.ident):
                            Scanner.obtoken()
                            if (Lexico.token == Lexico.simbolo.parenc):
                                Scanner.obtoken()
                            else:
                                error(21)
                        else:
                            error(16)
                    else:
                        error(42)
                else:
                    error(16)
            else:
                error(22)
        elif (Lexico.token == Lexico.simbolo.abArch):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.parena):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.ident
                        or Lexico.token == Lexico.simbolo.texto):
                    Scanner.obtoken()
                    if (Lexico.token == Lexico.simbolo.coma):
                        Scanner.obtoken()
                        if (Lexico.token == Lexico.simbolo.texto):
                            Scanner.obtoken()
                            if (Lexico.token == Lexico.simbolo.parenc):
                                Scanner.obtoken()
                            else:
                                error(21)
                        else:
                            error(43)
                    else:
                        error(42)
                else:
                    error(44)
            else:
                error(22)
        if (Lexico.token == Lexico.simbolo.puntoycoma):
            Scanner.obtoken()
        else:
            error(9)
    else:
        return
Beispiel #20
0
def instruccion():

    seguir = False
    #COMO ES RECURSIVA ESTOS SON SUN FINALES
    if (Lexico.token == Lexico.simbolo.llavectok
            or Lexico.token == Lexico.simbolo.mdputok):
        return

    #VERIFICANDO SI ES SITOK
    if (Lexico.token == Lexico.simbolo.sitok):
        Scanner.obtoken()
        cuerpoestabien = cuerposiosi()
        while (cuerpoestabien):
            if (Lexico.token == Lexico.simbolo.ositok):
                cuerpoestabien = cuerposiosi()
            else:
                break
        if (Lexico.token == Lexico.simbolo.sinotok):
            Scanner.obtoken()
            cuerpoLlavesInstruccion()
    else:  #Verificando si es PARATOK
        if (Lexico.token == Lexico.simbolo.paratok):
            Scanner.obtoken()
            #verificar ident y que sea tipo num
            seguir = VerificarIdentsExistAndTypes(objeto.NUM)
            if (seguir and Lexico.token == Lexico.simbolo.rangotok):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.parena):
                    Scanner.obtoken()
                    seguir = VerificarIdentsExistAndTypes(objeto.NUM)
                    if (seguir and Lexico.token == Lexico.simbolo.coma):
                        Scanner.obtoken()
                        seguir = VerificarIdentsExistAndTypes(objeto.NUM)
                        if (seguir and Lexico.token == Lexico.simbolo.coma):
                            Scanner.obtoken()
                            asignacion(True, None)
                            if (Lexico.token == Lexico.simbolo.parenc):
                                Scanner.obtoken()
                                cuerpoLlavesInstruccion()
                            else:
                                error(21)
                                return
                        else:
                            error(4)
                            return
                    else:
                        error(4)
                        return
                else:
                    error(22)
                    return
            else:
                error(5)
                return
        else:  #Verificando si es MIENSTRASTOK
            if (Lexico.token == Lexico.simbolo.mientrastok):
                Scanner.obtoken()
                InstruccionMientras()
            else:  #Verificando si es HASTOK
                if (Lexico.token == Lexico.simbolo.hastok):
                    Scanner.obtoken()
                    seguir = cuerpoLcuerpoLlavesInstruccion()
                    if (seguir and Lexico.token == Lexico.simbolo.mientrastok):
                        Scanner.obtoken()
                        InstruccionMientras()
                    else:
                        error(3)
                else:
                    asignacion(True, None)
                    declaracionvariable()
                    llamarFunciones()
                    instruccion()
Beispiel #21
0
def asignacion(checkIdent, tipao):
    fin = -1
    seguir = VerificarIdentExist(checkIdent, tipao)
    seguir = True if seguir is None else seguir
    #Se va por el camino de una asignacion a variable
    if (seguir and Lexico.token == Lexico.simbolo.asignacion):
        Scanner.obtoken()
        valor()
        if (Lexico.token == Lexico.simbolo.coma):
            Scanner.obtoken()
            #Si checkident es False significa que viene declaracion variable
            #Por tanto le debo de pasar el tipo de dato para instancearlo.
            fin = asignacion(checkIdent, tipao)
        #Lo valido antes pues la ultima ejecucion ya habra leido el punto y coma
        #por ende cuando la recursion regrese solo tendre que salir del bucle
        if (fin == 0):
            return 0
        if (Lexico.token == Lexico.simbolo.puntoycoma):
            Scanner.obtoken()
            return 0
        else:
            error(4)
            return
    #Se va por el camino del arreglo
    elif (checkIdent and Lexico.token == Lexico.simbolo.corchab):
        Scanner.obtoken()
        if (Lexico.token == Lexico.simbolo.numero):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.corchcr):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.asignacion):
                    Scanner.obtoken()
                    valor()
                    if (Lexico.token == Lexico.simbolo.coma):
                        #Aqui leo el numero
                        Scanner.obtoken()
                        #Aqui leo la siguiente coma
                        Scanner.obtoken()
                        while (Lexico.token == Lexico.simbolo.coma):
                            Scanner.obtoken()
                            Scanner.obtoken()
                        #fin = asignacion(checkIdent,tipao)
                    if (Lexico.token == Lexico.simbolo.puntoycoma):
                        Scanner.obtoken()
                else:
                    error(15)
            else:
                error(45)
        else:
            error(1)
    else:
        return
Beispiel #22
0
def delaracionfuncion(PermiteFunciones):
    if (PermiteFunciones):
        if (Lexico.token == Lexico.simbolo.funtok):
            Scanner.obtoken()
            if (Lexico.token == Lexico.simbolo.ident):
                Scanner.obtoken()
                if (Lexico.token == Lexico.simbolo.parena):
                    Scanner.obtoken()
                    parametros()
                    if (Lexico.token == Lexico.simbolo.parenc):
                        Scanner.obtoken()
                        if (Lexico.token == Lexico.simbolo.retortok):
                            Scanner.obtoken()
                            tipao = tipo()
                            if (Lexico.token == Lexico.simbolo.llaveatok):
                                bloque(False)
                                #Scanner.obtoken()
                                if (Lexico.token == Lexico.simbolo.rettok):
                                    Scanner.obtoken()
                                    if (Lexico.token == Lexico.simbolo.ident):
                                        #Verificar que sea del tipo
                                        Scanner.obtoken()
                                        if (Lexico.token ==
                                                Lexico.simbolo.puntoycoma):
                                            Scanner.obtoken()
                                            if (Lexico.token ==
                                                    Lexico.simbolo.llavectok):
                                                Scanner.obtoken
                                                return
                                            else:
                                                error(27)
                                        else:
                                            error(9)
                                    else:
                                        error(40)
                                else:
                                    error(39)
                            else:
                                error(26)
                        else:
                            error(17)
                    else:
                        error(21)
                else:
                    error(22)
            else:
                error(16)
    else:
        error(48)
    return