Analizador sintactico para Operacion INSERT de SQL

hola que tal a todos, me e desaparecido por un buen rato por cuestiones de la escuela pero he vuelto y en esta ocasion quiero dejar un ejemplo basico de un analizador sintactico para la expresion INSERT de SQL. Esta clase hace uso del analizador lexico que mostre anteriormente.

En realidad en esta ocasion voi a dejar dos clases; la primera JfrPrincipal.java es una interfaz para que el usuario tenga un espacio (JTextArea) donde pueda escribir cualquiera de las 4 operaciones SQL y tambien tenga un boton analizar que al darle click ejecutara un metodo que instancia a la segunda clase.
La segunda clase es la que realmente analiza la sintaxis de la expresion INSERT que el usuario escribio en la caja de texto. Bueno no aburro mas y a continuacion dejo el codigo de las 2 clases y algunos pantallazos para que se den una idea.

La clase que crea la interfaz grafica de usuario (GUI)…


// @(#)JfrPrincipal.java

// Descripcion: Interfaz grafica de la ventana de usuario

// @author Gonzalo Silverio gonzasilve@gmail.com

// @version 1.00 2009/11/17

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.ListSelectionListener;

import javax.swing.event.ListSelectionEvent;

import java.util.*;

//  Importar clases para manejo de BD (en este ejemplo no

//       se usa ninguna clase de este paquete)

import java.sql.*;

public class JfrPrincipal extends JFrame

{

	 String strInstruccionSQL = "  insert into s values('a','b',23)";

    Tokens tokens;

//	 *Prefijos:

//	 *	jtx		JTextField

//	 *	jpf		JPasswordField

//	 *	jcb		jComboBox

//	 *	btn		JButton

//	 *	lbl		JLabel

//	 *	pan		JPanel

//	 *	fra		JFrame

//	 *	box		Box

//	 *  jrb		JRadioButton

//	 * jtb 		JTable

//	 * jtp		JTabbedPane

//	 * jsp		JScrollPane

//

    public JTextArea jtaOperacionSQL;

    public JTextArea jtaConsultaRemota;

    public JTextArea jtaConsultaDiccionario;

    public static JTextArea jtaMensajes;

    public static JTextArea jtaMensajesSBDD;

    public static JTextArea jtaMensajesParser;

    private JButton btnEjecutar;

    JTable jtbTablaResultados;

    JScrollPane jspTablaResultados;

    JScrollPane jspjtaOperacionSQL;

    static JTabbedPane jtpMensajes;

    //Campos para leer los datos de conexion a un servidor

    public JTextField jtxServidor;

    public JTextField jtxUsuario;

    public JPasswordField jpfPassword;

    public JTextField jtxBD;

    public JComboBox jcbListaDBMSs;

    public JComboBox jcbListaDiccionarios;

    JButton btnConsultaRemota;

    JButton btnConsultaDiccionario;

    private JPanel panConsultaRemota;

	//Constructor que crea la interfaz grafic de la ventan principal

    public JfrPrincipal(String titulo, int ancho, int alto)

