Anda di halaman 1dari 3

Analizador Léxico

Un analizador léxico es el componente encargado de identificar los tokens válidos en un


código de entrada y emitir errores de ser necesario, crearemos un analizador léxico basado
en expresiones regulares capaz de detectar números, cadenas, comentarios, operadores,
identificadores y palabras reservadas.

El analizador léxico deberá informar de cada token encontrado, en que linea y columna
exactamente fue extraído el token, ademas del indice del token, el tipo y el lexema que lo
representa, toda esta información la mostraremos en un ListView de WPF.

Uso de Expresiones regulares

Para construir el analizador léxico utilizaremos la clase Regex que implementa el motor de
expresiones regulares de .Net Framework, este nos permitirá buscar modelos de caracteres o
patrones que representan nuestros tokens admitidos por el analizador léxico, regex creara el
AFN (Autómata Finito No Determinista) correspondiente a la expresión regular que creemos.

Para especificar los modelos de caracteres admitidos necesitamos conocer el lenguaje de


expresiones regulares, si no estamos familiarizados con las expresiones regulares
mira: Introducción a Expresiones Regulares.

Analizador Léxico Basado en Expresiones Regulares

Nuestro analizador léxico identificara la sintaxis básica de el lenguaje C#, para ello
definiremos las siguientes expresiones regulares:

csLexer.AddTokenRule(@"\s+", "ESPACIO", true);


csLexer.AddTokenRule(@"\b[_a-zA-Z][\w]*\b", "IDENTIFICADOR");
csLexer.AddTokenRule("\".*?\"", "CADENA");
csLexer.AddTokenRule(@"'\\.'|'[^\\]'", "CARACTER");
csLexer.AddTokenRule("//[^\r\n]*", "COMENTARIO1");
csLexer.AddTokenRule("/[*].*?[*]/", "COMENTARIO2");
csLexer.AddTokenRule(@"\d*\.?\d+", "NUMERO");
csLexer.AddTokenRule(@"[\(\)\{\}\[\];,]", "DELIMITADOR");
csLexer.AddTokenRule(@"[\.=\+\-/*%]","OPERADOR");
csLexer.AddTokenRule(@">|<|==|>=|<=|!", "COMPARADOR");
El método AddTokenRule agrega un patrón a reconocer, debemos indicar el primer lugar la
expresión regular, seguido de un nombre para el token y por ultimo un valor tipo bool opcional
que indica si se debe ignorar el correspondiente token.

Para detectar la palabras reservadas del lenguaje solo agregaremos una lista de estas
palabras, si el token IDENTIFICADOR pertenece a la lista de palabras reservadas cambiamos
el nombre de token a RESERVADO.

La clase RegexLexer es la encargada de compilar la expresión regular, crear el AFN y


detectar los correspondientes tokens, una vez inicializada la clase llamamos al método
GetTokens(string).

public IEnumerable GetTokens(string text)


{
if (requiereCompilar) throw new Exception("Compilación
Requerida, llame al método Compile(options).");

Match match = rex.Match(text);

if (!match.Success) yield break;

int line = 1, start = 0, index = 0;

while (match.Success)
{
if (match.Index &gt; index)
{
string token = text.Substring(index, match.Index -
index);

yield return new Token("ERROR", token, index, line,


(index - start) + 1);

line += CountNewLines(token, index, ref start);


}

for (int i = 0; i &lt; GNumbers.Length; i++)


{
if (match.Groups[GNumbers[i]].Success)
{
string name = rex.GroupNameFromNumber(GNumbers[i]);

yield return new Token(name, match.Value,


match.Index, line, (match.Index - start) + 1);

break;
}
}

line += CountNewLines(match.Value, match.Index, ref start);


index = match.Index + match.Length;
match = match.NextMatch();
}

if (text.Length &gt; index)


{
yield return new Token("ERROR", text.Substring(index),
index, line, (index - start) + 1);
}
}

Utilizaremos un ListView para crear una vista de nuestros tokens encontrados, aquellos
tokens no admitidos serán marcados en rojo y contados como error, la GUI se vera de este
modo.

Este es un ejemplo sencillo y muy básico de como crear un analizador léxico usando
expresiones regulares en .net, no se admiten todas las características del lenguaje C# pero
podemos agregar las expresiones regulares correspondientes si lo deseamos.

Link
http://acodigo.blogspot.mx/2014/02/analizador-lexico.html

Anda mungkin juga menyukai