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()
def inicio(): if (Lexico.token == Lexico.simbolo.dputok): Scanner.obtoken() bloque(True) else: error(29) return
def condicionExt(): condicion() if((Lexico.token == Lexico.simbolo.andtok) or (Lexico.token == Lexico.simbolo.ortok)): Scanner.obtoken() condicionExt() else: return
def agregarTipoAIdents(tipao, numError): if (Lexico.token == Lexico.simbolo.ident): poner(tipao) Scanner.obtoken() return True else: error(numError) return False
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
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()
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()
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)
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)
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)
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
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)
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;
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
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
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)
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
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
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
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()
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
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