Foros del Web » Programando para Internet » Python »

Reconocerdor lexico.

Estas en el tema de Reconocerdor lexico. en el foro de Python en Foros del Web. Hola todos de nuevo. Tengo una inquitud, a ver si me pueden asesorar un poco. Hace poco tiempo implemente un pequeño reconocedor léxico de un ...
  #1 (permalink)  
Antiguo 26/01/2014, 17:55
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Reconocerdor lexico.

Hola todos de nuevo.
Tengo una inquitud, a ver si me pueden asesorar un poco.

Hace poco tiempo implemente un pequeño reconocedor léxico de un mini lenguaje. Lo hice en C.
Lo hice a mano, es decir, nada de lex ni flex. Para implementarlo, utilize una matriz de entradas/estados que llene de la siguiente manera.

Código:
//Fisrt all the character set.
    stateMatrix[1]['-']=1;
    for(input='A'; input<='Z'; ++input)
    {
        stateMatrix[1][input]=1;
    }
    for(input='a'; input<='z'; ++input)
    {
        stateMatrix[1][input]=1;
    }
    //Then all numbers
    for(input='0'; input<='9'; ++input)
    {
       stateMatrix[1][input]=1;
    }

    //Individual characters
    stateMatrix[0]['(']=PAR_A;
    stateMatrix[0][')']=PAR_C;
    stateMatrix[0]['[']=COR_A;
    stateMatrix[0][']']=COR_C;
    stateMatrix[0]['|']=OR;
    stateMatrix[0]['<']=1;
    stateMatrix[1]['>']=REGLA;
    stateMatrix[0][':']=2;
    stateMatrix[2][':']=3;
    stateMatrix[3]['=']=ASSIGN;
    stateMatrix[0]['"']=4;
    stateMatrix[4]['"']=TERMINAL;
.
.
.
Como se muestra en el código, saque provecho de la codificación ascii para que esto funcionara.

Ahora. Necesito implemetarlo en Python 3 sin usar re ni nada parecido. La idea es también hacerlo manualmente. El problema es que las cadenas de caracteres(string) en python ya usan unicode.

Para ser sincero, no quiero regresar al ascii, ya que eso impide cierto grado de portabilidad.

He estado pensando en alguna forma para hacerlo y pues solo se me ocurre la técnica de una larga lista de if-else.

Alguna idea de como tranformar este codigo en C a python??

Se los agradecería mucho.

Saludos
  #2 (permalink)  
Antiguo 26/01/2014, 19:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Reconocerdor lexico.

Puedes usar una lista y diccionarios para stateMatrix.

Código Python:
Ver original
  1. import string
  2.  
  3. stateMatrix = [
  4.     {
  5.         '(': PAR_A,
  6.         ')': PAR_C,
  7.         '[': COR_A,
  8.         ']': COR_C,
  9.         '|': OR,
  10.         '<': 1,
  11.         ':': 2,
  12.         '"': 4,
  13.     },
  14.  
  15.     {
  16.         '>': REGLA,
  17.     },
  18.  
  19.     {
  20.         ':': 3,
  21.     },
  22.    
  23.     {
  24.         '=': ASSIGN,
  25.     },
  26.    
  27.     {
  28.         '"': TERMINAL,
  29.     },
  30. ]
  31.  
  32. stateMatrix[1]['-'] = 1
  33. for i in (string.ascii_uppercase + string.ascii_lowercase + string.digits):
  34.     stateMatrix[1][input] = 1
  #3 (permalink)  
Antiguo 26/01/2014, 20:25
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Respuesta: Reconocerdor lexico.

Gracias por la respuesta.
Peero.
Temo que hay cosas que no comprendo bien.

Por lo que veo, usaste una lista de diccionarios.
Supongo que en este caso el orden de los diccionarios es la "coordenada" de los estados.
El valor de cada entrada en el diccionario seria el siguiente estado?

Que pasa si meto una letra con acento?

Oh. Y en este caso PAR_A, PAR_C... son constantes.
Hasta donde yo se, python no tiene constantes de forma nativa. Yo las uso mas bien como un enum, para que el codigo sea ligeramente mas legible.
Alguna alternativa?

Saludos
  #4 (permalink)  
Antiguo 26/01/2014, 21:06
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Reconocerdor lexico.

Si, bueno como no supe muy bien como estaba compuesto stateMatrix tuve que asumir ciertas cosas.

Si metes un carácter que no esta dentro del rango del ascii, eso dependerá de ti y de como manejes eso. Ya en el código que pusiste no veo nada mas que inicializar stateMatrix.

Para las constantes, igual que True y False en python 2, solo crea tus constantes y haz uso de estas variables y ya. Por ejemplo ASSIGN = 3 y ya. En python 3, a partir de python 3.4 habrá soporte para enum. http://docs.python.org/3.4/library/enum.html

Pero, incluso en tu código no veo que uses enums correctamente, ya que pareces mezclar constantes con números hardcodeados.
  #5 (permalink)  
Antiguo 26/01/2014, 21:21
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Respuesta: Reconocerdor lexico.

Tienes razon. En este caso statematrix no es mas que una matriz doble de caracteres. Pero como en C char es equivalente a un byte y aparte se usa por defecto el codigo ascii, decidi usar char.

Estoy probando tu idea de las listas de diccionarios. Me esta agradando. Puedo crear una lista de diccionarios vacios y luego irla llenando con el mismo codugo que uso en C.

Para las constantes, estoy usando justo lo que mencionaste. Tengo una lista larga de variables que uso como constantes. Supongo que asi la dejare.

La razon por la cual uso numeros y constante mezclados es porque las constantes con nombre son estados finales y los numeros son solo estados transitorios que no tienen ningun nombre mas que "q1, q2...", por eso decidi dejar solo los numeros.

Bueno, al final supongo que tendre que seguir encasillado con puro ascii. Mi idea es que pudiera leer texto mas general usando unicode.

Te agradezco mucho.

Saludos
  #6 (permalink)  
Antiguo 22/04/2014, 12:22
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Reconocerdor lexico.

@Instru y @razpeitia : disculpen mi ignorancia...... esto sirve para hacer tanto un interprete como un compilador ?

Entiendo el compilador es mas complejo... pero es lo que tendrian en comun (el parseo)... cierto ?
__________________
Salu2!
  #7 (permalink)  
Antiguo 23/04/2014, 09:23
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años, 1 mes
Puntos: 32
Respuesta: Reconocerdor lexico.

@italico76
Correcto, el análisis léxico es el primer paso de la compilación.

Etiquetas: gui
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:10.