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:
-
Private Shared Function EsConstanteLogica(ByVal palabra As String) As Boolean
-
Return palabra.ToUpper = "VERDADERO" Or palabra.ToUpper = "FALSO"
-
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.
Creando un analizador léxico (Parte I)