(1/8)
Fases del compilador:
(2/8)
Manejador de tablas de símbolos
Guarda símbolos que los analizadores no manejan (por ejemplo los tipos de los parámetros)
Manejador de errores
Como su nombre indica, maneja errores de redacción del programa
(3/8)
Analizador léxico (scanning)
Analizador sintáctico (parsing)
(4/8)
Analizador semántico
Revisa errores semánticos (el más común es revisión de tipos)
Creador de código intermedio
Crea instrucciones intermedias para el generador de código
Esas instrucciones suelen tener un número limitado de operandos
En el caso de tener 3 operandos máximos, se conoce como código de tres direcciones
(5/8)
Optimizador de código
Hace que el código de arriba sea más eficiente
Generador de código
Convierte el código intermedio a código máquina
(6/8)
Gramática libre de contexto
Consiste de 4 componentes:
(7/8)
Ejemplo (del libro):
Lista -> Lista + Dígito
Lista -> Lista - Dígito
Lista -> Dígito
(los tres de arriba pueden ser también agrupados como Lista -> Dígito | Lista + Dígito | Lista - Dígito )
Dígito -> 0|1|2|3|4|5|6|7|8|9
Los tokens serían
0 1 2 3 4 5 6 7 8 9 + -
Los no-terminales serían
Lista, Dígito
(8/8)
Ambigüedad
Es posible si hay más de una forma de definir un árbol jerárquico dado
Ejemplo (del libro):
Si unificáramos Lista con Dígito y las denomináramos Hilera,
Hilera -> Hilera + Hilera | Hilera - Hilera | 0|1|2|3|4|5|6|7|8|9
Pero eso validaría que (9-5)+2 = 9-(5+2)