Está en la página 1de 47

Compiladores

M.c. Adan Garnica Carrillo

Universidad Michoacana de San Nicolás de Hidalgo

Curso 2018/2018

Contacto: adan_0203@hotmail.com,agarnica@dep.fie.umich.mx

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 1 / 50


Índice

1 Introducción
Contenido sintético
Bibliografía
Metodología
Diagnóstico

2 Introducción a los compiladores

3 Analizador Léxico
Lexemas y lenguajes regulares
Autómatas de estado Finito y reconocimiento de lexemas
Conversión de expresiones regulares a autómatas finitos
Generador de analizadores léxicos
LEX

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 2 / 50


Introducción

Objetivo

Proveer al alumno con principios y técnicas útiles para la construcción


de Compiladores. El alumno deberá ser capaz de implementar la tra-
ducción (o “compilación”.) de un lenguaje de programación de alto nivel
al lenguaje de máquina de un computador, para lo cual deberá aso-
ciar los conceptos abstractos de programación estudiados en cursos
previos con su implementación concreta en el ámbito de la tecnología
actual.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 4 / 50


Introducción Contenido sintético

Tema Horas
1. Introducción a los compiladores 3
2. Análisis léxico 7
Proyecto 1. Implementación de un analizador léxico
Examen Parcial 1 2
3. Tabla de símbolos 7
4. Análisis sintáctico 9
Proyecto 2. Implementación de un analizador sintáctico
Examen Parcial 2 2
5. Análisis semántico 7
6. Generación de código intermedio 9
Examen Parcial 3 2
Proyecto 3. A definir por el profesor
Total 48

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 5 / 50


Introducción Bibliografía

Bibliografía básica
Alfred Aho, Ravi Sethi y Jeffrey Ullman. Compiladores: Principios,
Técnicas y Herramientas. Pearson Education, Segunda Edición,
2008.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 6 / 50


Introducción Metodología

Metodología de enseñanza-aprendizaje
Revisión de conceptos, análisis y solución de problemas en clase X
Lectura de material fuera de clase X
Ejercicios fuera de clase (tareas) X
Investigación documental
Elaboración de reportes técnicos o proyectos X
Prácticas de laboratorio en una materia asociada
Visitas a la industria

Metodología de evaluación:
Asistencia:
Tareas: 10 %
Elaboración de reportes técnicos o proyectos: 30 %
Exámenes de Academia o Departamentales 60 %

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 7 / 50


Introducción Diagnóstico

Términos importantes

Escribe en tu cuaderno lo que entiendes por los siguientes términos


Computadora
Sistema operativo
Arquitectura de computadora
CPU
Estructuras de datos: Lista, Pila, Cola.
Algoritmo
Programa
Lenguaje de programación
Código Fuente
Lenguaje Compilado
Lenguaje interpretado
Código objeto
Código máquina

Compilador

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 8 / 50


Introducción Diagnóstico

Términos importantes

Computadora: Máquina electrónica capaz de recibir información,


almacenarla y tratarla automáticamente mediante operaciones
matemáticas y lógicas controladas por programa, para finalmente
entregar el resultado del procesamiento por medio de los
periféricos de salida.
Sistema operativo: Es un conjunto de programas encargados de
administrar los recursos de la computadora, explotar los recursos
de hardware de uno o más procesadores y proveer al usuario un
conjunto de servicios que sirven como interface para interactuar
con el hardware.
Arquitectura de computadora: se refiere al diseño conceptual y
la estructura operacional fundamental de una computadora.
CPU: Unidad Central de Procesamiento de una computadora.
Estructuras de datos: Lista, Pila, Cola:

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 9 / 50


Introducción Diagnóstico

