Creando un analizador léxico (Parte II)

Este artículo es la continuación de:

Creando un analizador léxico (Parte I)

Trás definir todos los posibles tokens procederemos a la implementación del analizador léxico que los reconocerá.

El analizador antes de poder reconocer los tokens debe fraccionar el código fuente en las palabras que lo componen, teniendo en cuenta para ello los separadores (salto de línea y espacio en blanco). Además se debe tener en cuenta que los espacios en blanco dentro de una cadena no deben ser tenidos en cuenta.

Una vez separadas todas las palabras existentes en el código fuente se deben intentar reconocer cada una de ellas. Para ello nos serviremos de autómatas finitos deterministas, que desarrollaremos según lo expuesto en un artículo anterior, para los componentes léxicos más complejos. Para aquellas palabras cuyo reconocimiento es trivial, como los operadores o las palabras reservadas, simplemente compararemos con dichas elementos. Como se muestra en el siguiente fragmento de código que es utilizado para reconocer si una palabra es una constante lógica o no.

VB.NET:
  1. Private Shared Function EsConstanteLogica(ByVal palabra As String) As Boolean
  2.     Return palabra.ToUpper = "VERDADERO" Or palabra.ToUpper = "FALSO"
  3. End Function

El analizador recibe como parámetros la ruta de un fichero que contiene el script, una cadena con el script o un array de cadenas conteniendo cada una línea del script. Como salida genera una colección de palabras o componentes léxicos. Para cada uno de ellos se proporciona la siguiente información:

  • Palabra en si tal y como aparece en el script
  • Tipo de componente léxico
  • Componente sintáctico con que se corresponde y que será utilizado posteriormente por el analizador sintáctico
  • Linea y columna del script en la que aparece la palabra. Utilizado para mostrar los errores resaltándolos en el código del script y notificar en que punto se ha producido el posible error.

El analizador reconoce los siguientes componentes léxicos:

  • Identificador
  • CTE_Cadena
  • CTE_Numerica
  • CTE_Logica
  • Palabra_Reservada
  • Simbolo_Especial ",", "(" y ")"
  • Operador
  • Salto_Linea
  • Fin_Fichero
  • Erronea

La siguiente entrada del analizador léxico:

n1 "hola" "hño l!'a" "\\as" "ac\\as\"11\"22\"dd fas" c2
fin
variable 3 * a verdadero Y
fas"dfas "as"asf"
"a\aas" 1234.34
c3 c3 "AAAA BB
CC"
"fasdfs\"
numerica 3 / 456 <> != 3 O
fadvariable c3
si
falso
cadena
( , 3 )

produce la siguiente salida:

Salida del analizador léxico.
Salida del analizador léxico.

Creando un analizador léxico (Parte I)

5 Responses to “Creando un analizador léxico (Parte II)”

  1. ranyuo Says:

    hola amigo excelente analizador de esto se aprende mucho sobre todo en mi curso de compiladores

    te agradeceria si pusieras el codigo de este analizador para poder sacar conclusiones ……………

    porfa haber si me ayudas con el codigo

    ranyuo…saludos sos un grande en esto……………………

  2. brausoft Says:

    De momento no voy a liberar el código, supongo que en un futuro lo haré bajo algún tipo de licencia, tal vez la GPL.

    Con la información dada en estos dos artículos y en otro que trata de los autómatas finitos deterministas creo que no tendrás problemas en crearte un analizador léxico.
    Si tienes alguna duda en concreto estaré encantado de echarte una mano.

    Saludos

  3. the_nike Says:

    buen analizador lexico …
    una consulta tu analizador crea errores cuando escribes expresiones numericas sin espacios ejmp
    X=(9+6)*2
    Y=2
    2

  4. the_nike Says:

    ¿ se puede corregir tal problema ?
    Salu2 ¡¡¡¡

  5. brausoft Says:

    Ocurre porque el separador de palabras es el espacio, por lo que si aparecen dos palabras (un numero y un operador por ejemplo) seguidos sin el espacio se considera una única palabra.

    Se podría modificar dicho comportamiento cambiando el analizador léxico para que los considere como varias palabras. El resto de analizadores no habría que tocarlos.

    Saludos

Leave a Reply

Antispam. Escriba la palabra 'hola' (sin comillas)