2. ERRORES LÉXICOS
Son pocos los errores simplemente en el nivel léxico ya que tiene una
visión muy restringida de un programa fuente. El analizador léxico debe
devolver el componente léxico de un identificador y dejar a otra fase se
ocupe de los errores.
Suponga que una situación en la cual el analizador léxico no puede
continuar porque ninguno de los patrones concuerda con un prefijo de la
entrada. Tal vez la estrategia de recuperación más sencilla sea
recuperación “EN MODO PANICO” (este método de recuperación es
donde se borra caracteres sucesivos de la entrada hasta que el analizador
léxico pueda encontrar un componente léxico bien formado). ¡¡Los
programas no siempre son correctos!!
3. El compilador tiene que:
• Reportar clara y exactamente la presencia de errores
• Recuperarse de cada error lo suficientemente rápido para poder detectar
errores subsiguientes:
• Tratar de evitar mensajes falsos de error.
• Un error que produce un token erróneo.
• Errores léxicos posibles.
ERRORES LÉXICOS
4. Errores léxicos formales.
Los errores léxicos formales son aquellos que afectan a la forma de la
palabra, como la pronunciación, la escritura o la morfología.
• Errores de pronunciación: son aquellos que se producen al pronunciar una
palabra de forma incorrecta. Por ejemplo, pronunciar "perro" como "perro".
• Errores de escritura: son aquellos que se producen al escribir una palabra
de forma incorrecta. Por ejemplo, escribir "casa" como "casa".
• Errores de morfología: son aquellos que se producen al usar la palabra en
la forma incorrecta. Por ejemplo, usar el verbo "ser" en plural ("son" en
lugar de "son").
ERRORES LÉXICOS
5. Errores léxicos semánticos
Los errores léxicos semánticos son aquellos que afectan al significado de
la palabra. Pueden ser de dos tipos:
• Errores de significado: son aquellos que se producen al usar una palabra
con un significado incorrecto. Por ejemplo, usar la palabra "grande" para
referirse a algo que es "alto".
• Errores de ambigüedad: son aquellos que se producen al usar una
palabra que tiene varios significados y que, en el contexto en el que se
usa, puede causar confusión. Por ejemplo, la palabra "mesa" puede
referirse a un mueble o a una comida.
ERRORES LÉXICOS
6. Para evitar los errores léxicos, es importante:
• Aprender las reglas léxicas del lenguaje de programación.
• Utilizar un editor de texto que detecte errores léxicos.
• Compilar el código fuente con frecuencia.
ERRORES LÉXICOS
7. GENERADORES DE ANALIZADORES
LEXICOS
Una vez visto cómo las expresiones regulares pueden ser muy útiles a la hora de reconocer
patrones en un fichero de texto, y de utilizarlas para desencadenar ciertas acciones en
respuesta, vamos a estudiar una herramienta que permite crear programas autónomos que
analizan léxicamente la entrada y la procesan a nuestro antojo: el generador de
analizadores léxicos lex.
Lex genera código fuente en C, a partir de una serie de especificaciones escritas en
lenguaje Lex. El código C generado contiene una función llamada yylex(), que localiza
cadenas en la entrada (lexemas) que se ajusten a uno de los patrones léxicos especificados
en el código fuente Lex, realizando entonces las acciones asociadas a dicho patrón.
yylex() puede llevar a cabo cualquier tipo de acciones ante un determinado patrón y, en
particular, puede comportarse como un analizador léxico.
8. FUNCIONAMIENTO DE LEX
Al contrario que sed y awk, lex no es un analizador sino un generador de
analizadores. Esto permite incluir de manera cómoda un analizador a medida
en cualquier programa:
9. Lenguaje Lex
Un programa fuente de Lex tiene el siguiente aspecto:
De estas tres secciones, sólo la segunda es obligatoria, y cualquiera de
ellas puede estar vacía. Esto quiere decir que el mínimo programa en lex
es:
%%
10. La sección de declaraciones incluye declaraciones de variables, constantes y definiciones
regulares, que constituyen una manera cómoda de utilizar expresiones regulares largas en
la sección de reglas; por ejemplo:
Letra [A-Za-z]
La sección de reglas especifica los patrones a reconocer y las acciones asociadas a éstos,
de forma similar a la que utiliza awk:
patrón {acciones en C}
La sección de rutinas permite definir funciones auxiliares en C, incluida la función main().
Por defecto, lex proporciona un main() que simplemente llama a la función yylex().