Términos importantes
Algoritmo: Conjunto ordenado de pasos que permiten llegar a la
solución de un problema.
Programa: es una secuencia de instrucciones, escritas para
realizar una tarea específica en una computadora.
Lenguaje de programación: Está formado por un conjunto de
símbolos y reglas sintácticas y semánticas que definen su
estructura y el significado de sus elementos y expresiones. Al
proceso por el cual se escribe, se prueba, se depura, se compila
(de ser necesario) y se mantiene el código fuente de un programa
informático se le llama programación.
Código Fuente: es un conjunto de líneas de texto con los pasos
que debe seguir la computadora para realizar alguna tarea
específica. El código fuente de un programa está escrito en algún
lenguaje de programación, pero no es directamente ejecutable
por la computadora, sino que debe ser traducido a otro lenguaje o
código binario.
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 10 / 50
Introducción Diagnóstico

Términos importantes
Lenguaje Compilado: Un lenguaje compilado es aquel cuyo
código fuente, escrito en un lenguaje de alto nivel, es traducido
por un compilador a un archivo ejecutable entendible para la
máquina en determinada plataforma. Con ese archivo se puede
ejecutar el programa cuantas veces sea necesario sin tener que
repetir el proceso por lo que el tiempo de espera entre ejecución y
ejecución es ínfimo.
Lenguaje interpretado: se encargan de realizar la traducción
instrucción a instrucción a la vez que se ejecuta el programa. Son
más lentos, pero mejores cuando el proceso de
traducción/ejecución se realiza en repetidas ocasiones, por lo que
son más adecuados para principiantes.
Código objeto: En programación, se llama código objeto al
código que resulta de la compilación del código fuente.? Puede
ser en lenguaje máquina o bytecode, y puede distribuirse en
varios archivos que corresponden a cada código fuente
compilado.
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 11 / 50
Introducción Diagnóstico

Términos importantes

Código máquina: es el sistema de códigos directamente


interpretable por un circuito microprogramable, como el
microprocesador de una computadora o el microcontrolador de un
autómata. Este lenguaje está compuesto por un conjunto de
instrucciones que determinan acciones a ser tomadas por la
máquina.
Compilador: es un programa que puede leer un programa en un
lenguaje (el lenguaje fuente) y traducirlo en un programa
equivalente en otro lenguaje (el lenguaje destino); Una función
importante del compilador es reportar cualquier error en el
programa fuente que detecte durante el proceso de traducción.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 12 / 50


Introducción a los compiladores

Función de un compilador

Traducir el código fuente que generalmente está en un lenguaje


de alto nivel a un lenguaje que sea mas sencillo y entendible para
la computadora.
Revisar la estructura del código fuente desde tres enfoques
distintos, léxico, sintáctico y semántico e informa al usuario si
existen errores.
Optimizar el código
Crear el código objeto.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 14 / 50


Introducción a los compiladores

Sistema de Procesamiento del Lenguaje

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 15 / 50


Introducción a los compiladores

Fases de un compilador

El proceso de compilación de código se compone básicamente de dos


fases.
Fase de análisis: La etapa de análisis del código fuente.
Dividir el código fuente en componentes e imponer una estructura
gramatical sobre ellas.
Utilizar esta estructura para crear una representación intermedia
del programa fuente.
Detectar errores de sintaxis o semántica inconsistente e informar
los errores en su caso.
Recolectar información sobre el programa fuente y la almacena en
una estructura de datos llamada tabla de símbolos.
Fase de síntesis: La de Síntesis de código objeto:
Construir el programa destino deseado a partir de la representación
intermedia y de la información de la tabla de símbolos.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 16 / 50


Introducción a los compiladores

Fases de un compilador

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 17 / 50


Introducción a los compiladores

Fases de un compilador

Análisis de código fuente:


Léxico: Vocabulario, conjunto de palabras y expresiones que se
usan en un contexto y están bien definidas.
Sintáctico: Disciplina lingüística que estudia el orden y la relación
de las palabras o sintagmas en la oración, así como las funciones
que cumplen.– Modo de combinarse y ordenarse las palabras y
las expresiones dentro del discurso.
Semántico: significado de las palabras o de las oraciones o
relacionado con él

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 18 / 50


