• Viernes 8 de Noviembre de 2024, 17:31

Autor Tema:  Compiladores  (Leído 4682 veces)

yeyita

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Compiladores
« en: Sábado 26 de Marzo de 2005, 03:25 »
0
Auxilio, estoy desarrollando un compilador en java. Estoy con el analisis sintactico pero debo implementar la recuperacion de errores un token atras y tres hacia adelante. La verdad no tengo la menor idea de como empezar a implementarla alguien puede ayudarme? se los agradeceria mucho.

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Compiladores
« Respuesta #1 en: Sábado 26 de Marzo de 2005, 13:52 »
0
En Java no he desarrollado nada de compiladores, se suele usar C. Pero de todo hay.

¿Puedes ser un poco más explícit@ acerca de la gramática que estas desarrollando, tipo de gramática, tipo de control de errores y demas?

A ver si te puedo echar una mano.

Nos vemos :hola:
Core Dumped
zirrus.es

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compiladores
« Respuesta #2 en: Sábado 26 de Marzo de 2005, 23:18 »
0
Vien, aunque no se nada de eso, te digo que te falto decir para que lenguaje es el compilador (Para compilar java, c/c++, perl, pascal.....)
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: Compiladores
« Respuesta #3 en: Lunes 28 de Marzo de 2005, 03:01 »
0
No te entendi bien, pero si es Hacer una especie de undo y redo podrias mas hacer dos listas enlazadas una para las regresiones y la otra para avanzar :) espero haber ayudado sino explicame un poquito mejor plz, bye  :kicking:

yeyita

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Compiladores
« Respuesta #4 en: Martes 29 de Marzo de 2005, 07:31 »
0
Hola, de nuevo yo!
Bueno el compilador que estoy desarrollando es para el lenguaje E ( es un trabajo escolar). :smartass:
Este es un ejemplo de lo que debo hacer (se que es muy largo pero es la unica manera que que quede mas claro), tengo la regla EBNF, pido tokens del archivo y comparo para ver si la sintaxis es correcta o no.

EBNF:
Program::= "main" "program" "(" ")" "begin" "end"

Entrada:
1 | main
2 | begin
3 |
4 | end

Tomando en cuenta esta entrada, los errores serian (sin recuperacion de errores):
Error Semántico en la línea 2, se esperaba "program" y se encontró "begin".
Error Semántico en la línea 4, se esperaba "(" y se encontró "end".
Error Semántico en la línea 4, se esperaba ")" y se encontró EOF.
Error Semántico en la línea 4, se esperaba "begin" y se encontró EOF.
Error Semántico en la línea 4, se esperaba "end" y se encontró EOF.

Esto debido a que cada que se compara un lexema en la regla con un lexema leido, si hay o no correspondecia, se lee el siguiente lexema EN LA REGLA y se lee el siguiente lexema DEL ARCHIVO (provocando de esta manera, errores en cascada; en el ejemplo anterior, los dos últimos).

Como comentaba la recuperacion de errores es tres token adelante y uno hacia atras.

Con la recuperación a nivel de frase con tres tokens (o lexemas) hacia adelante (sin el que es hacia atras), marcaría lo siguiente:

Error Semántico en la línea 2, se esperaba "program" y se encontró "begin".
Error Semántico en la línea 2, se esperaba "(" y se encontró "begin".
Error Semántico en la línea 2, se esperaba ")" y se encontró "begin".
Error Semántico en la línea 4, se esperaba "begin" y se encontró "end".

Ahora ya no marca tantos errores en cascada (solo uno, el último), ya que comparamos el lexema DE LA REGLA (primer lexema) contra el lexema leído DEL ARCHIVO (en este caso "program" de la regla contra "begin" del archivo), si NO hay correspondencia, marcamos el error y avanzamos al siguiente lexema DE LA REGLA (segundo lexema), para comparar con EL MISMO lexema que ya teníamos leido del archivo (ahora sería "(" de la regla contra "begin" del archivo) y si no vuelve a haber correspondencia, marcamos el error y avanzamos nuevamente EN LA REGLA (tercer lexema) y lo comparamos contra EL MISMO lexema que ya teníamos leído (es decir el ")" de la regla contra el "begin" del archivo) y si no hubo correspondencia una vez más marcamos el error y avanzamos al siguiente lexema DE LA REGLA (que se convertirá en el primer lexema) pero TAMBIÉN avanzamos al siguiente lexema DEL ARCHIVO (lo que nos quedaría como "begin" para LA REGLA y "end" para el lexema leído del archivo) y al buscar correspondencia no la habrá y se marcará el error (que es un error falso, pero aquí no lo podemos corregir y así sería correcto), avanzamos el lexema EN LA REGLA (segundo lexema) y ya se encuentra correspondencia con el lexema que teníamos leído y ya se recupera (para este ejemplo es "end" en la regla y en el lexema leído del archivo).