    {

    	setTitle(titulo);

    	setSize(ancho, alto);

    	//setSize(900,730);

    	this.setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla

		this.setResizable(true);

		//cambiamos el icono del JFrame

		this.setIconImage(new ImageIcon(getClass().getResource("iconos/icono_JfrPrincipal.png")).getImage());

		//Box que contendra todo el contenido del JFrame

		Box boxContenidoVertical = Box.createVerticalBox();

		//Disenio del rotulo principal superior del JFrame

		Box boxHRotuloPrincipal = Box.createHorizontalBox();

		ImageIcon iconoLeoncito = new ImageIcon(this.getClass().getResource("iconos/leoncito.gif"));

		JLabel lblNombreDelProyecto = new JLabel("Analizador Sintactico de SQL");

		lblNombreDelProyecto.setFont(new Font("Arial",Font.BOLD,20));

		lblNombreDelProyecto.setForeground(Color.BLUE);

		JButton btnCerrar = new JButton();

		btnCerrar.setMargin(new Insets(0, 0, 0, 0));

		btnCerrar.setIcon(new ImageIcon(this.getClass().getResource("iconos/icono_cerrar.png")));

		boxHRotuloPrincipal.add(Box.createHorizontalStrut(15));

		boxHRotuloPrincipal.add(new JLabel(iconoLeoncito));

		boxHRotuloPrincipal.add(Box.createHorizontalStrut(5));

		boxHRotuloPrincipal.add(lblNombreDelProyecto);

		boxHRotuloPrincipal.add(Box.createHorizontalStrut(90));

		boxHRotuloPrincipal.add(Box.createHorizontalStrut(320));

		boxHRotuloPrincipal.add(btnCerrar);

		boxHRotuloPrincipal.add(Box.createHorizontalStrut(10));

		JPanel panRotuloPrincipal = new JPanel(new FlowLayout(FlowLayout.LEFT));

		panRotuloPrincipal.setBackground(Color.white);

		panRotuloPrincipal.add(boxHRotuloPrincipal);

		Color colorEtiquetas = Color.BLUE;

		Color colorInhabilitados = Color.BLACK;

		//Disenio del contenido de la               FICHA DE Operaciones SQL

		//Columan 1

		JTabbedPane jtpOperacionesSQL = new JTabbedPane();

		JPanel panFicha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));

		//JPanel panOperacionesSQL= new JPanel(new FlowLayout(FlowLayout.LEFT));

		  JLabel lblInfoUsuario1 = new JLabel("Operacion SQL");

		  lblInfoUsuario1.setFont(new Font("Arial",Font.BOLD,18));

		  lblInfoUsuario1.setForeground(colorEtiquetas);

		JPanel panjtaOperacionesSQL = new JPanel(new FlowLayout(FlowLayout.CENTER));

		  jtaOperacionSQL = new JTextArea(5,43);

		  jtaOperacionSQL.setDisabledTextColor(colorInhabilitados);

		  jtaOperacionSQL.setFont(new Font("Arial",Font.BOLD,16));

		  jtaOperacionSQL.setForeground(Color.MAGENTA);

		  jtaOperacionSQL.setLineWrap(true);

		jspjtaOperacionSQL = new JScrollPane(jtaOperacionSQL);

		  jspjtaOperacionSQL.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);         //Barra de desplamiento vertical siempre visible

		  jspjtaOperacionSQL.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);      //Barra de desplamiento horizontal nunca visible

		panjtaOperacionesSQL.add(jspjtaOperacionSQL);

		Box boxVOperacionesSQL = Box.createVerticalBox();

		boxVOperacionesSQL.add(lblInfoUsuario1);

		boxVOperacionesSQL.add(panjtaOperacionesSQL);

		JPanel panOperacionesSQL = new JPanel(new FlowLayout(FlowLayout.LEFT));

		panOperacionesSQL.add(boxVOperacionesSQL);

		//Columna 2

		btnEjecutar = new JButton("Ejecutar");

		btnEjecutar.setIcon(new ImageIcon(this.getClass().getResource("iconos/icono_ejecutar.png")));

		JPanel jpnBtnEjecutar = new JPanel(new FlowLayout(FlowLayout.CENTER));

		jpnBtnEjecutar.add(btnEjecutar);

		JButton btnLimpiar = new JButton("Limpiar");

		btnLimpiar.setIcon(new ImageIcon(this.getClass().getResource("iconos/icono_btn_limpiar.gif")));

		JPanel jpnBtnLimpiar = new JPanel(new FlowLayout(FlowLayout.CENTER));

		jpnBtnLimpiar.add(btnLimpiar);

		Box boxVBotonesEjecutarLimpiar = Box.createVerticalBox();

		boxVBotonesEjecutarLimpiar.add(Box.createVerticalStrut(20));

		boxVBotonesEjecutarLimpiar.add(jpnBtnEjecutar);

		boxVBotonesEjecutarLimpiar.add(Box.createVerticalStrut(15));

		boxVBotonesEjecutarLimpiar.add(jpnBtnLimpiar);

		JPanel panboxBotonesEjecutarLimpiar= new JPanel(new FlowLayout(FlowLayout.LEFT));

		panboxBotonesEjecutarLimpiar.add(boxVBotonesEjecutarLimpiar);

		Box boxHFichaOperacionesSQL = Box.createHorizontalBox();

		Box boxVColumna1Ficha1 = Box.createVerticalBox();

		Box boxVColumna2Ficha1 = Box.createVerticalBox();

		boxVColumna1Ficha1.add(panOperacionesSQL);

		boxVColumna2Ficha1.add(panboxBotonesEjecutarLimpiar);

		JPanel panboxVColumna2Ficha1 = new JPanel(new FlowLayout(FlowLayout.LEFT));

		panboxVColumna2Ficha1.add(boxVColumna2Ficha1);

		boxHFichaOperacionesSQL.add(Box.createHorizontalStrut(10));

		boxHFichaOperacionesSQL.add(boxVColumna1Ficha1);

		boxHFichaOperacionesSQL.add(Box.createHorizontalStrut(15));

		boxHFichaOperacionesSQL.add(panboxVColumna2Ficha1);

		panFicha1.add(boxHFichaOperacionesSQL);

		ImageIcon iconoFichaOperacionesSQL = new ImageIcon(getClass().getResource("iconos/icono_ficha_OpersSQL.gif"));

		jtpOperacionesSQL.addTab("Operacion SQL",iconoFichaOperacionesSQL, panFicha1,"Operaciones SQL");

		JPanel panjtpOperacionesSQL = new JPanel(new FlowLayout());

		panjtpOperacionesSQL.add(jtpOperacionesSQL);