Introducción a los compiladores

Fases de un compilador
Análisis de código fuente:
Analizador léxico
Analizador léxico: A la primera fase de un compilador se le llama
análisis de léxico o escaneo. El analizador de léxico lee el flujo de
caracteres que componen el programa fuente y los agrupa en
secuencias significativas, conocidas como lexemas. Para cada
lexema, el analizador léxico produce como salida un token.
token: es una secuencia de caracteres que forman una unidad
significativa.
<nombre-token, valor-atributo> que pasa a la fase siguiente, el
análisis de la sintaxis. En el token, el primer componente
nombre-token es un símbolo abstracto que se utiliza durante el
análisis sintáctico, y el segundo componente valor-atributo apunta
a una entrada en la tabla de símbolos para este token.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 19 / 50


Introducción a los compiladores

Fases de un compilador

Análisis de código fuente:


Analizador léxico
Funciones:
Leer el programa fuente carácter por carácter.
remover los espacios en blanco, tabulaciones y saltos de linea.
Remover comentarios.
Agrupar los caracteres en unidades llamadas tokens.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 20 / 50


Introducción a los compiladores

Fases de un compilador

Análisis de código fuente:


Analizador sintáctico: La segunda fase del compilador es el
análisis sintáctico o parsing. El parser (analizador sintáctico)
utiliza los primeros componentes de los tokens producidos por el
analizador de léxico para crear una representación intermedia en
forma de árbol que describa la estructura gramatical del flujo de
tokens. Una representación típica es el árbol sintáctico, en el cual
cada nodo interior representa una operación y los hijos del nodo
representan los argumentos de la operación.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 21 / 50


Introducción a los compiladores

Fases de un compilador

Análisis de código fuente:


Analizador sintáctico: Utiliza el árbol sintáctico y la información
en la tabla de símbolos para comprobar la consistencia semántica
del programa fuente con la definición del lenguaje. Recopila
información sobre el tipo y la guarda, ya sea en el árbol sintáctico
o en la tabla de símbolos, para usarla más tarde durante la
generación de código intermedio. Comprobación (verificación) de
tipos, en donde el compilador verifica que cada operador tenga
operandos que coincidan.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 22 / 50


Analizador Léxico

Funciones de analizador léxico

El análisis léxico simplifica la labor del análisis sintáctico permitiendo


que este no tenga que lidiar con caracteres sino con tokens.
La función de un analizador léxico es identificar a los elementos
sintácticos básicos del lenguaje los cuales son indivisibles y a los
que llamamos tokens.
El analizador debe de ignorar caracteres blancos (espacios,
tabuladores y retornos de carro) y reconocer a la cadena mas
larga de caracteres que forme un token válido.
El analizador léxico entrega el tipo de token de que se trata
mediante una constante predeterminada y la cadena leída a la
cual por cierto llamamos lexema. Una manera preferida de
entregar el lexema es insertándolo en una tabla conocida como
Tabla de símbolos y entregando la posición que el lexema ocupa
en esa tabla.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 24 / 50


Analizador Léxico

definición de términos

Un token es un par que consiste en un nombre de token y un


valor de atributo opcional. El nombre del token es un símbolo
abstracto que representa un tipo de unidad léxica; por ejemplo,
una palabra clave específica o una secuencia de caracteres de
entrada que denotan un identificador. Los nombres de los tokens
son los símbolos de entrada que procesa el analizador sintáctico.
Un patrón es una descripción de la forma que pueden tomar los
lexemas de un token. En el caso de una palabra clave como
token, el patrón es sólo la secuencia de caracteres que forman la
palabra clave. Para los identificadores y algunos otros tokens, el
patrón es una estructura más compleja que se relaciona mediante
muchas cadenas.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 25 / 50


Analizador Léxico