Lo que hacemos con la busqueda hacia atras es lo siguiente: avanzamos en la regla un lexema y leemos otro lexema del archivo cuando no hubieron las tres correspondencias (en el ejemplo anterior, nos quedaría "begin" en la regla y "end" en el lexema leído del archivo) pero ANTES de marcar el error por no haber correspondencia, REGRESAMOS al lexema anterior de los que estámos leyendo DEL ARCHIVO (es por eso que algunos de ustedes van guardando estos lexemas en alguna estructura para su posible futura comparación) para compararlo con el lexema ACTUAL DE LA REGLA (en este caso, al buscar el lexema (o token) hacia atras DEL ARCHIVO nos queda "begin" contra el lexema que tenemos actualmente en la regla, en este caso también "begin" por lo que ya no marcaría ningún error al haber correspondencía, por lo que ya podemos avanzar de token (o lexema) en la regla Y TAMBIÉN en el archivo para seguir con las revisiones posteriores).

Los errores que se marcarían a nivel de frase incluyendo la busqueda hacia atras serían:

Error Semántico en la línea 2, se esperaba "program" y se encontró "begin".
Error Semántico en la línea 2, se esperaba "(" y se encontró "begin".
Error Semántico en la línea 2, se esperaba ")" y se encontró "begin".

Lo cual elimina ya los errores en cascada.

Bueno la verdad no se como comenzar a implementarlo, espero me puedan dar una idea, yo pensaba hacer una funcion pero si creo que seria muy complicado, y pues implementarlo para cada regla seria demasiado repetitivo, no quiero que me hagan el trabajo solo que necesito otras opiniones.

Muchas gracias por su tiempo!

Adjunto el archivo que contiene toda la gramatica del lenguaje
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Compiladores
« Respuesta #5 en: Martes 29 de Marzo de 2005, 20:51 »
0
Lanzarte y hacerlo desde cero puede llegar a ser muy complicado y tedioso, aunque sería la mejor manera de aprender al máximo.

No he podido echar una ojeada a tu gramática BNF, pero se me ocurren algunas preguntas y sugerencias:

- ¿Puedes hacer uso de programas auxiliares como reconocedores léxicos, sintácticos y semánticos? Si es así, te ahorras mucho trabajo. Te puedo comentar algunos si quieres.

- ¿Puedes crear una nueva gramática? Se me ocurre que podrías implementar un traductor descendente recursivo (creo que se llamaba así). De todas formas, lo que quiero decirte es que mires a ver si puedes crearte una nueva gramática a partir de esa, que sea LR, LL, o lo que te resulte más cómodo para luego implementar un reconocedor ascendente o descendente. Detrás de todo esto hay mucha teoría y proyectos prácticos que te podrían ser de gran ayuda.

Espero haberte orientado un poco. Es lo primero que se me ocurre, pero no dudes en preguntar.

Nos vemos :hola:
Core Dumped
zirrus.es

yeyita

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Compiladores
« Respuesta #6 en: Martes 29 de Marzo de 2005, 21:19 »
0
Hola Cirrus, gracias por tomarte tu tiempo en verdad te lo agradezco.
Como decia es un trabajo escolar y si tengo que hacerlo desde cero, todo lo que es sintaxis ya lo tengo solo me falta implementar la recuperacion, y no, no puedo utilizar las herramientas que me comentas tengo que hacerlo completito, ademas la gramatica es la que nos dio el profesor y debemos apegarnos completamente a ella, verdad que si es tedioso?? ni hablar el chiste es aprovechar al maximo y pues a hecharle los kilos.
Muchas gracias y hasta luego

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Compiladores
« Respuesta #7 en: Martes 29 de Marzo de 2005, 23:16 »
0
Pues si tienes que hacerlos desde cero, alla vamos!. Ya comentas que tienes el análisis sintáctico, supongo que el léxico también, es un maravilloso comienzo ;).

Personalmente, como comenta ArKaNtOs, adoro las estructuras dinámicas, así que para la recuperación de errores haría uso de una lista enlazada. Aunque viendo el problema, quizas sea mejor el uso de una cola, con filosofía LIFO, para poder ir leyendo los tokens actuales y mientras poder ir "rellenando" la estructura cuando haga falta avanzar.

Supongo que con esto no esta todo dicho, espero que comentes tus principales problemas a la hora de la implementación.

Nos vemos :hola:
Core Dumped
zirrus.es

yeyita

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Compiladores
« Respuesta #8 en: Miércoles 13 de Abril de 2005, 06:09 »
0
Gracias a todos por su tiempo, todo salio bien y si alguien necesita ayuda y esta en mis manos, con mucho gusto!
Hasta luego