Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Semana 1 PDF
Semana 1 PDF
Correo:
◦ jgomez@steperu.com
◦ jgomez@unitru.edu.pe
Horario de Consultas
◦ Jueves 4 – 5 pm
Generación del
código
Manejo de tabla
• Tabla de símbolos
• Tabla de literales Manejo de
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
Por ejemplo: muchos compiladores son “controlados por el analizador gramatical” (parsing) que significa que
el analizador sintáctico recurre al analizador lexicográfico, en vez de que el analizador lexicográfico complete la
tarea antes de que comience el analizador sintáctico.
Esquema:
Manejo de tabla
• Tabla de símbolos
• Tabla de literales
• Tabla de ciclos iterativos
Análisis • Tabla de representación intermedia
sintáctico
Análisis (gramatical)
Manejo de Preparación para
Errores
lexicográfico
a la generación
(rastreo)
Análisis E/S
semántico
Generación
Optimización del código
EJEMPLO: Un problema simple de compilador
Compilador ?
Análisis
? Análisis sintáctico
? ? ? Preparación para
? Generación del
lexicográfico Análisis semántico Optimización la generación del
(gramatical) código
(rastreo) código
X1= a + bb*12;
X2= a/2 + bb*12;
Primera fase: Análisis lexicográfico
Análisis Análisis Preparación para
Análisis
lexicográfico sintáctico Optimización la generación del
semántico
(rastreo) (gramatical) código
TOKENS
Generación del
código
Manejo de tabla
• Tabla de símbolos
Manejo de
• Tabla de literales
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
El análisis lexicográfico, también conocido como rastreo o en ocasiones rastreo y filtrado o incluso menos
formalmente, lexicografía o reconocimiento de componentes léxicas (tokenizing), agrupa secuencias de
caracteres desde el programa fuente de entrada en unidades llamadas componentes léxicas o tokens.
ARBOL DE ANALISIS
TOKENS GRAMATICAL
Generación del
código
Manejo de tabla
• Tabla de símbolos
Manejo de
• Tabla de literales
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
El análisis sintáctico es más complejo que el análisis lexicográfico. El análisis sintáctico o fase gramatical de un
compilador, agrupa los tokens en estructuras sintácticas en forma muy similar a como teníamos que
estructurar las oraciones (prim.)
bb * 12 consta de 3 tokens “bb” “*” “12” se agrupa en la estructura: ”expresión”
X1= a + bb * 12 consta de ? Tokens “…..” se agrupa en “sentencia de asignación”
que existe una “expresión”
En el proceso de encontrar la estructura sintáctica, la fase de sintaxis también determina si la secuencia de
tokens es sintácticamente correcta, de acuerdo con la definición del lenguaje.
Las estructura reconocida por el análisis sintáctico se describe en forma semejante a un árbol conocido como
árbol sintáctico, árbol gramatical o árbol de estructura.
X1= a + bb*12;
X2= a/2 + bb*12;
ANALISIS SEMANTICO
Análisis Análisis Preparación para
Análisis
lexicográfico sintáctico Optimización la generación del
semántico
(rastreo) (gramatical) código
ARBOL DE ANALISIS
TOKENS GRAMATICAL
RI
Generación del
código
Manejo de tabla
• Tabla de símbolos
Manejo de
• Tabla de literales
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
El análisis semántico toma como entrada el árbol del análisis gramatical, determinando el significado
(semántica) del programa mediante la creación de tablas de símbolos, verificando cuáles de las variables
utilizadas han sido definidas.
2 tareas principales: Verificación estática / generación de una representación intermedia (RI)
Verificación estática
Completa el análisis iniciado por el analizador gramatical y efectúa actividades como la afirmación de que una
variable con valor de carácter no haya sido asignada a una variable declarada con valor entero. Verificación
de tipos.
Ejemplo: ¿Es correcta la expresión a*b + c?
Rpta: ????
Otra verificación estática es la dimensión de un arreglo (o vector): en un arreglo declarado como bidimensional
no puede utilizarse con 3 índices.
X + < =
X 1 A B X +
X 1
EJERCICIO: Construir el árbol abstracto
X1= a + bb*12;
X2= a/2 + bb*12;
RESULTADO
- Las expresiones se unen en un punto. (;)
- La prioridad basada en los operadores según las expresiones.
- Constantes (literales como operadores pueden estar en el mismo
Nivel, pero con diferente expresión.
OPTIMIZACION
Análisis Análisis Preparación para
Análisis
lexicográfico sintáctico Optimización la generación del
semántico
(rastreo) (gramatical) código
ARBOL DE ANALISIS
RI -
TOKENS GRAMATICAL
RI AlteradaGeneración del
código
Manejo de tabla
• Tabla de símbolos
Manejo de
• Tabla de literales
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
La fase de optimización cambia la representación intermedia de modo que la fase final de generación de
código producirá código que se ejecutará más rápido u ocupará menos espacio (o ambas cosas).
Tipos de Optimización:
- Optimizaciones locales que realizan dentro de una sentencia o grupos de sentencia
- Optimizaciones de ciclos iterativos que se realizan dentro de los ciclos.
- Optimizaciones globales que son efectuadas sobre todo un programa o procedimiento
- Optimizaciones “de mirilla” (aquellas que se realizan después de que el código es seleccionado “atisbando”
por una pequeña secuencia de código)
Propagación constante (Optimización local)
X=3; ………. A = B + X; En ensamblador es:
.
Mueve #3, X; Mueve la constante 3 a X.
= = .
. Acarreo de memoria
X 3 A + .
Suma X,B,A; Suma X a B y se almacena en A
B X
Reemplazo de contenido a 3
Eliminación de sub-expresiones comunes (Op. Local)
A = B * C; …… D = B * C;
Suponga que un algoritmo ha determinado que la segunda sentencia se ejecuta siempre si la primera está
presente y que no se ha hecho ningún cambio a B y C entre las 2 sentencias.
Un algoritmo para eliminación de sub-expresiones comunes debe cambiar a:
T = B * C; A = T; ………… D = T;
X1= a + bb*12;
X2= a/2 + bb*12;
EL RI mejorado?
Optimización
PREPARACION PARA LA GENERACION DE CODIGO
Análisis Análisis Preparación para
Análisis
lexicográfico sintáctico Optimización la generación del
(rastreo) (gramatical)
semántico
código
Asignación
de
memoria y
Generación del registros
código
Manejo de tabla
• Tabla de símbolos
Manejo de
• Tabla de literales
errores
E/S
• Tabla de ciclos iterativos
• Tabla de representación
intermedia
Cuando se ejecuta un programa, los valores para sus variables y expresiones se almacenan en la memoria y los
registros.
El compilador decide muchas de las cuestiones acerca de dónde residirán estos valores. 2 de las cuestiones en
la preparación de la generación del código son, entonces, la asignación de memoria y la asignación de
registros.
Asignación de memoria / registros (P. Gen. de código)
La asignación y el mantenimiento de espacio en memoria para conversar los valores de las variables y
expresiones se conoce como asignación de memoria.
Uno de los dilemas en la asignación de memoria es si la memoria debe ser asignada en forma estática, esto es,
fijada en tiempo de compilación o si el almacenamiento puede estar en una pila cuyo tamaño cambia a medida
que se ejecuta el programa.
Los registros se utilizan para conversar los valores de las variables y expresiones. Los programas se ejecutan
más rápido cuando las operaciones se efectúan sobre datos en registros que sí están en la memoria.
Por tanto el compilador tratará de conversar los valores que son accesados con mayor frecuencia en registros.
Determinar cuáles valores conservar en registros es una tarea tediosa.
EJEMPLO
Memoria de pila
a a
Preparación para Tope bb
la generación del de Pila Direccion de X1
código Direccion de X2
Registros
Registro 1 bb*12
Registro 2 a, a/2
…