Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad 1 - 2 - Fases de La Compilacion PDF
Unidad 1 - 2 - Fases de La Compilacion PDF
= sintácticos
id1 +
Id2 * Árbol de sintaxis Abstracta AST
id3 id4
Síntesis o
Generador de código
load id3
Código generado mul id4
add id2
store id1
Los patrones en el diagrama anterior están en un archivo de texto. Son reglas para generar las
secuencias de caracteres que puede representar a un determinado componente léxico
(expresiones regulares, es decir, expresiones que describen un conjunto de cadenas o lexemas),
2
Lexema: Entiéndase en este contexto como una cadena de caracteres que concuerda con un patrón que describe
un componente léxico (valor de cadena). Ej. Lexema: “hola mundo” (incluidas las comillas), Componente léxico:
literal y Patrón: caracteres entre comillas. Sin embargo, en lingüística estrictamente lexema es: “Parte que se
mantiene invariable en todas las palabras de una misma familia; expresa el significado común a toda la familia
y puede coincidir o no con una palabra entera.”Ej. de la familia de palabras: panes, panadería, pancito, etc. El
lexema es pan y el resto son los que se denominan morfemas.
Análisis Léxico
Esta fase de rastreo (o scanner), lee caracteres del programa fuente, identifica lexemas y los
convierte en tokens.
x = a + b; (id,x) (op,=) (id,a) (op,+) (id,b) (pu,;)
Los lexemas son los símbolos terminales de una gramática, es decir, una secuencia de uno o
más caracteres, que según su funcionalidad en un lenguaje, se los pueden clasificar en:
palabras reservadas (void, int, return, etc.)
identificadores (nombres de variables, constantes, funciones, etiquetas, etc.)
operadores (+, -, *, /, etc.)
literales: valores fijos (números enteros, hexadecimales, caracteres, cadenas, etc.)
puntuación (coma, punto, punto y coma, paréntesis)
3
El código fuente tanto de Lex como de Yacc se encuentran en Unix para su compilación y ejecución. En
Windows existen varios clones pero sobresalen dos programas open source análogos, Flex y Bison. Asimismo,
existen herramientas modernas con prestaciones equivalentes como son AntLRx x NetBeans/Eclipse y Ply x
Phyton, PCCTS, DLG, Soucerer, etc.
Una vez comprendido el concepto de analizador léxico, debemos saber que este trabaja bajo
petición del analizador sintáctico, devolviendo un token conforme el analizador sintáctico lo va
necesitando para avanzar en la secuencia. Al analizador léxico se lo suele implementar como
una subrutina del analizador sintáctico. Cuando recibe la “solicitud del siguiente token”, el
analizador léxico lee los caracteres de entrada hasta identificar el lexema y entregar el token.
Análisis Sintáctico
El análisis sintáctico (parser) toma los tokens que le envía el analizador léxico y verifica su
estructura sintáctica, es decir, si con ellos se puede formar una sentencia válida
Expresión de
asignación
Expresión Id = Expresión +
ID (24)
posicion Expresión Id + Expresión *
ID (25)
inicial Expresión Id * Expresión Lit
ID (26)
LIT (27)
inicial
60
Los numeros 24, 25, 26 y 27 hacen referencia a lugares en la tabla de símbolos
Análisis Semántico
En esta fase no explicitada en el gráfico de Fases de la compilación, si estará presente en todos
los compiladores y es de vital importancia, ya que revisa semánticamente a las frases, reúne y
verifica información sobre compatibilidad de tipos, declaraciones repetidas, etc., brindando la
información necesaria a la fase posterior de síntesis o generación de código. En ella se utiliza
el AST determinado por la fase de análisis sintáctico.
Errores de Programación
Se sabe que los programas pueden contener errores de muy diverso tipo. Los errores pueden
ser:
Optimización de código
Se trata en esta fase de mejorar el código, en el sentido de reducir la cantidad de recursos
(tiempo y memoria) necesarios. Algunas optimizaciones son triviales, como por ejemplo hacer
algunas transformaciones directamente en la compilación, en lugar de dejarlo para la ejecución
(sustituir InToReal(60) por 60.0). Otras pueden requerir un trabajo mucho mayor, pero mejorar
significativamente la eficiencia,
normalmente a costa de alejarse
bastante del código original,
como eliminar código inactivo
(inaccesible), eliminar variables
intermedias o dentro de un bucle
a las sentencias independientes
(que no son alteradas por el
bucle) relocalizarlas fuera de
éste. Muchos compiladores permiten elegir el nivel de optimización a realizar o no hacerla.
PL 27 03 90’