//################################################ diseño de la ficha de mensajes del SBDD ##############################################

		jtpMensajes = new JTabbedPane();

		JPanel panFicha11 = new JPanel(new FlowLayout(FlowLayout.CENTER));

		JPanel panjtaMensajesSBDD = new JPanel(new FlowLayout(FlowLayout.CENTER));

		  jtaMensajesSBDD = new JTextArea(18,65);

		  jtaMensajesSBDD.setDisabledTextColor(colorInhabilitados);

		       jtaMensajesSBDD.setBackground(Color.BLACK);

		  jtaMensajesSBDD.setForeground(Color.GREEN);

		  jtaMensajesSBDD.setLineWrap(true);

		  JScrollPane scrolljtaMensajesSBDD = new JScrollPane(jtaMensajesSBDD);

		  scrolljtaMensajesSBDD.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);         //Barra de desplamiento vertical siempre visible

		  scrolljtaMensajesSBDD.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);      //Barra de desplamiento horizontal nunca visible

		panjtaMensajesSBDD.add(scrolljtaMensajesSBDD);

		Box boxVMensajesSBDD = Box.createVerticalBox();

		boxVMensajesSBDD.add(panjtaMensajesSBDD);

		JPanel panMensajesSBDD = new JPanel(new FlowLayout(FlowLayout.LEFT));

		panMensajesSBDD.add(boxVMensajesSBDD);

		Box boxVMSGSColumna1Ficha1 = Box.createVerticalBox();

		boxVMSGSColumna1Ficha1.add(Box.createVerticalStrut(5));

		boxVMSGSColumna1Ficha1.add(panMensajesSBDD);

		Box boxHFichaMensajesSBDD = Box.createHorizontalBox();

		boxHFichaMensajesSBDD.add(boxVMSGSColumna1Ficha1);

		panFicha11.add(boxHFichaMensajesSBDD);

		ImageIcon iconoFichaMensajesSBDD = new ImageIcon(getClass().getResource("iconos/icono_msgs_sbdd.png"));

		jtpMensajes.addTab("Mensajes del SBDD",iconoFichaMensajesSBDD, panFicha11,"Mensajes para el usuario");

