Cognitive Science">
Unidad Ii - Compiladores
Unidad Ii - Compiladores
Unidad Ii - Compiladores
VICERRECTORADO ACADÉMICO
FACULTAD DE INGENIERÍA
ESCUELA DE COMPUTACIÓN
COMPILADORES
UNIDAD II
AUTORES:
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, e l 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.
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.
2. Cadenas y lenguajes:
Una cadena sobre algún alfabeto es una secuencia finita de símbolos tomados de ese
alfabeto. En teoría del lenguaje, los términos frase y palabra a menudo se utilizan como
sinónimos del término "cadena". La longitud de una cadena s, que suele escribirse lsl, es el
número de apariciones de símbolos en s. Por ejemplo, camino es una cadena de longitud
seis. La cadena vacía, representada por Є, es una cadena especial de longitud cero.
3. Expresiones regulares:
Son una forma de especificar patrones, entendiendo por patrón la forma de escribir cadena
de caracteres. Es la forma de definir los tokens o componentes léxicos.
4. Definiciones regulares:
Por conveniencia de notación, puede ser deseable dar nombres a las expresiones regulares
y definir expresiones regulares utilizando dichos nombres como si fueran símbolos.
Si ∑ es un alfabeto de símbolos básicos, entonces una definición regular es una secuencia
de definiciones de la forma:
d1->r1
d2->r2
…
dn->rn
Donde cada d1 es un nombre distinto, y cada r1 es una expresión regular sobre los símbolos
de∑ U {d1, d2, … , d1_1}, por ejemplo, los símbolos básicos y los nombres 4 previamente
definidos. Al limitar cada r1 a los símbolos de ∑ y a los nombres previamente definidos,
se puede construir una expresión regular en ∑ para cualquier r1, reemplazando una y otra
vez los nombres de las expresiones regulares por las expresiones que designan. Si r1
utilizara d¡ para alguna j≥ i, entonces ri se podría definir recursivamente y este proceso de
sustitución no tendría fin. Para distinguir los nombres de los símbolos, se imprimen en
negritas los nombres de las definiciones regulares.
5. Diagrama de transición:
Se utiliza un diagrama de transición para localizar la información sobre los caracteres que
se detectan a medida que el apuntador delantero examina la entrada. Esto se hace
cambiando de posición en el diagrama según se leen los caracteres.
6. Autómatas finitos:
7. Errores léxicos:
Los errores léxicos se detectan cuando el analizador léxico intenta reconocer componentes
léxicos y la cadena de caracteres de la entrada no encaja con ningún patrón. Son situaciones
en las que usa un carácter inválido (@, $,",>,...), que no pertenece al vocabulario del
lenguaje de programación, al escribir mal un identificador, palabra reservada u operador.
8. Analizador Sintáctico:
9. Tipos de analizadores:
Hay básicamente dos métodos de análisis diferentes, análisis de arriba hacia abajo (top-
down) y análisis de abajo hacia arriba (bottom-up). Éstos difieren generalmente en el orden
en el que se crean los elementos del árbol sintáctico.
● Ambigüedad: Una gramática G es ambigua cuando tiene mas de un arbol de parseo (ya
sea por la izquierda o por la derecha) para al menos una cadena de entrada.
● Escritura de una gramática: Toda construcción que se pueda describir mediante una
expresión regular también se puede describir por medio de una gramática, por lo tanto todo
conjunto regular es un lenguaje independiente de contexto.
Las reglas de sintaxis de un lenguaje a menudo son bastante sencillas, y para describirlas
no se necesita una notación tan poderosa como las gramáticas, por ello se utilizan reglas
de sintaxis de gramáticas para que se proporcione una notación más concisa y más fácil de
entender para los componentes léxicos y al mismo tiempo separar la estructura sintáctica
de un lenguaje en partes léxicas y no léxicas proporciona una forma conveniente de
modular la etapa inicial de un compilador en dos componentes de tamaño razonable y
además describir estructuras anidadas, estructuras de control, etc.
Indicar los errores de forma clara y precisa. Debe informar mediante los
correspondientes mensajes del tipo de error y su localización.
Además, si el propio compilador está preparado para admitir incluso los errores más
frecuentes, entonces se puede mejorar la respuesta ante esos errores incluso corrigiéndolos.