Documentos de Académico
Documentos de Profesional
Documentos de Cultura
De esta forma definimos la estructura que tendría cualquier programa escrito en ese
lenguaje de programación elegido. Una vez hemos validado la estructura del
programa, y para poder realizar determinados controles semánticos necesitamos
utilizar información, representada por los atributos, que asociamos a los símbolos
terminales y no terminales de la gramática que hemos establecido para ese lenguaje.
Estas gramáticas se denominan gramáticas de atributos
Fijación
Los atributos que pueden fijarse antes de la ejecución, o lo que es lo mismo en
tiempo de compilación, se denominan estáticos, mientras que los que pueden
fijarse solo durante la ejecución se denominan dinámicos.
Reglas semánticas
Reglas semánticas
Para cada atributo es necesario especificar el conjunto de valores que este puede tomar y a
esto se le denomina dominio del atributo, así como una descripción del mismo
Ejemplo de regla semántica
Considerando la gramática, la acción semántica que queremos realizar es obtener el valor de
la siguiente operación: 5 + 9*4. Por tanto el atributo que nos interesa es valor.
Reglas semánticas
También se denomina a las reglas semánticas ecuaciones de atributos, aunque una regla
semántica puede estar constituida por una o varias ecuaciones de atributos.
Atributos sintetizados vs heredados
La evaluación de los atributos basados en reglas depende de la forma de recorrer el árbol de
análisis
La elección del tipo de atributo es importante desde el punto de vista de diseño del
compilador.
Árbol de análisis
Una gramática en la que todos los atributos son sintetizados se conoce como gramática con
atributos S(S-gramáticas).
-La máquina objeto se extrae a una máquina virtual. Esto nos sirve para separar las operaciones de alto nivel de
las que son de bajo nivel.
-Al ser más abstracto las rutinas que se utilizan para optimizar el código se vuelven más simples
Existen dos representaciones intermedias principales:
●Notación sufija
●Cuádruplas
Además, un árbol sintáctico puede representarse en forma de tuplas de n elementos, de la forma (operador,
operando-1, ..., operando-k, nombre). Las tuplas pueden tener longitud variable o fija . Las más típicas son las
cuádruplas, aunque éstas pueden representarse también en forma de tripletes.
Notación sufija
Llamada también postfija o polaca inversa, se usa para representar expresiones sin necesidad de paréntesis.
Ejemplos:
a*b ab*
Los identificadores aparecen en el mismo orden. Los operadores en el de evaluación (de izquierda a
derecha).
Ejercicios.
1.- a*(b+c/d)
2.- a*b+c*d
Código de tres direcciones
En el código de tres direcciones, hay máximo un operador en el lado derecho de una instrucción; es
decir, no se permiten expresiones aritméticas acumuladas. Por ende, una expresión del lenguaje fuente
como x+y*z podría traducirse en la siguiente secuencia de instrucciones de tres direcciones:
t1 = y * z
t2 = x + t1
de orientación a objetos, estos conceptos corresponden a las clases y los diversos tipos de direcciones
Forma de código intermedio de tres direcciones donde el resultado de una operación se escribe dentro del código.
Las variables temporales se tienen que introducir dentro de la tabla de símbolos
1 / b c t1
2 * a t1 t2
3 + t2 d t3
4 = t3 c
Ejemplo pizarrón
a*b+c*d Operador Operando 1 Operando 2 Resultado
3
Triples
Aquí el resultado de una operación está implícito y se representa por medio de una referencia a una
declaración
Los números entre paréntesis representan apuntadores a la misma estructura de las tripletas.
Ejemplo: a*b+c*d
(1) * a b
(2) * c d
= t3
Ejemplo pizarrón
http://www.cartagena99.com/recursos/alumnos/apuntes/ININF2_M4_U5_T1.pdf
Compiladores principios, técnicas y herramientas, Alfred V. Aho Monica S., Segunda edición, Pearson