//################################################ diseño de la ficha de mensajes del parser ##############################################

		JPanel panFicha22 = new JPanel(new FlowLayout(FlowLayout.CENTER));

		JPanel panjtaMensajesParser = new JPanel(new FlowLayout(FlowLayout.CENTER));

		       jtaMensajesParser = new JTextArea(18,65);

		  jtaMensajesParser.setBackground(Color.BLACK);

		  jtaMensajesParser.setForeground(Color.GREEN);

		  jtaMensajesParser.setLineWrap(true);

		  JScrollPane scrolljtaMensajesParser = new JScrollPane(jtaMensajesParser);

		  scrolljtaMensajesParser.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);         //Barra de desplamiento vertical siempre visible

		  scrolljtaMensajesParser.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);      //Barra de desplamiento horizontal nunca visible

		panjtaMensajesParser.add(scrolljtaMensajesParser);

		Box boxVMensajesParser = Box.createVerticalBox();

		boxVMensajesParser.add(panjtaMensajesParser);

		JPanel panMensajesParser = new JPanel(new FlowLayout(FlowLayout.LEFT));

		panMensajesParser.add(boxVMensajesParser);

		Box boxVMSGSColumna1Ficha2 = Box.createVerticalBox();

		boxVMSGSColumna1Ficha2.add(Box.createVerticalStrut(5));

		boxVMSGSColumna1Ficha2.add(panMensajesParser);

		Box boxHFichaMensajesParser = Box.createHorizontalBox();

		boxHFichaMensajesParser.add(boxVMSGSColumna1Ficha2);

		panFicha22.add(boxHFichaMensajesParser);

		ImageIcon iconoFichaMensajesParser = new ImageIcon(getClass().getResource("iconos/icono_Ficha_msgs_parser.gif"));

		jtpMensajes.addTab("Mensajes del parser",iconoFichaMensajesParser, panFicha22,"Mensajes del parser");

		JPanel panFichass11 = new JPanel(new BorderLayout());

		panFichass11.add(jtpMensajes,BorderLayout.CENTER);

		Box boxHMensajesSBDD = Box.createHorizontalBox();

		boxHMensajesSBDD.add(Box.createHorizontalStrut(20));

		boxHMensajesSBDD.add(panFichass11);

		JPanel panboxHMensajesSBDD = new JPanel(new FlowLayout(FlowLayout.CENTER));

		panboxHMensajesSBDD.add(boxHMensajesSBDD);

		//Agregamos el rotulo y luego las fichas

		boxContenidoVertical.add(panRotuloPrincipal);

		boxContenidoVertical.add(Box.createVerticalStrut(5));

		boxContenidoVertical.add(panjtpOperacionesSQL);

		boxContenidoVertical.add(Box.createVerticalStrut(25));

		boxContenidoVertical.add(panboxHMensajesSBDD);

		//Todo el contenido del JFrame esta en un JPanel

		JPanel panContenidoVertical = new JPanel(new FlowLayout(FlowLayout.CENTER));

		panContenidoVertical.add(boxContenidoVertical);

		add(panContenidoVertical);

		jtpMensajes.setSelectedIndex(1);

		    	// ########### ESCUCHADOR BOTON EJECUTAR   ##########

    	ActionListener escuchadorEjecutar = new ActionListener()

    	{

         public void actionPerformed(ActionEvent evt)

         {

             //selecciona una ficha especificada, empiezan a indexarse en 0

             jtpMensajes.setSelectedIndex(1);

             try

             {

             //Obtener el texto del JTextArea

             strInstruccionSQL = jtaOperacionSQL.getText();

             strInstruccionSQL+=";";		//Para que el usuario no tenga que escribir ; en el JTextArea

             //Indicar que la cadena SQL es el texto del JTextArea

             tokens = new Tokens(strInstruccionSQL);

             tokens.obtener_Token();         //Lee el primer token de la cadena SQL

             //Convertimos la primera palabra leida a minusculas

             String strPrimerToken = tokens.token.toString().toUpperCase();

             //Comprobar si es alguna de las 4 operaciones permitidas

             jtaMensajesSBDD.setText("");    //En cada clic borrar los mensajes anteriores

             jtaMensajesParser.setText("");    //En cada clic borrar los mensajes anteriores

             //Comprobar si es una de las 4 operaciones SQL que se implementaran en el DDBMS

             if(strPrimerToken.equals("INSERT") || strPrimerToken.equals("DELETE") || strPrimerToken.equals("UPDATE") || strPrimerToken.equals("SELECT"))

             {

                 jtaMensajesParser.append("Es una operacion: " + strPrimerToken.toString());

                 if(strPrimerToken.equals("INSERT"))

                 {

                     OperacionInsert insert1 = new OperacionInsert(strInstruccionSQL);

                     insert1.analizar();

                 }

                 else if(strPrimerToken.equals("DELETE"))

                     {

                         OperacionDelete delete1 = new OperacionDelete(strInstruccionSQL);

                         delete1.analizar();

                     }

                     else if(strPrimerToken.equals("UPDATE"))

                         {

                              OperacionUpdate update1 = new OperacionUpdate(strInstruccionSQL);

                              update1.analizar();

                         }

                         else if(strPrimerToken.equals("SELECT"))

                             {

                                 OperacionSelect select1 = new OperacionSelect(strInstruccionSQL);

                                 select1.analizar();

                             }

             }

             else

             {

             	if(strPrimerToken.length()== 0 || strPrimerToken.equals(";") )

             		jtaMensajesParser.append("No ha escrito nada");

             	else if(strPrimerToken.length() > 0)

                 jtaMensajesParser.append("\'"+ strPrimerToken +"\'"+"<-- No es una Operacion SQL valida");

             }

             }

             catch(Exception e)

             {

             }

         }

   	};

    	btnEjecutar.addActionListener(escuchadorEjecutar);

    	// ########### ESCUCHADOR BOTON LIMPIAR   ##########

    	ActionListener escuchadorLimpiar = new ActionListener()

    	{

        	public void actionPerformed(ActionEvent evt)

        	{

				jtaOperacionSQL.setText("");

				jtaOperacionSQL.requestFocus();

        	}

   		};

    	btnLimpiar.addActionListener(escuchadorLimpiar);

    	// ########### ESCUCHADOR BOTON CERRAR   ##########

    	ActionListener escuchadorCerrar = new ActionListener()

    	{

        	public void actionPerformed(ActionEvent evt)

        	{

				System.exit(0);

        	}

   		};

    	btnCerrar.addActionListener(escuchadorCerrar);

    	btnCerrar.setToolTipText("Cierra el programa");

