|
51
|
Foros Generales / Dudas Generales / gramaticas LL
|
en: 17 Julio 2014, 03:25 am
|
Saludos
Tengo la siguiente gramatica de tipo LL(o sea que no tiene recursiones por la izquierda) y a esta gramatica que esta compuesta por elementos Terminales y No Terminales, le tengo que calcular el conjunto de elementos Primero() y Siguiente().
Se define Primero(X) es el conjunto de simbolos terminales que pueden aparecer al principio de las cadenas derivadas X.
Se define Siguiente(X), para el no terminal X como el conjunto de simbolos terminales que pueden aparecer inmediatamente a la derecha de X en alguna forma sentencial. Si tenemos por ejemplo Siguiente(E) y E esta al final de alguna forma de sentencia como en el ejemplo. Siguiente de E va a ser Siguiente(B), o sea cdaf$g por que E se deriva de B (B->bcdE).
Primero Siguiente A->BCc|gDB gbcda $f B->bCDE|$ b$ cdaf$g C->ca|DaB cda cdg D->dD|$ d$ bgca$f E->gAf|c gc cdaf$g
y tengo la duda en Siguiente(D) existe una B despues de la D en la letra A, y esa me daria el no terminal b, despues en la regla B hay una E despues de D lo que me daria los no terminales g y c. En la regla C tengo el simbolo no terminal a despues de la D, lo que me daria:
b,g,c,a pero no se de donde sale la f??? si alguien me pudiera decir por que de esto se lo agradeceria mucho
|
|
|
52
|
Programación / Java / analizador sintactico
|
en: 9 Julio 2014, 04:52 am
|
Saludos Tengo el siguiente codigo que es un analizador lexicografico al cual le pido al usuario que le ingrese un token, para despues imprimir si se trata de un identificador, palabra reservada, etc.. El codigo funciona bien, el problema es que ahora tengo que hacer el analizador sintactico para lo cual he estado investigando en varios sitios, pero no se si debo hacer un automata de pila o un arbol sintactico, no se bien cual seria el siguiente paso a seguir import java.util.Scanner; class AnalizadorLexico { Estados estadoActual; private enum Estados { q00, q01, q02, q03, q04, q05, q06, q07, q08, q09, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22 } private boolean palabraReservada(String token) { int i; String reservadas[] = {"abstract","assert","boolean","break","byte","case","catch","char","class","const", "continue","default","do","double","else","enum","extends","final","finally","float","for","goto","if", "implements","import","instanceof","int","interface","long","native","new","package","private","protected", "public","return","short","static","super","switch","new","package","private","protected","synchronized","this", "throw","throws","transient","try","void","volatile","while"}; for(i = 0;i < reservadas.length;i++) { if(reservadas[i].equals(token)) return true; } return false; } private boolean esIdentificador(String token) { int estadoSiguiente; char arregloToken[] = token.toCharArray(); estadoActual = Estados.q00; for(int i = 0;i < arregloToken.length;i++){ if(esLetra(arregloToken[i])) estadoSiguiente = 0; else if(esDigito(arregloToken[i])) estadoSiguiente = 1; else estadoSiguiente = 2; estadoActual = matrizTransicion(estadoActual,estadoSiguiente); } if(estadoActual.equals(Estados.q01)) return true; else return false; } private boolean esDecimalEntero(String token){ int estadoSiguiente; char arregloToken[] = token.toCharArray(); estadoActual = Estados.q00; for(int i = 0;i < arregloToken.length;i++){ if(esDigito(arregloToken[i])) estadoSiguiente = 0; else estadoSiguiente = 1; estadoActual = matrizTransicion2(estadoActual,estadoSiguiente); } if(estadoActual.equals(Estados.q01)) return true; else return false; } private boolean esDecimalReal(String token){ int estadoSiguiente; char arregloToken[] = token.toCharArray(); estadoActual = Estados.q00; for(int i = 0;i < arregloToken.length;i++){ if(esDigito(arregloToken[i])) estadoSiguiente = 0; else if(arregloToken[i] == '.') estadoSiguiente = 1; else estadoSiguiente = 2; estadoActual = matrizTransicion3(estadoActual,estadoSiguiente); } if(estadoActual.equals(Estados.q03)) return true; else return false; } public Estados matrizTransicion(Estados estadoActual,int estadoSiguiente){ int estado; Estados posicion,matriz[][] = {{Estados.q01,Estados.q02,Estados.q02}, {Estados.q01,Estados.q01,Estados.q02}, {Estados.q02,Estados.q02,Estados.q02}}; estado = estadoActual.ordinal(); posicion = matriz[estado][estadoSiguiente]; return posicion; } public Estados matrizTransicion2(Estados estadoActual,int estadoSiguiente){ int estado; Estados posicion,matriz[][] = {{Estados.q01,Estados.q02}, {Estados.q01,Estados.q02}, {Estados.q02,Estados.q02}}; estado = estadoActual.ordinal(); posicion = matriz[estado][estadoSiguiente]; return posicion; } public Estados matrizTransicion3(Estados estadoActual,int estadoSiguiente){ int estado; Estados posicion,matriz[][] = {{Estados.q01,Estados.q05,Estados.q04}, {Estados.q01,Estados.q02,Estados.q04}, {Estados.q03,Estados.q04,Estados.q04}, {Estados.q03,Estados.q04,Estados.q04}, {Estados.q04,Estados.q04,Estados.q04}, {Estados.q03,Estados.q04,Estados.q04}}; estado = estadoActual.ordinal(); posicion = matriz[estado][estadoSiguiente]; return posicion; } public boolean esLetra(char caracter) { if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z')) return true; else return false; } public boolean esDigito(char caracter) { if((caracter >= '0' && caracter <= '9')) return true; else return false; } public void AutomataFinitoDeterminista(String token) { if(palabraReservada(token)) System.out.println("El token " + token + " es una palabra reservada"); else if(esDecimalEntero(token)) System.out.println("El token " + token + " es un numero decimal entero"); else if(esIdentificador(token)) System.out.println("El token " + token + " es un identificador"); else if(esDecimalReal(token)) System.out.println("El token " + token + " es un numero decimal real"); } } public class AutomataFinito { public static void main(String[] args) { String token; char otroToken; AnalizadorLexico analizador = new AnalizadorLexico(); Scanner teclado = new Scanner(System.in); do { System.out.print("Dame el token: "); token = teclado.nextLine(); analizador.AutomataFinitoDeterminista(token); System.out.print("Desea ingresar otro token?(S/N) "); otroToken = teclado.nextLine().charAt(0); }while(otroToken == 'S' || otroToken == 's'); teclado.close(); } }
gracias
|
|
|
53
|
Programación / Java / Exceptions
|
en: 27 Junio 2014, 19:57 pm
|
Saludos tengo el siguiente codigo : import java.io.File; import java.io.IOException; import java.util.Scanner; import java.io.RandomAccessFile; public class Token { public static void main (String[] args ) { int car; String nombre,componenteLexico ; Scanner teclado = new Scanner (System. in); System. out. print("Dame el nombre del archivo: "); nombre = teclado.nextLine(); teclado.close(); try { while((car = r.read()) != -1) { componenteLexico = Token.leerArchivo(nombre,r); System. out. print(" "+componenteLexico ); } r.close(); } { System. out. println("No se pudo abrir archivo"); } } { int car; char c; long posicion; StringBuilder sb = new StringBuilder(); try { posicion = r.getFilePointer(); r.seek(posicion-1); while((car = r.read()) != ' ') { c = (char)car; sb.append(c); } cadena = sb.toString(); } { System. out. println("No se pudo abrir archivo"); } return cadena; } }
lo que hace es leer un archivo e ir guardando e imprimiendo cada una de las palabras que contiene este archivo, el problema es que me arroja una excepcion que dice: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space creo que tiene que ver con que estoy usando mal la clase StringBuilder, pero soy principiante y todavia no se manejar bien las excepciones. gracias
|
|
|
54
|
Programación / Java / analizador lexicografico
|
en: 24 Junio 2014, 19:47 pm
|
Saludos
Quiero empezar a codificar un analizador lexicografico, pero no me queda claro algunos de los pasos que tengo que seguir, lo primero que se hace es leer un archivo de caracteres y dividirlos en tokens o palabras reservadas. por ejemplo si tengo c = 4+2; pues c es un identificador,= es un signo de asignación y así sucesivamente. Pero en las páginas donde estaba buscando información me dice que tengo que hacer un automata finito deterministico, y hacer las expresiones regulares, pero esto ultimo me tiene confundido,¿Cómo se programan las expresiones regulares? el automata que es lo que hace? identifica si es identificador,operando??
gracias
|
|
|
55
|
Programación / Java / leer archivo
|
en: 23 Junio 2014, 00:10 am
|
Saludos Estoy aprendiendo los conceptos básicos de java, y he estado haciendo pequeños codigos como este que lo que hace es que le pide al usuario el nombre de un archivo que debe abrir y que una vez que este abierto debe leer caracter por caracter e imprimirlo import java.io.File; import java.io.FileReader; import java.io.FileNotFoundException; import java.util.Scanner; public class Token { public static void main (String[] args ) { Scanner teclado = new Scanner (System. in); System. out. print("Dame el nombre del archivo: "); nombre = teclado.nextLine(); teclado.close(); leerArchivo(nombre); } public static void leerArchivo (String nombre ) { try { int car; while((car = fr.read()) != -1) } { System. out. println("No se pudo abrir archivo"); } } }
el problema es que me aparece un error en la linea que me tiene que imprimir los caracteres del archivo y no se por qué, me dice: The method printf(String,Object[])in the type printStream is not applicable for the arguments (String, int),como puedo resolverlo?? gracias
|
|
|
56
|
Foros Generales / Dudas Generales / expresiones regulares
|
en: 22 Junio 2014, 18:34 pm
|
Saludos
tengo la siguiente expresión regular que dice: (a/b)*abb y me dice que las cadenas que me genera son {abb,aabb,babb,ababb,baabb,aaabb,...}, entiendo que todas las cadenas van a contener la subcadena abb, pero no entiendo como se obtiene la operación (a/b)*
gracias
|
|
|
57
|
Programación / Programación C/C++ / problema con cadena
|
en: 11 Junio 2014, 21:58 pm
|
Saludos tengo el siguiente archivo: 0001.....Pri........equ.....1 0002.....Seg......equ.....2 0003.....Ter......equ.....3 0004.....Cua.....equ.....4 00FF.....null.....ORG.....255 00FF......Et.......Ds.b.....5 0000......Otra...equ......0 0104......null....Swi......null......3F 0105......null....Ds.W....5 0005......Qui....equ.......5 010F......null....Swi.......null......3F 0006.......Sex...equ.......6 0110......Sep...Swi.......null.......3F 0008......Oct....equ......8 0111......null....Ldaa....3...........9603 0113......null....Ldaa....Sep.......B60110 0116......null....Ds.b....3 0119......null....Ldaa....3..........9603 0009......Nov....equ.....9 011B.....null....Swi.....Null.......3F 011C......null....Dc.b....2.........02 000B......Dec....Equ.....11 null....End.....null
Aqui 3F,9603,B60110 son códigos máquina, pero las directivas Equ,End, Org y Ds.b(directiva de reserva de memoria) no van a generar codigo. Con este archivo yo tengo que generar un archivo en el que se impriman unos registros así: S0.... S1+04+0104+3F-> aqui se agrega la direccion (0104) y despues el codigo maquina 3F, y ahi paramos porque despues de 3F hay un Ds.W, y este nos indica que se tiene que concluir e imprimir en el archivo como está.. la segunda linea seria: S1+0A+010F+[3F][3F][9603][B60110] y como despues esta Ds.b también ahi paramos la ultima linea seria : S1+07+0119+[9603][3F][02] y como despues tenemos puros equ's que no generan codigo máquina y al ultimo el END, entonces ahi paramos esta es la linea donde tengo problemas porque me la imprime asi: S1+06+0119+[9603][3F] y ya!! le falta el 02 y no entiendo por que no concatena este ultimo, el codigo es el siguiente: void leerTEMPORAL(COD *cabeza,TABSIM **t,char *archivo) { int car,indice,longitud_del_codigo = 0,longitud = 3,bytesDisponibles = 16,disponibles = 16,x = 0,base = 16; int direccionActual,bytesSumados; FILE *tmp; DIV division,*codMaquina; COD *seEncontro = NULL; char *TIPO,*VALOR,*ETIQUETA,*CODOP,*OPERANDO,*COD_MAQUINA; char *tipo = "S1",*Longitud,*direccion,*codigo_datos,*checksum,*nuevaDireccion; codigo_datos = (char*)calloc(33,sizeof(char)); if((tmp = fopen("TEMPORAL.txt","r")) != NULL ) { while((car = fgetc(tmp )) != EOF ) { TIPO = Etiqueta_Codop_Operando(tmp,TIPO_); ignorarEspacios(tmp); VALOR = Etiqueta_Codop_Operando(tmp,VALOR_); ignorarEspacios(tmp); ETIQUETA = Etiqueta_Codop_Operando(tmp,ETIQUETA_); ignorarEspacios(tmp); CODOP = Etiqueta_Codop_Operando(tmp,CODOP_); ignorarEspacios(tmp); OPERANDO = Etiqueta_Codop_Operando(tmp,OPERANDO_); if((seEncontro = buscarCodop(cabeza,CODOP)) != NULL) { if(!verificarOperando(seEncontro,OPERANDO)) { indice = obtenerIndiceDireccionamiento(seEncontro,OPERANDO); COD_MAQUINA = calcularCodigo_Maquina(seEncontro,indice,VALOR,ETIQUETA,CODOP,OPERANDO,t); longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { if(disponibles == 16) direccion = VALOR; strcat(codigo_datos ,COD_MAQUINA ); disponibles = bytesDisponibles-longitud_del_codigo; } else { if(disponibles != 0) { if(disponibles == 16) direccion = VALOR; codMaquina = dividir_CodigoMaquina(&division,COD_MAQUINA,disponibles); strcat(codigo_datos ,codMaquina ->bytesRequeridos ); disponibles = bytesDisponibles -(strlen(codMaquina ->bytesRequeridos )/2); Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); direccionActual = obtenerNumero(VALOR,x,base); bytesSumados = obtenerNumero(codMaquina->bytesPendientes,x,base); longitud_del_codigo = 0; bytesDisponibles = 16; longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { strcpy(codigo_datos ,codMaquina ->bytesPendientes ); disponibles = bytesDisponibles -(strlen(codMaquina ->bytesPendientes )/2); } } else { Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); longitud_del_codigo = 0; disponibles = 16; direccion = VALOR; *codigo_datos = 0; longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { strcpy(codigo_datos ,COD_MAQUINA ); disponibles = bytesDisponibles-longitud_del_codigo; } } } } } else if(esDirectivaCONSTANTES_1byte(CODOP)||esDirectivaCONSTANTES_2byte(CODOP)||esDirectivaCARACTERES(CODOP)) { COD_MAQUINA = codigoMaquina_Directivas(VALOR,ETIQUETA,CODOP,OPERANDO); longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { if(disponibles == 16) direccion = VALOR; strcat(codigo_datos ,COD_MAQUINA ); disponibles = bytesDisponibles-longitud_del_codigo; } else { if(disponibles != 0) { if(disponibles == 16) direccion = VALOR; codMaquina = dividir_CodigoMaquina(&division,COD_MAQUINA,disponibles); strcat(codigo_datos ,codMaquina ->bytesRequeridos ); disponibles = bytesDisponibles -(strlen(codMaquina ->bytesRequeridos )/2); Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); direccionActual = obtenerNumero(VALOR,x,base); bytesSumados = strlen(codMaquina ->bytesRequeridos )/2; nuevaDireccion = calcularDireccion(direccionActual,bytesSumados); direccion = nuevaDireccion; longitud_del_codigo = 0; bytesDisponibles = 16; *codigo_datos = 0; longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { strcpy(codigo_datos ,codMaquina ->bytesPendientes ); disponibles = bytesDisponibles -(strlen(codMaquina ->bytesPendientes )/2); } } else { Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); longitud_del_codigo = 0; direccion = VALOR; longitudValida(COD_MAQUINA,&longitud_del_codigo); if(agregarCodigo_Maquina(longitud_del_codigo)) { strcpy(codigo_datos ,COD_MAQUINA ); disponibles = bytesDisponibles-longitud_del_codigo; } } } } else if(esDirectivaRESERVA_MEMORIA1byte(CODOP)||esDirectivaRESERVA_MEMORIA2byte(CODOP)) { printf("%s %s %s %s\n",VALOR ,ETIQUETA ,CODOP ,OPERANDO ); if(codigo_datos[CERO] != '\0') { Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); longitud_del_codigo = 0; disponibles = 16; *codigo_datos = 0; } } else { if((strcmp(CODOP ,"ORG")) == 0) { printf("%s %s %s %s\n",VALOR ,ETIQUETA ,CODOP ,OPERANDO ); calcularS0(archivo); } else if((strcmp(CODOP ,"END")) == 0) { if(codigo_datos[CERO] != '\0') { Longitud = calcularLongitudS1(longitud,codigo_datos); //checksum = CheckSumS1(Longitud,direccion,codigo_datos); crearRegistroS1(tipo,Longitud,direccion,codigo_datos,checksum); } printf("%s %s %s %s\n",VALOR ,ETIQUETA ,CODOP ,OPERANDO ); crearArchivoS9(); } else if((strcmp(CODOP ,"EQU")) == 0) printf("%s %s %s %s\n",VALOR ,ETIQUETA ,CODOP ,OPERANDO ); else { printf("%s %s %s %s\t",VALOR ,ETIQUETA ,CODOP ,OPERANDO ); printf("NO SE ENCONTRO EL CODOP DE OPERANDO\n"); } } } } else printf("No se pudo abrir archivo\n"); }
la longitud del campo donde se concatenan los codigos maquinas debe ser maximo 32, por eso tengo la función que me dice si el codigo se puede agregar o no, y en caso de que no se pueda hago un nuevo registro. El codigo si funciona lo probe varias veces pero en la ultima me trono y creo que puede ser por la manera en la que le estoy asignando memoria a cadena_datos(donde concateno los codigos) gracias de antemano
|
|
|
58
|
Programación / Programación C/C++ / bug en mi codigo
|
en: 9 Junio 2014, 22:52 pm
|
Saludos tengo la siguiente función que se llama checkSumS1() que creo que me esta ocasionando que me truene un programa, no quiero publicar el código completo porque son 3,500 y tantas líneas de código. Lo que hace es que le paso 3 cadenas(Longitud, direccion y codigo_datos) y dentro de la función las concatena en una variable llamada registroS1, después va leyendo registroS1 de dos caracteres en dos. Por ejemplo si tengo ABE31000 primero va a obtener AB, que se supone es un "numero hexadecimal" y lo voy a convertir a su equivalente en decimal, y lo mismo con los demas caracteres. los decimales se van sumando, a la suma se le saca complemento a 1 y se obtienen sus 2 ultimos caracteres char *CheckSumS1(char *Longitud,char *direccion,char *codigo_datos) { int i,j,k,numero,x = 0,base = 16,suma = 0,complemento; char *registroS1,*byte,digito[2],*checksum; registroS1 = (char*)malloc(39*sizeof(char)); checksum = (char*)malloc(3*sizeof(char)); sprintf(registroS1 ,"%s%s%s",Longitud ,direccion ,codigo_datos ); for(i = 0;registroS1[i];i+=2) { byte = (char*)calloc(3,sizeof(char)); for(j = 1,k = i;j <= 2;j++,k++) { sprintf(digito ,"%c",registroS1 [k ]); } numero = obtenerNumero(byte,x,base); suma+=numero; } complemento = ~suma; sprintf(checksum ,"%02X",complemento ); checksum = ultimos2bits(checksum); return checksum; }
no se bien cual podria ser la causa de que cada vez que cuando el codigo llega a esta función para ejecutarla a veces me truena y otras no. no se si el sprintf y el strcat sean la mejor opcion para usarlos en la función, pero fue lo único que se me ocurrió para que me fuera leyendo de 2 en dos. si alguien me dijera cual es el bug que tiene me codigo se lo agradeceria mucho gracias
|
|
|
59
|
Programación / Bases de Datos / backup en postgres
|
en: 5 Junio 2014, 22:58 pm
|
Saludos
tengo una tabla creada en postgres que tengo que exportar a un archivo.txt, para esto pense que podria usar pg_dump, el problema es que cuando le pongo:
pg_dump act16 > archivo.txt
me aparece un error que dice error de sintaxis en o cerca de pg_dump, no se en que me equivoque
gracias
|
|
|
60
|
Programación / Programación C/C++ / asignación dinámica de memoria y strcpy
|
en: 5 Junio 2014, 18:53 pm
|
Saludos Tengo un pequeño código en el cual le asigno memoria a un puntero dinamicamente, despues le asigno unos valores y los imprimo, el problema lo tengo en el strcpy que se supone que le tiene que asignar la cadena "hola" al puntero, pero el programa truena y no entiendo por qué?? #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *x; x = (char*)calloc(10,sizeof(char)); x = "101010101"; return 0; }
gracias
|
|
|
|
|
|
|