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
muchas gracias amigo es de gran ayuda !
[…] código y pulsando sobre preparar cadena, generara los saltos adecuados ya que posee un analizador léxico dentro. Además se pueden emplear aceleradores de […]