sábado, 5 de abril de 2008

Atributos Sintetizados en JLex y Cup

Llevando mi curso de compiladores 2, en laUSAC con el ingeniero Byron me di cuenta que el usaba mucho los atributos sintetizados de una manera libre, como de esta manera:

E -> T + F { E.valor= T.valor+ F.valor}

  • El no terminal “E” recibe valores de atributos de “T” y “F”, todos son el mismo tipo de no terminal, entonces me dije, como puedo lograr eso, ya que solo he usado como si fuera String o Integer, decidí lograrlo de alguna manera. Logre crear mis propios atributos sintetizados a mi manera, este es uno de los métodos:En el archivo que usen para el análisis léxico despues de agregar los import y todas las librerías y paquetes pueden declarar una clase de esta manera:

import java_cup.runtime.Symbol;

class cadena
{
public String cad;

public cadena(String cad_){
cad=new String(cad_);
}
public cadena(String cad1_,String cad2_)
{
cad=new String(cad1_+”,”+cad2_);
}
}

  • Ahora como vemos tenemos esta clase en el archivo léxico, nos disponemos ahora a ir al archivo donde hagan el análisis sintáctico , y en la definicions de no terminales declaran de esta manera:

non terminal cadena expr_list, expr_part;

  • Ahora pasaremos a usarlo, esta es la parte que a todos nos llama la atención, como usar los atributos


expr ::= expr_list:a {:System.out.println(a.cad);:};

expr_list::= expr_list:a COMA expr_part:b {:RESULT=new cadena(a.cad,b.cad);:}
| expr_part:a {:RESULT=new cadena(a.cad);:}
;

expr_part ::= id:a {:RESULT=new cadena(a);:};

Nota: id devuelva una cadena de letras y COMA es lo que indica el nombre, este ejemplo reconoce una cadena de palabras separadas por COMA, pero pueden ser creativo, en su clase creada pueden meter lo que quieran, Arrays,Vector etc, todo lo que Java les permita.

Además, si tenemos la clase que deseamos sintetizar en un paquete, fácilmente se puede usar igual, en el archivo que utilicen para el análisis sintáctico declaren ese paquete o la clase a usar import package.clases_a_usar; y en el área de no terminales pueden declararlo libremente, non terminal clase_a_usar E; y listo.

Acá les dejo el ejemplo si desean compilarlo y probarlo, recuerden que en lexico.lex esta la clase y en sintacticup.cup en el área de no terminales esta declarado.

Ejemplo: Atributos sintetizados

4 comentarios:

Anónimo dijo...

Me gustaría echarle un ojo a ese código pero parece que no está. Buen tema el de los compiladores.
Ánimo con el blog, no lo abandones.

Anónimo dijo...

Gracias por el ejemplo, ahorita que empiezo con eso de lex y cup... salu2

Anónimo dijo...

Gracias man! viva Sistemas USAC

Anónimo dijo...

Gracias vos!! No fue necesario ver el ejemplo para entenderte, me aclaraste muchas dudas, no solo de los atributos sino del uso del "RESULT"...