.

1 de ene. de 2011

Analizador Lexico en c#

EN EL SIGUIENTE LINK MUESTRO COMO HACER UN ANALIZADOR LEXICO Y SINTACTICO EN C# DESDE CERO  http://ingenieroensistemas.blogspot.com/2011/07/analizador-lexico-y-sintactico-desde.html
En el siguiente tema explico un analizador lexico conociendo la definicion del mismo en visual c# 2008





 1 public partial class Form1 : Form
 2 
 3     {
 4 
 5 
 6 
 7         int cont = 0;
 8 
 9         int cont1 = 0;
10 
11         int cont2 = 0;
12 
13         string prueba;
14 
15         string cadena;
16 
17         string text;
18 
19         string[] vector_letra = { "a", "A", "b", "B", "c", "C", "d", "D", "e", "E" , "f", "F", "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L", "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R", "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X", "y", "Y", "z", "Z" };
20 
21         string[] vector_digito = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
22 
23         string[] aux = new string[1000];
24 
25         
26 
27         char[] ascii = new char[100];
28 
29             public Form1()
30 
31         {
32 
33             InitializeComponent();
34 
35             ascii_letras();
36 
37 
38 
39 
40 
41         }
42 
43         private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
44 
45         {
46 
47             System.IO.StreamReader sr = new System.IO.StreamReader(this.openFileDialog1.FileName);
48 
49             cadena = System.IO.File.ReadAllText(this.openFileDialog1.FileName);
50 
51             this.txttexto.Text = sr.ReadToEnd();
52 
53 
54 
55         }
56 
57         private void btncargar_Click(object sender, EventArgs e)
58 
59         {
60 
61             this.openFileDialog1.Filter = "archivo *.txt|*.txt";
62 
63             this.openFileDialog1.FileName = "";
64 
65             this.openFileDialog1.Title = "abrir documentos";
66 
67             this.openFileDialog1.InitialDirectory = "C:\\";
68 
69             this.openFileDialog1.ShowDialog();
70 
71 
72 
73 
74 
75 
76 
77 
78 
79         }
80 
81 
82 
83         public void capturar(string captura)
84 
85         {
86 
87 
88 
89             for (int i = 0; i < captura.Length; i++)
90 
91             {
92 
93 
94 
95                 for (int k = 0; k < aux.Length; k++)
96 
97                 {
98 
99 
100 
101                     if (captura.Substring(i, 1).Equals(aux[k]))
102 
103                     {
104 
105                         for (int j = 0; j < vector_letra.Length; j++)
106 
107                         {
108 
109                             if (captura.Substring(i, 1).Equals(vector_letra[j]))
110 
111                             {
112 
113 
114 
115                                 dataGridView1.Rows.Add(cont + 1, captura, "Es una palabra");
116 
117                                cont++;
118 
119                             }
120 
121                         }
122 
123                         for (int j = 0; j < vector_digito.Length; j++)
124 
125                         {
126 
127                             if (captura.Substring(i, 1).Equals(vector_digito[j]))
128 
129                             {
130 
131                                 dataGridView1.Rows.Add(cont + 1, captura, "Es un numero");
132 
133                                 cont++;
134 
135                             }
136 
137                           }
138 
139                         for (int j = 0; j < ascii.Length; j++)
140 
141                         {
142 
143                             if (char.Parse(captura.Substring(i, 1))==(ascii[j]))
144 
145                             {
146 
147                                 dataGridView1.Rows.Add(cont + 1, captura[i], "Es un simbolo");
148 
149                                 cont++;
150 
151                             }
152 
153 
154 
155                         }
156 
157                     }
158 
159                 }
160 
161 
162 
163             }
164 
165         }
166 
167         private void btnanalizar_Click(object sender, EventArgs e)
168 
169         {
170 
171            
172 
173             for (int i = 0; i < cadena.Length; i++)
174 
175             {
176 
177                 if (cadena[i] == ' ')
178 
179                 {
180 
181                     capturar(prueba);
182 
183                     //cont++;
184 
185                     prueba = "";
186 
187 
188 
189                 }
190 
191                 else
192 
193                 {
194 
195                     prueba = prueba + cadena[i].ToString();
196 
197                 }
198 
199 
200 
201                 if (i == cadena.Length - 1)
202 
203                     capturar(prueba);
204 
205 
206 
207             }
208 
209 
210 
211 
212 
213 
214 
215             
216 
217         }
218 
219 
220 
221         private void btnagregar_Click(object sender, EventArgs e)
222 
223         {
224 
225 
226 
227             aux[cont1] = txtanalizar.Text;
228 
229           lblleng.Text = lblleng.Text + aux[cont1] + ",";
230 
231             cont1++;
232 
233             txtanalizar.Text = "";
234 
235             txtanalizar.Focus();
236 
237             
238 
239                 //aux1=aux1+aux[cont1].ToString();
240 
241             
242 
243         }
244 
245 
246 
247         public void ascii_letras() {
248 
249             for (int i = 33; i <= 47;i++ )
250 
251             {
252 
253                 ascii[cont2] = Convert.ToChar(i);
254 
255                 cont2++;
256 
257                 
258 
259             }
260 
261 
262 
263             for (int i = 58; i <= 64; i++)
264 
265             {
266 
267                 ascii[cont2] = Convert.ToChar(i);
268 
269                 cont2++;
270 
271                
272 
273             }
274 
275             for (int i = 91; i <= 96; i++)
276 
277             {
278 
279                 ascii[cont2] = Convert.ToChar(i);
280 
281                 cont2++;
282 
283                
284 
285             }
286 
287             for (int i = 123; i <= 126; i++)
288 
289             {
290 
291                 ascii[cont2] = Convert.ToChar(i);
292 
293                 cont2++;
294 
295                 
296 
297             }
298 
299             
300 
301             
302 
303         }
304 
305         
306 
307         private void btnbuscar_Click(object sender, EventArgs e)
308 
309         {
310 
311             txttexto.SelectionBackColor = Color.White;
312 
313             int q = 0;
314 
315             int contpalabra = txtbuscar.Text.Length;
316 
317             for (int i = 1; i <= txtbuscar.Text.Length; i++) { if (contpalabra == i) { q = i-1; } }
318 
319             
320 
321          
322 
323             for (int x = 0; x < txttexto.Text.Length-q;x++ )
324 
325             {
326 
327 
328 
329                 
330 
331                 for (int y = 0; y < txtbuscar.Text.Length;y++ )
332 
333             {         
334 
335                     if (txttexto.Text.Substring(x,contpalabra).Equals(txtbuscar.Text))
336 
337                     {
338 
339                         listBox1.Items.Add("encontrado en la pos:" +( x+1));
340 
341                         txttexto.Find(txtbuscar.Text);
342 
343                        txttexto.SelectionLength=contpalabra;
344 
345                        txttexto.SelectionStart = x;
346 
347                         txttexto.SelectionBackColor = Color.Red;
348 
349                         txttexto.HideSelection = false;
350 
351                     }
352 
353                                   
354 
355                     }
356 
357                     
358 
359             }
360 
361 
362 
363            
364 
365         }
366 
367 
368 
369         private void btnreemplazar_Click(object sender, EventArgs e)
370 
371         {
372 
373             string fic = this.openFileDialog1.FileName;
374 
375             string a;
376 
377             //cadena.Replace(cadena[2].ToString, "a");
378 
379             text = a;
380 
381             System.IO.StreamWriter sw = new System.IO.StreamWriter(fic);
382 
383             sw.WriteLine(text);
384 
385             sw.Close();
386 
387             
388 
389         }
390 
391 
392 
393         private void txtbuscar_TextChanged(object sender, EventArgs e)
394 
395         {
396 
397             for (int i = 0; i < txttexto.Text.Length; i++)
398 
399             {
400 
401                 txttexto.SelectionStart = i;
402 
403                 txttexto.SelectionBackColor = Color.White;
404 
405             }
406 
407         }
408 
409 
410 
411         
412 
413   
414 
415 
416 
417     }
418 
419 }     