Definición de términos

Un lexema es una secuencia de caracteres en el programa


fuente, que coinciden con el patrón para un token y que el
analizador léxico identifica como una instancia de ese token. Un
componente léxico puede tener uno o infinitos lexemas. Por
ejemplo: palabras reservadas tienen un único lexema. Los
números y los identificadores tienen infinitos lexemas.
Las tablas de símbolos son estructuras de datos que contienen
información acerca de los identificadores. La información se
coloca en la tabla de símbolos cuando se analiza la declaración
de un identificador. Una acción semántica obtiene información de
la tabla de símbolos cuando el identificador se vuelve a utilizar,
por ejemplo, como factor en una expresión.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 26 / 50


Analizador Léxico Lexemas y lenguajes regulares

Lenguajes regulares

Un lenguaje regular es un tipo de lenguaje formal que satisface las


siguientes propiedades:
Puede ser reconocido por:
1 un autómata finito determinista
2 un autómata finito no determinista
3 un autómata de pila
4 un autómata finito alterno
5 una máquina de Turing de solo lectura
Es generado por:
1 una gramática regular
2 una gramática de prefijos
Es descrito por:
una expresión regular

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 27 / 50


Analizador Léxico Lexemas y lenguajes regulares

Lenguaje de programación
Un lenguaje de programación se puede definir como:
Notación formal para describir algoritmos o funciones que serán
ejecutadas por una computadora.
Lenguaje para comunicar instrucciones a la computadora.
Convención para escribir descripciones que pueden ser
evaluadas.
Dentro de los atributos de un buen lenguaje están:
Claridad y sencillez
Naturalidad para la aplicación
Apoyo para la abstracción
Facilidad para verificar programas
Entorno de programación
Portabilidad de programas
Costo de uso
Costo de ejecución
Costo de traducción
Costo
M.c. Adan Garnicade creación
Carrillo (FIE) y pruebaCompiladores Compiladores, 2018 28 / 50
Analizador Léxico Autómatas de estado Finito y reconocimiento de lexemas

Autómatas de estado finito

Un autómata finito (AF) o máquina de estado finito es un modelo


computacional que realiza cómputos en forma automática sobre
una entrada para producir una salida. Este modelo está
conformado por un alfabeto, un conjunto de estados finito, una
función de transición, un estado inicial y un conjunto de estados
finales.
Un autómata finito es un modelo matemático de una máquina que
acepta cadenas de un lenguaje definido sobre un alfabeto A.
Consiste en un conjunto finito de estados y un conjunto de
transiciones entre esos estados, que dependen de los símbolos
de la cadena de entrada. El autómata finito acepta una cadena x
si la secuencia de transiciones correspondientes a los símbolos
de x conduce desde el estado inicial a un estado final.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 29 / 50


Analizador Léxico Autómatas de estado Finito y reconocimiento de lexemas

Reconocimiento de lexemas

El reconocimiento de lexemas puede hacerse de forma eficiente me-


diante expresiones regulares y/o autómatas finitos.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 30 / 50


Analizador Léxico Conversión de expresiones regulares a autómatas finitos

Expresiones regulares
Expresiones regulares básicas
Los caracteres del propio alfabeto los cuales se corresponden a sí
mismos.
La cadena vacía, es decir la cadena que no contiene ningún
carácter.
Operaciones de expresiones regulares
Concatenación
Repetición o cerradura (Si Se indica mediante el carácter *
asterisco)
Sea r una expresión regular, entonces r* denota cualquier
concatenación finita de cadenas cada una de las cuales
corresponde a r incluyendo la cadena vacía.
La cerradura positiva se indica mediante el metasímbolo +; no
incluye la cadena vacía.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 31 / 50


Analizador Léxico Generador de analizadores léxicos

Herramientas de generación de compiladores

Existen herramientas especializadas para implementar las diferentes