// ##################### ESCUCHADOR DE VENTANA ####################################################################################

    		//Para que al dar clic en la x de la esquina de este JFrame se muestre por default la ventana principal

		this.addWindowListener(new WindowAdapter()

		{

			public void windowClosing(WindowEvent e)

			{

				System.exit(0);

			}

			public void windowClosed(WindowEvent e)

			{

				System.exit(0);

			}

		});

		/* Enfocar el area de consultas SQL */

		jtpOperacionesSQL.setSelectedIndex(0);

    }

    public void mostrar()

    {

    	setLocationRelativeTo(this);	//Centramos este JFrame en la pantalla

    	setVisible(true);

    }

    public static void main (String[] args)

    {

    	JfrPrincipal sbdd = new JfrPrincipal("Analizador sintactico de SQL", 900,730 );

    	sbdd.mostrar();

	}

}

Analizador sintactico para operacion INSERT de SQL


// Archivo: 		OperacionInsert.java
// Descripcion:	Esta clase Analiza la sintaxis de la operacion INSERT de SQL
// Author: 		Gonzalo Silverio   gonzasilve@hotmail.com

import java.util.*;
//Importar clases para manejo de BD
import java.sql.*;

// @author gonzasilve@hotmail.com

public class OperacionInsert
{

    String strInstruccionSQL = "";
    Tokens tokens;
	int i,j,c;

   OperacionInsert(String cadSQL)
   {
     tokens = new Tokens(cadSQL);
   }