63 comentarios:

  1. disculpa fijate que los links de descarga ya no funcionan sera que podrias volver a subir el archivo.
    Gracias

    ResponderEliminar
  2. esta bien te envio el link pero si tenes dudas de como hacer un analizador lexico te puedo orientar para que sea exitoso
    http://www.mediafire.com/file/pudvyl44lr9a7r1/analizador.rar

    ResponderEliminar
  3. buen dia, fijate que me marco un error en}
    text = a;
    que esta en el metodo
    private void btnreemplazar_Click(object sender, EventArgs e)

    ResponderEliminar
  4. YA ME DI CUENTA, LO QUE PASA ES QUE EL METODO REEMPLAZAR NO FUNCIONA SI QUERES TE PUEDO AYUDAR CON LEXICO SENCILLO EN C# O EN JAVA POR EJEMPLO:
    EXPRESION REGULAR QUE RECONOZCA (a|b)*abb
    1)Hacemos por el metodo de thompson o de arbol para realizar en automata finito deterministico
    2) Teniendo el automata cada estado es un case eso quiere decir que utiliza switch

    int n = 0;
    switch (n)
    {
    case 0:
    if(cadena.equal("b")){
    n=0;
    }else if(cadena.equal("a"){
    n=1;
    }
    break;
    case 1:
    if(cadena.equal("b")){
    n=2;
    }else if(cadena.equal("a"){
    n=1;
    }
    break;
    case 2:
    if(cadena.equal("b")){
    n=3;
    }else if(cadena.equal("a"){
    n=1;
    }
    break;
    case 3:
    if(cadena.equal("b")){
    n=0;
    }else if(cadena.equal("a"){
    n=1;
    }
    break;
    default:
    Console.WriteLine("no pertenece al lenguaje");
    break;
    }

    ResponderEliminar
  5. Que tal, soy Estudiante de ingenieria en sistemas de la USAC y me dejaron un analizador sintactico, el analizador lexico si lo comprendo pero no sé como hacer para combinarlos o algo asi, Pido orientacion
    Marvin.18@hotmail.com

    ResponderEliminar
  6. Disculpa sera que tambien podrias ayudar con un analizador sintactico? mi correo es inmortal12345@yahoo.com

    ResponderEliminar
  7. bueno el objetivo del analizador lexico es comprobar que si el token pertenece al lenguaje, cuando esta todo bien le pasa los token al analizador sintactico por ejemplo, haciendo por ll1 haciendo todo el metodo nos queda una tabla en base a esa tabla se programa les voy a dejar varios link para que vean cualquier duda me dicen. si no entienden como programarlo se los programo
    http://www.youtube.com/watch?v=PG7q74rZ8HM
    http://www.youtube.com/watch?v=h-iMTsIgK_I&feature=related

    ResponderEliminar
    Respuestas
    1. me podrias ayudar con un analizador en c# me urge es para un examen de la escuela, te lo agradeceria mucho e-mail:edy1morales@gmail.com

      Eliminar
  8. los link no funcionan..please arreglalos...

    ResponderEliminar
  9. los link no funcionan, los podes volver a subir.... Gracias !!!!

    ResponderEliminar
  10. de hecho no se preocupen por el proyecto voy hacer un videotutorial de un analizador lexico y sintactico en java y en c# este fin de semana

    ResponderEliminar
  11. Gracias amigo !!! muy amable.

    ResponderEliminar
  12. Hola, igualmente podrias subir de nuevo los links para poder correrlos en C#!!! Pura Vida!!!

    ResponderEliminar
  13. xfa ayuda con el analizador sintactico en c# me urge
    ciber_gonzalez09@hotmail.com

    ResponderEliminar
  14. por favor cuando tengan dudas que sean puntuales por ejemplo un analizador sintactico ¿ Que tipo? LL1 o LALR o SLR o LR

    ResponderEliminar
  15. si es LL1 primeros resolvemos nuestra gramatica por medio de first y follow para forma nuestra tabla
    ejemplo:
    No terminal num + * ( ) $
    E E->TE’ E->TE’
    E’ E->+TE’ E’-> E’->
    T T->FT T->FT’
    T’ T’-> T’->*FT’ T’-> T’->
    F F->num F->( E )

    ya programado en c# en base a la tabla seria:
    Por cada no terminal creó una constante que representara a este terminal
    private final int E=100;
    private final int EPrima=101;
    private final int T=102;
    private final int TPrima=103; //y asi sucesivamente
    Creo un arreglo por cada producción que no produzca epsilon, por ejemplo para E->
    ET’. Empezamos por el lado derecho de la producción es decir T’ y luego E, La
    producción padre es decir la E que este a la izquierdo esa no la tomamos.
    private int[] p1={TPrima,E}; // E-> ET’ el TPrima se lo declare arriba
    private int[] p2={EPrima, T, tokenMas}; // Eprima->+TE’
    me devolvio el scanner
    do{ //Entra a un ciclo por lo menos una vez
    if(token.valor!=-1){ //pregunto si el token que no es -1, esto nos indica que
    //si no es -1 la lista de tokens contiene varios tokens
    //antes que nos aparezca el token -1 que seria el final
    //’Este if pregunta si lo que hay en la cima de la pila es un terminal
    // o si lo que esta en la cima de la pila es -1
    //el método EsTerminal(String), recibe un string que comprueba si el token
    //obtenido es un terminal
    if(EsTerminal(Integer.parserInt(pila.peek()))==true||pila.peek().equals("-1")){
    //si el valor del token es igual al token que devuelve la pila
    if(token.valor==Integer.parseInt(String.valueOf(pila.peek()))){
    //el metodo obtener variable(int, string)
    this.setObtenerVariable(token.valor,token.lexema);
    pila.pop(); //saca lo que se encuentra actualmente en la pila
    token=this.getToken(); //se obtiene un Nuevo token
    }
    else{
    //quiere decir que vino un terminal que no concuerda con el
    //que la pila estaba esperando, por lo tanto es un error
    //sintáctico por lo que hay que recuperarse de los errores como
    //ustedes plantean
    }
    }
    //si lo que hay en la cima de la pila es un terminal
    else if(this.EsNoTerminal(String.valueOf(pila.peek()))==true){
    int nt=Integer.parseInt(String.valueOf(pila.peek()));//obtengo el codigo
    // del no terminal
    int f=this.ObtenerFila(nt); //este método devuelve la fila en la que
    //esta la producción representada por fila
    int c=this.Obtenercolumna(token.valor); //devuelve la columna asociad
    //al terminal que leimos con getToken()
    //si lo que hay en la tabla no es un error
    //contiene el entero que representa a la produccion
    int produzco=(int )tabla[f][c];
    if(!produzco!+ = Error){ //comparación entre entero
    pila.pop(); //saco el no terminal
    this.insertarDatosOne(f,c); //este método
    //ingresa a la pila los valores del arreglo que
    obtiene del arreglo que se creo en paso 2
    //por ejemplo si saca E, ingresaría a la pila
    Eprima y después T.
    }
    else{
    //ocurre otro error sintáctico
    //deben recuperarse
    }
    }
    }
    else{ //si el token es -1 quiere decir que ya no hay mas valores en la lista de tokens
    //que nos dio el scanner
    //se revisa en que estado se quedo y si hay mas elementos en la pila quiere
    //decir que no se produjo lo que la gramatica espero y que faltaron elementos
    // o vinieron incorrectos
    }
    }//fin del método

    ResponderEliminar
  16. mmmmmmm podrias resubir los links......sq ya no sirven..... xfa urge un pokitin.....

    ResponderEliminar
  17. q onda compa si habra ayuda o q onda????....

    ResponderEliminar
  18. Manolo claro que te voy a ayudar pero tu correo no adjuntaste nada entonces no se en que te puedo ayudar, solo me dijiste que un analizador lexico pero que acepta tu lenguaje????? cual es tu gramatica?????? por que metodo de analisis sintactico descendente o ascendente
    Por favor ser un poco especifico

    ResponderEliminar
  19. Hola quisiera que des una breve explicación acerca de que método de análisis sintáctico me conviene usar si LL1, SLR,LR(0),LR(1),LALR.
    que ventajas o deventajas existe de usar uno u otro metodo
    Pretendo hacer un compilador para java

    ResponderEliminar
  20. En el caso de ll1 significa leer de izquierda a derecha, derivando por la izquierda y es descendente, no puede ser ambigua, ni recursiva por la izquierda.

    En el caso de de SLR es conocido como Análisis Sintáctico por desplazamiento y reducción.
    Construye un árbol de análisis para una cadena de entrada, partiendo de las hojas hacia la raíz.

    En el caso de LR Es el método que reconoce el mayor numero de gramáticas de tipo LR
    Características:
    Es el método mas largo de todos los tipo LR
    Es el mas eficiente

    En el caso LALR este tipo de análisis se puede realizar mediante 3
    técnicas:
    ™LR(k): Leen la entrada de izquierda a derecha
    (Left to rigth).
    ™SLR(1): Mejora el LR(1) pero hace uso de la
    búsqueda hacia delante.
    ™LALR(1): Más potente que SLR(1) y más sencillo que
    LR(1).

    El que te recomiendo que uses es LALR porque te acepta casi todas las gramaticas y es el metodo que utiliza JAVA CUP Y BISON

    ResponderEliminar
  21. Amigo donde te puedo contactar? tengo una duda

    ResponderEliminar
  22. ok gracias, necesito ayuda porfis, soy nueva en esto de los compiladores, no entiendo del todo, mira es que quiero un codigo en c sencillo, en el que pueda identificar lo q es Token,LexicalError,BufferedCharStream,Lexer.

    Son las clases de la descripción genérica de los analizadores léxicos.

    ResponderEliminar
  23. en el codigo tengo que mostrar donde se encuentra el token, error lexico,bufferedcharstream, lexer.

    ResponderEliminar
  24. ENTIENDO, DE HECHO LA ESTRUCTURA PUEDE VARIAR TE DOY UN LINK DE UN AMIGO QUE TIENE HECHO LO QUE TU NECESITAS http://rdebug.blogspot.com/2009/09/analizador-lexico-hecho-mano-en-c.html

    ResponderEliminar
    Respuestas
    1. hola buenas tardes disculpa estoy leyendo este post, y me interesa, mas que nada quisiera que me ayudaras a resolver un analisis lexico de esta siguiente cadena int x=10; porfavor ayudanme necesito el codigo se los voy a gradecer si me ayudan con algo porfavorrr

      Eliminar
  25. Hola! (:

    los links ya no estan disponibles, podrias volverlos a subir por favor...

    Gracias.

    ResponderEliminar
  26. Porfa sube los links de nuevo te lo agradeceria montones es justo lo que necesito se ve que esta dema chido...... plissssssssssssssss es urgente

    ResponderEliminar
  27. hola!! muchas gracias por tu excelente trabajo, quisiera saber si tienes algún link actualizado con tu proyecto, o si podrías ayudarme, mi correo electrónico es andiiov113@gmail.com de verdad harías tu buena acción del día si me respondes :)

    ResponderEliminar
  28. ho0laa!! muchass graciasss de vdd excelente trabajo el ke has hecho me ha ayudado mucho podrias proporcionarme tu proyecto ya concluso? porfa te lo agradeceria infinitamente!! mi correo es jaja1891@hotmail.com saludo0s :D

    ResponderEliminar
  29. hola muy buenas tardes mi nombre es jesus necesito ayuda para hacer un analizador lexico de una matriz de transcision, del cual dicha matriz se deriva de esta expresion: int x=10;
    necesito ayuda porfavor un codigo en c++, java o en lo que sea porfavor ayudenme

    ResponderEliminar
  30. hechame la mano con ese programa que habias subido donde explicas un analizador lexico conociendo la definicion del mismo en visual c# 2008. Me dejaron el mismo y no logro realizarlo.

    ResponderEliminar
  31. si me hechas la mano con es porgrama te dejo mi correo raymundo_alvaro@yahoo.es

    ResponderEliminar
  32. Hola sera q puedes subir de nuevo los links si los necesito urgente gracias...

    ResponderEliminar
  33. Hola amigo que tal tengo que hacer un analizador lexico simplificado no se si me puedas hechar la mano con unas dudas que tengo mi correo es oster50@hotmail.com

    ResponderEliminar
  34. hola muy buen programa los link no sirven no puedes volver a subirlo o enviarlo a mi correo josemp71@gmail.com

    por favor

    ResponderEliminar
  35. Hola los link no sirven me puedes mandar el programa con los codigos a mi correo te lo agradeceria mucha gracias es itzel_nebu@hotmail.com

    ResponderEliminar
  36. Hola los link no descargan nose si me lo puedes enviar a mi correo nimash8@hotmail.com y me preguntaba si me podrias ayudar nose si tu has usado antlr tengo que generar el codigo desde antlr para ponerlo en c# si pudes avisame al correo gracias

    ResponderEliminar
  37. Amigo disculpa me podrias mandar el programa con los codigos estare muy agradecido contigo, gracias.. sk8_bunbury_forest@hotmail.com

    ResponderEliminar
  38. Hola que tal espero que este blog siga activo y sea revisado...

    Creo que estoy como todos y requiero de ayuda me pidieron hacer un analizador lexicográfico pero no se ni por donde empezar....

    Tiene que ser en C++ si alguien me pudiera ayudar se los agradeceré mucho mi correo es stitch0101@gmail.com.

    Gracias y saludos

    ResponderEliminar
  39. Lo felicito es un gran material el que usted ha creado, espero que yo pueda entenderlo y pueda hacer el contador de líneas de código que debo hacer.

    ResponderEliminar
  40. hola quisiera que me ayudaras a hace mi analizar lexico y sintacticooo porfa me gustaria consultar algunos codigos tuyos... vanfanel_90@hotmail.com

    ResponderEliminar
  41. no hay ningun problema dime tu expresion regular y tu gramatica y te podria asesorar

    ResponderEliminar
  42. Hola buen día yo estoy haciendo mis analizadores solo tengo el Lexico,me faltan dos voy por el Sintactico, no me corre me puede ayudar, utilizando Java N

    ResponderEliminar
  43. hola....oye no se si puedas pasarme el analizador lexico en c# por favor!! l.angel05@hotmail.com

    ResponderEliminar
  44. PUEDES SUBIRLO NUEVAMENTE PARA PODERLO DESCARGAR TE AGRADECERIA MUCHISIMO

    ResponderEliminar
  45. muchas gracias me sirvio mucho tu informacion

    ResponderEliminar
  46. hola wooo que trabajo... disculpa podis subir otra vez el proyecto por que los links estan caidos please o.O

    ResponderEliminar
  47. sube los links otra vez xfavor

    ResponderEliminar
  48. Hola :D
    muy buen trabajo, crees que puedas subir nuevamente los links del proyecto porfa

    ResponderEliminar
  49. Disculpen que no he podido subir el material, voy a buscarlo y lo voy a subir por la tarde

    ResponderEliminar
  50. hola soy estudiante en ingeneria en sistemas computacionales disculpa la molestia pero podriana yudar a programar en c# un analizador sintactico por favor "me urge "............mucho

    ResponderEliminar
  51. oooooooooo sem e olvidaba mi correo es chama_gol100@hotmail.com por si me pueden explicar hay dejo mi correo mucha gracias

    ResponderEliminar
  52. podrias mandarme el proyecto a mi correo?? es gmc_carlos@hotmail.com porfa o si puedes subirlo a algun servidor para de hay descargarlos..

    ResponderEliminar
  53. Hola, si lo puedes subir esta semana te lo agradecería, parece ser un buen material, mis felicitaciones, en caso contrario si me pudieras facilitar el código en C# del analizador léxico y sintactico al correo ludicu1983@gmail.com me sería de gran ayuda como guía, yo tengo que dessarrollarlos en lenguaje C# con formato EBNF Pascal (lo de pascal lo tengo y algo entiendo)

    Gracias!!!!

    ResponderEliminar
  54. Amigo podrias porfavor subir los links de nuevo te lo agradeceria :)

    ResponderEliminar
  55. podrias por favor resubir los links, tu explicación es muy buena y me gustaria ponerlo en práctica, serias tan amable de resubir el archivo del analizador lexico, saludos

    ResponderEliminar
  56. Oye Amigo de casualidad tienes el analizador Sintáctico?

    ResponderEliminar
  57. oye me podrias pasar el proyecto mi correo es choche_j_15@hotmail.com

    ResponderEliminar