fases de un compilador. Los sistemas de ayuda para construir compila-
dores se conocen como:
Compiladores de compiladores
Generadores de compiladores
Sistemas generadores de compiladores

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 32 / 50


Analizador Léxico Generador de analizadores léxicos

Herramientas de generación de compiladores


Algunas herramientas útiles para la construcción de compiladores
Generadores de analizadores léxicos
Por lo general, trabajan a partir de una especificación basada en
expresiones regulares.
La organización básica del analizador léxico resultante es un
autómata finito.
Generadores de analizadores sintácticos
Trabajan a partir de una gramática independiente del contexto.
El generador hace de esta fase una de las más fáciles de aplicar.
Se utilizan poderosos y complejos algoritmos para realizar el
análisis.
Dispositivos de traducción dirigida por la sintaxis
Producen grupos de rutinas que recorren el árbol de análisis
sintáctico generando código intermedio.
Generadores automáticos de código
Toman un conjunto de reglas que definen la traducción de cada
operación del lenguaje intermedio al lenguaje de máquina objeto.
La técnica fundamental es la concordancia de plantillas.
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 33 / 50
Analizador Léxico LEX

LEX

El objetivo del reconocimiento léxico es empatar el flujo de la entrada


con el patrón especificado en alguna expresión regular, como resultado
de este empate se obtiene un par formado por el token apropiado y el
valor asociado (el lexema). El generador de analizadores LEX toma
como entrada un conjunto de expresiones regulares y genera como
salida código fuente que en realidad es la implementación de un DFA
correspondiente a dichas expresiones regulares.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 34 / 50


Analizador Léxico LEX

LEX

El LEX no es un lenguaje sino un generador de analizadores


léxicos, en otras palabras es un generador de programas.
La entrada para LEX se especifica en términos de expresiones
regulares y rutinas asociadas a ellas; la salida es un programa en
C.
El programa en C generado por LEX recibe un flujo de caracteres
de entrada, el cuál se secciona para extraer cadenas que
empaten con las expresiones regulares, detectado el empate se
ejecuta la rutina asociada.
Es responsabilidad del programador definir las expresiones
regulares utilizando la sintaxis de LEX y las rutinas asociadas a
ellas en lenguaje C.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 35 / 50


Analizador Léxico LEX

LEX

El formato general de una especificación LEX contiene:


Definiciones:
Puede contener de forma opcional código en C (inclusión de
librerías, declaración de variables y constantes simbólicas).
También contiene definiciones de expresiones regulares
(NombreExpresión ExpresiónRegular)
Reglas
Contiene los patrones a reconocer y las acciones (llamados a
función) que se han de realizar cuando se reconozca un patrón.
Funciones
Contiene, cuando es necesario, las definición o implementación
de las rutinas asociadas a las reglas.
También es el lugar de la función main.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 36 / 50


Analizador Léxico LEX

LEX

Para separar secciones se utiliza % % y para enmarcar el código opcio-


nal en C %{ %}, un esqueleto de especificación LEX seria:
Estructura de un archivo de LEX
%{
/*Código opcional*/
%}
/*Definiciones*/
%%
/*Reglas*/
%%
/*Funciones*/

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 37 / 50


Analizador Léxico LEX

Expresiones Regulares

Las expresiones regulares son patrones utilizados para encontrar una


determinada combinación de caracteres dentro de una cadena de texto.
x cualquier carácter que coincide con x
. cualquier carácter (byte) excepto salto de linea
[xyz] un carácter que coincida con una x, una y, o una z
[abj-oZ] cualquier carácter de la clase a, b, Z o del rango de j a la o.
[^A-Z] negación de clase de caracteres
[^A-Z\n] excepto letras mayúsculas o salto de linea

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 38 / 50


Analizador Léxico LEX