   public void analizar()
   {

		tokens.obtener_Token();      //Lee la primera palabra de la cadena, o sea la palabra insert
		tokens.obtener_Token();      //Lee la segunda palabra de la cadena, o sea la palabra into
		if( tokens.tipo_token == tokens.PALABRA_CLAVE && tokens.token.toString().toLowerCase().equals("into"))
		{
		   tokens.obtener_Token();            //leer el token  del nombre de la tabla
		}
		else
		{
			mensaje_parser("ERROR! se esperaba la palabra clave INTO, no la palabra '"+tokens.token.toString()+"'");
			return;
		}

		if( tokens.tipo_token != tokens.IDENTIFICADOR )
		{
			mensaje_parser("ERROR! se esperaba el nombre de la tabla");
			return;
		}

		tokens.obtener_Token();      //leer el token values

		if( tokens.tipo_token == tokens.PALABRA_CLAVE && tokens.token.toString().toLowerCase().equals("values") )
		{
		      tokens.obtener_Token();                                       //leer el token del parentesis
		}	//fin de comprobar si es la keyword values
		else
		{
			if( tokens.token.length() > 0 )
			{
				mensaje_parser("Se esperaba la palabra clave VALUES y no  la palabra '"+tokens.token.toString()+"'.");
			}
			else
				mensaje_parser("Se esperaba la palabra clave VALUES.");

			return;
		}

		if( ! tokens.token.toString().equals( "(" ) )
		{
			if( tokens.token.length() > 0 )
			{
				mensaje_parser("Se esperaba el parentesis de apertura ( y no '"+tokens.token.toString()+"'.");
			}
			else
				mensaje_parser("Se esperaba el parentesis de apertura (.");

			return;
		}

		tokens.obtener_Token();              //leer el token del primer dato a insertar
		StringBuffer strDatosAInsertar  =  new StringBuffer("");
		StringBuffer strTiposDatosAInsertar  =  new StringBuffer("");
		//En el siguiente bucle se van a guardar los datos que el usuario desea insertar y sus tipos de datos
		do
		{	// Guardamos los tokens
		strDatosAInsertar.append( tokens.token.toString() );

		if(tokens.tipo_token == tokens.ERROR )
		{
			mensaje_parser("\n\nERROR, Detalles en la ficha de msgs del parser ");
			return;
		}

		if(  tokens.tipo_token == tokens.DELIMITADOR  )
				strTiposDatosAInsertar.append( "," );
		else	// Guardar el string del tipo de token  */
			strTiposDatosAInsertar.append( tokens.tt );

		tokens.obtener_Token();              //leer siguiente token */
		}while( ! tokens.token.toString().equals( ")" ) );
		//Cambiarnos a la primera ficha
		JfrPrincipal.jtpMensajes.setSelectedIndex(0);
		mensaje_SBDD("La sintaxis es correcta:\nLos datos a insertar son: " + strDatosAInsertar.toString()+" ("+strTiposDatosAInsertar.toString()+")" );

   }		//Fin del metodo que analiza la sintaxis del INSERT

   // Muestra un mensaje de error que llega
   public void mensaje_SBDD(String elMsg)
   {
       JfrPrincipal.jtaMensajesSBDD.append("\n" + elMsg );
   }

   public void mensaje_parser(String msg)
   {
   	JfrPrincipal.jtaMensajesParser.append("\n" + msg );
   }

}

Imagen de la ventana principal donde el usuario teclea alguna Operacion SQL para ser analizada:

y aca un pantallazo de un mensaje cuando el usuario da en el boton analizar y hay errores de sintaxis:

Por ultimo un pantallazo con un INSERT que si es valido:

… y bueno pues como siempre si les aparece algun error al compilar o desean el fuente, les puedo pasar el .java, basta con dejar un comentario con su e-mail

hasta la proxima, espero comentarios….
}

Anuncios

Acerca de gonzasilve
Freelance Web Developer.

9 Responses to Analizador sintactico para Operacion INSERT de SQL

  1. Xavier says:

    Excelente aporte, por favor me podrías enviar el proyecto al mail exaviertg@hotmail.com.
    Gracias.

  2. francisco says:

    Puedes enviarme el proyecto? TE lo agradeceré mucho. mi correo es panchosh20@gmail.com Gracias.

    • gonzasilve says:

      Ok, te lo mande Francisco,

      Saludos!

  3. jeovani says:

    hola si podrias pasarme tu analizador sintatico pofa, te lo agaradesco, mi correo es inavoej_2066rv@hotmail.com
    gracias….

    • gonzasilve says:

      jeovani, te lo acabo de mandar,

      Saludos

  4. LuizZ says:

    Esta perro tu prog…
    si me lo enviaras 😀 te lo agraderece xD..
    Saludos….

    boricua_wy@hotmail.com

    • gonzasilve says:

      Te lo envie, Saludos!

  5. estefania says:

    hola ami si me encantaria que m lo pasaras xfisss
    bye
    gracias

    • gonzasilve says:

      Ok, te lo acabo de enviar

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: