Palentino Blog

Introducción a la compilación. Creación de un sencillo analizador léxico. Caso práctico

El analizador léxico es la primera fase de un compilador, lee caracteres de entrada para formar componentes e identificarlos o clasificarlos y pasar la información de los componentes al analizador sintáctico.

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar.  Este proceso de traducción se conoce como compilación.

El analizador léxico que incorporan la mayoría de los compiladores de los lenguajes de programación realiza además funciones como eliminar espacios en blanco, saltos de línea, tabuladores, ignorar comentarios, detección y recuperación de errores. Los errores que un analizador léxico reconoce son símbolos no válidos o no reconocidos por el lexico del lenguaje o que no forman parte de ningún componente léxico.

Existen diversos métodos para construir una analizador léxico, un método es usar un AFD para describir el patrón de cada componente. Para este método se parte de una tabla descriptiva de los componentes léxicos que reconocerá el analizador, en donde se clasifican los diversos tipos de componentes.

Para cada componente se construye un AFD que permita identificar el patrón de simbolos que deberá recibir y donde deberá terminar ese patrón que señale que ahi se encontró un componente. Todos los AFD´s se integran en un solo diagrama.

Finalmente se determina la matriz de transición de estados, que no es más que transcripción del AFD integrado, en donde las columnas son los símbolos que acepta el analizador. Lo que resta es crear un algoritmo de reconocimiento de cadenas y añadir mediante una selección de casos para tomar la acción correspondiente según la cadena encontrada.

En este post analizaremos como crear uno sencillo, en VB.

He preferido crear un autómata programable personal, aplicando los conceptos de implementación del analizador léxico. Autómata.

Este autómata se encuentra realizado en VB.

La tabla de símbolos se encuentra en memoria y no en disco.

Tengo que procesar todos los elementos, creados en la tabla de símbolos.

Estos son los identificadores definidos (total 49 lexemas) para la tabla de símbolos.

 


Diagrama de transiciones.

Ventana del ejemplo aplicado.

Código cuando se pulsa una tecla.

Private Sub valor_KeyPress(KeyAscii As Integer)

If KeyAscii = 8 Then
Vtemporal = ""
Else

Error.Visible = False
aceptado.Visible = False

Vtemporal = Vtemporal & Chr(KeyAscii)
caracter = Chr(KeyAscii)
If Not IsNumeric(Chr(KeyAscii)) Then

Estado2.Value = 1

'Ahora comparamos si la entrada es correcta con la tabla de simbolos.
For x = 0 To Me.TablaSimbolos.ListCount - 1
   If Vtemporal = TablaSimbolos.List(x) Then
        Estado3.Value = 1
        aceptado.Visible = True

        TablaSimbolos.Selected(x) = True

        Contador = Contador + 1
   End If

Next x

Else
Estado1.Value = 1
Vtemporal = ""
Error.Visible = True
Contador = 0

End If

valor = ""

End If
End Sub

Tabla de simbolos

'Alta de elementos en la tabla de simbolos

TablaSimbolos.AddItem "Definevar", 0
TablaSimbolos.AddItem "Definecons", 1
TablaSimbolos.AddItem "Ent", 2
TablaSimbolos.AddItem "Carac", 3
TablaSimbolos.AddItem "Variable", 4
TablaSimbolos.AddItem "Decimal", 5
TablaSimbolos.AddItem "*/", 6
TablaSimbolos.AddItem "evalua", 7
TablaSimbolos.AddItem "vincula", 8
TablaSimbolos.AddItem "color", 9
TablaSimbolos.AddItem "arreglo", 10
TablaSimbolos.AddItem "=", 11
TablaSimbolos.AddItem "==", 12
TablaSimbolos.AddItem "!=", 13
TablaSimbolos.AddItem "", 15
TablaSimbolos.AddItem ">=", 16
TablaSimbolos.AddItem ">", 29
TablaSimbolos.AddItem "convierte", 30
TablaSimbolos.AddItem "si", 31
TablaSimbolos.AddItem "entonces", 32
TablaSimbolos.AddItem "encasocontrario", 33
TablaSimbolos.AddItem "{", 34
TablaSimbolos.AddItem "}", 35
TablaSimbolos.AddItem "caso", 36
TablaSimbolos.AddItem "sinocaso", 37
TablaSimbolos.AddItem "desde", 38
TablaSimbolos.AddItem "llamada", 39
TablaSimbolos.AddItem "hasta", 40
TablaSimbolos.AddItem "haz", 41
TablaSimbolos.AddItem "&&", 42
TablaSimbolos.AddItem "||", 43
TablaSimbolos.AddItem "no", 44
TablaSimbolos.AddItem "//", 45
TablaSimbolos.AddItem "/*", 46
TablaSimbolos.AddItem "funcion", 47

Adjunto código fuente del ejemplo en formato RAR

Automata-ejemplo

Salir de la versión móvil