Expresiones regulares
r* cero o más apariciones de r
r+ una o más r’s
r? cero o una r’s (una r opcional)
r{2,5} entre 2 y 5 repeticiones de r’s
r{2,} dos o más r’s
r{4} exactamente 4 r’s
{exp} Expande una definición de expresión regular llamada exp
\0 un carácter nulo 0 en el código ASCII
\123 El carácter con el valor octal 123
\x2a El carácter con el valor hexadecimal 2a
(r) Coincide con una r los paréntesis sirven para agrupar
rs La expresión regular r seguida de la expresión regular s
r|s rós
^r Se acepta una expresión r sólo si está al inicio de la linea.
r$ Se acepta una expresión r sólo si aparece al final de la linea.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 39 / 50


Analizador Léxico LEX

Operadores en expresiones regulares


Una expresión regular especifica un conjunto de cadenas a ser empa-
tadas. Cada expresión regular consta de caracteres y operadores. Los
operadores que se aplican sobre los caracteres son:
” ” (comillas) Permite aplicarlos de forma literal
\ (diagonal invertida) Permite escapar caracteres
[] (corchetes) Permite crear rangos de caracteres
^ (acento circunflejo) Especifica complemento en rangos
^ (acento circunflejo) sólo se acepta si es el inicio de la linea
− (guión) Utilizado para especificar rangos
? (interrogación) Significa opcional
. (punto) Cualquier carácter excepto salto de linea
* (asterisco) Cero o más repeticiones
+ (más) Una o más repeticiones
| (barra) Se lee como or
( ) (paréntesis) Son utilizados para agrupar
$ (pesos) Sólo se acepta si está al final de la linea
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 40 / 50
Analizador Léxico LEX

Operadores en expresiones regulares

/ (diagonal)Se acepta la expresión regular de la


izquierda de / sólo si va seguida
de la expresión regular a la derecha de /
{} (llaves) Permite expandir macros definiciones
Cuando es necesario usar alguno de ellos como texto dentro de la ex-
presión regular se debe utilizar una secuencia de escape o debe estar
entre comillas.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 41 / 50


Analizador Léxico LEX

Especificación de sensitividad al contexto


LEX reconoce una pequeña cantidad del contexto que rodea a una
expresión. Usando los operadores:
pesos ($),
acento circunflejo (^)
y diagonal (/).
Cuando se utiliza el operador ^ al principio de una expresión, la expre-
sión concuerda si se encuentra al principio de una línea o de la entrada.
Lo cual tiene un significado distinto que cuando el mismo operador esta
entre [ ].
Cuando se utiliza el operador $ al final de la expresión coincide solo si
esta al final de la línea, es decir, precedida del salto de línea. De hecho
el operador $ es un caso del operador /.
El operador / especifica el contexto al final (a la derecha). Por ejem-
plo: ab/cd coincide con ab siempre que este precedido de cd. Así ab $
también puede especificarse como ab/\n
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 42 / 50
Analizador Léxico LEX

Operadores de expresiones regulares

Especificación de definiciones y repeticiones El operador llaves ({ })


especifica:
Definición de expansión si entre ellos se incluye el nombre de
un patrón definido anteriormente. Por ejemplo:
digito [0-9] especifica un dígito
{digito}+ especifica cualquier número entero sin signo.
Repeticiones si entre el operador se incluyen números. a{m,n}
especifica que a aparece de m a n veces. Por ejemplo:
a{1,5} busca de una a cinco apariciones de a.
Finalmente el operador porcentaje ( %) se usa especialmente para se-
parar los segmentos del código fuente de LEX.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 43 / 50


Analizador Léxico LEX

Acciones e LEX

Las acciones representan la consecuencia de que el analizador léxico


haya reconocido un determinado lexema correspondiente a un patrón.
Existe una acción por defecto, la cual consiste en copiar la entrada
directamente a la salida.
También se puede ignorar la entrada. Por ejemplo:
[\t \n] ; /*Ignora los tres caracteres para espaciado*/
Cuando se requiere conocer el texto actual de un lexema encontrado
se puede utilizar la variable yytext. Por ejemplo:
[a-zA-Z]+ printf(” %s”,yytext);
Dado que el ejemplo anterior es muy común existe una forma simplifi-
cada de hacer lo mismo utilizando ECHO.
[a-zA-Z]+ ECHO;
Si son necesarias más de una sentencia para especificar las acciones
léxicas deben de usarse llaves ({ })

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 44 / 50


Analizador Léxico LEX

Especificaciones ambiguas.
LEX tiene la capacidad de manejar especificaciones ambiguas de las
siguiente forma:
Se toma la coincidencia más larga
Si se coincide exactamente con dos especificaciones se toma la
que se haya definido primero (ojo con esto).
Si se requiere validar todas las alternativas se utiliza la acción
REJECT, lo cual reajusta adecuadamente el puntero de la entrada
para validar la siguiente alternativa.
Ejemplo (primera aparición)
a[cd]+ ECHO; printf("Primera especificación \n");
a[bc]+ ECHO; printf("Segunda especificación \n");

Ejemplo (cadena más larga)


el num_el++;
ella num_ella++;
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 45 / 50
Analizador Léxico LEX

Especificación de la sensibilidad del contexto


izquierdo

Existen tres formas de tratar este problema. En cada caso, hay órdenes
que reconocen y reflejan la necesidad de cambiar el entorno en el cual
se analiza el texto de entrada.
Uso de flags(banderas)
Se utilizan en el código de la acción léxica.
Prácticamente se libera a LEX del problema. Uso de condiciones
start con órdenes
Es LEX el que se encarga de tratar con la sensibilidad izquierda a
través de condiciones start.
Uso de varios analizadores léxicos funcionando juntos
A veces se da una mayor claridad si se utilizan diferentes
analizadores léxicos y cambiar de uno a otro según se requiera.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 46 / 50


Analizador Léxico LEX

Ejemplo

Ejemplo: Copiar la entrada a la salida sustituyendo la palabra hola por


"primero” cuando la línea donde se encuentre inicie con la letra a, por
"segundo” cuando la línea inicie con la letra b, por "tercero” cuando la
línea inicie con la letra c. Todas las demás palabra y todas la líneas no
varían.

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 47 / 50


Analizador Léxico LEX

Utilizando flags
%{
int flag ="\0";
%}
%%
^a {flag = ”a”; ECHO;}
^b {flag = ”b”; ECHO;}
^c {flag = ”c”; ECHO;}
\n {flag = ”\0”; ECHO;}
hola {switch(flag){
case ’a’:
printf("primero"); flag ="\0"; break;
case ’b’:
printf("segundo"); flag ="\0"; break;
case ’c’:
printf("tercero"); flag ="\0"; break;
default: ECHO; break;
}}
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 48 / 50
Analizador Léxico LEX

Utilizando condiciones Start


%START AA BB CC
%%
^a ECHO; BEGIN AA;
^b ECHO; BEGIN BB;
^c ECHO; BEGIN CC;
\n ECHO; BEGIN 0;
<AA>hola printf("primero");
<BB>hola printf("segundo");
<CC>hola printf("tercero");

M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 49 / 50


Analizador Léxico LEX

Control de errores léxicos


El analizador léxico puede detectar determinados tipos de error:
Símbolo no permitido, es decir, el símbolo no pertenece al
alfabeto del lenguaje fuente.
Identificador mal construido o que excede la longitud máxima
permitida.
Constate numérica mal construida o que excede la longitud
máxima permitida.
Constante literal mal construida.
Pueden existir errores imposibles de detectar
Las palabras reservadas mal escritas se toman como
identificadores
Estos errores puede tratarse de tres formas:
Notificar el error y detener todo análisis
Intentar recuperarse del error y continuar con el análisis
(insertando o eliminando símbolos).
Dejar el error en control del análisis sintáctico
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 50 / 50

También podría gustarte