You are on page 1of 39

Procesadores de Lenguajes

Ingeniería Técnica superior de Ingeniería Informática


Departamento de Lenguajes y Sistemas informáticos

Análisis semántico I
Traducción dirigida por la
sintaxis

Javier Vélez Reyes


jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informáticos
UNED
Análisis semántico. Traducción dirigida por la sintaxis
Objetivos Generales

Objetivos Generales
› Aprender qué es la semántica de un lenguaje de programación
› Entender cómo funciona la semántica operacional y distinguirla de otros tipos de semántica
› Aprender cómo se inyecta información semántica en una gramática
› Aprender el principio de traducción dirigido por la sintaxis
› Conocer las gramáticas con atributos y las reglas y acciones semánticas
› Aprender a distinguir los diferentes tipos de atributos que existen
› Aprender a construir y analizar grafos de dependencia
› Aprender a identificar compiladores de simple y doble pasada
› Conocer los distintos tipos de formalismos de traducción que existen
› Aprender a especificar definiciones dirigidas por la sintaxis
› Aprender a especificar esquemas de traducción dirigidos por la sintaxis

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Índice

Índice
› Introducción
› Formalismos para la especificación de traducciones
› Definiciones dirigidas por la sintaxis
› Reglas semánticas
› Atributos
› Grafos de dependencia
› Diseño de definiciones dirigidas por la sintaxis
› Gramáticas con atributos por la izquierda
› Esquemas de traducción dirigidas por la sintaxis
› Acciones semánticas
› Atributos
› Diseño de esquemas de traducción
› Traducción dirigida por la sintaxis en la práctica
› Bibliografía

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Tema 2 Tema 3 - 5 Tema 6 - 7 Tema 8 - 9 Tema 10 - 11

Etapa de análisis Etapa de síntesis

While ( a > b ) do
a := a + 1;

Analizador sintáctico

Código intermedio
Analizador léxico

Código final
Analizador
semántico
e·l·i· h·w <WHILE, PR> S
√S LD a t1 0000 0011
WHILE E DO S WHILE E DO S LD b t2 0000 0011
GRT t3 t1 t2 0100 0001
E > E E > E
BRZ t3 L1 … 0100 0000
0001 0010

¿Cómo es el lenguaje? ¿Qué es el lenguaje?


Las dos primeras fases conceptuales de un Las tres fases subsiguientes tratan de dar
compilador atienden a responder la un significado único, preciso y computable
pregunta de cómo es un lenguaje en a cada construcción del lenguaje de
términos de su estructura sintáctica y sus manera que el programador sepa definir
elementos léxicos constituyentes programas semánticamente útiles y
coherentes

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


El análisis sintáctico de un código fuente comprueba que la secuencia de tokens llegada desde el
analizador léxico se corresponde con la esperada de acuerdo a las prescripciones gramaticales y se
obtiene como resultado un árbol de análisis sintáctico. Hemos obtenido por tanto una secuencia
correcta de tokens pero nada sabemos acerca de qué significado intencional subyace a la misma
PROGRAM BubbleSort;

CONST MAX = 100;



Sabemos comprobar que este
TYPE TVector = ARRAY [1..MAX] OF INTEGER;
VAR v: TVector; código fuente corresponde a un
programa en Pascal de acuerdo a
PROCEDURE ReadVector (VAR v : TVector); ... la gramática del lenguaje. Pero,
PROCEDURE Sort (VAR v : TVector, size : INTEGER); ¿que significan la declaración de
VAR i, j, tmp : INTEGER; constantes, tipos, variables,
BEGIN funciones y procedimientos, las
FOR i := size - 1 DOWNTO 1 DO sentencias, expresiones, etc. que
FOR j := 1 TO i DO en él aparecen?
IF (v[j] > v[j + 1]) THEN
BEGIN
tmp := v[j];
v[j] := v[j + 1];
v[j + 1] := tmp;
END;
END;

BEGIN
ReadVector (v);
sort (v, MAX);
END.

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Es necesario definir computacionalmente la semántica de un lenguaje para que el compilador sepa
interpretar cada posible código fuente del mismo. La forma más sencilla de hacer esto es asociar a
cada posible construcción gramatical ciertas reglas que permitan traducirla en términos computables.
Esto sólo es posible si se cumple el principio de traducción dirigido por la sintaxis

Traducción dirigida por la sintaxis

El significado de una construcción de un lenguaje está directamente


relacionado con su estructura sintáctica según se representa en su árbol de
análisis

Es decir, el significado de cada construcción La lectura práctica que debe hacerse de este
gramatical, representada típicamente por un no principio es que para establecer la semántica
terminal, solo debe depender de los elementos de un lenguaje es suficiente con hacerlo sobre
que aparecen en la parte derecha de sus cada una de sus reglas de producción de
reglas de producción manera independiente. Esto a su vez se
consigue estableciendo una traducción de los
DeclaraciónTipo ::= TYPE ID = ARRAY [N..N] elementos de la parte derecha de la regla a
OF Tipo;
una representación con un significado
computable específico

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Es necesario definir computacionalmente la semántica de un lenguaje para que el compilador sepa
interpretar cada posible código fuente del mismo. La forma más sencilla de hacer esto es asociar a
cada posible construcción gramatical ciertas reglas que permitan traducirla en términos computables.
Esto sólo es posible si se cumple el principio de traducción dirigido por la sintaxis

Traducción dirigida por la sintaxis

El significado de una construcción de un lenguaje está directamente


relacionado con su estructura sintáctica según se representa en su árbol de
análisis

Las traducciones con significado computacional especifico a las que antes hacíamos referencia se
pueden clasificar en 2 grandes grupos dependiendo del momento en que se aplican dentro del ciclo de
compilación
Tiempo de compilación (semántica estática)

Las traducciones en tiempo de compilación son acciones que se Tema 7
aplican sobre los artefactos del compilador y que tienen efecto
Tipos de acciones durante el proceso de compilación
de traducción Tiempo de ejecución (semántica dinámica)
semántica

Las traducciones en tiempo de ejecución son acciones dirigidas Tema 8, 9
a generar código ejecutable en tiempo de compilación para que
se apliquen durante la ejecución del programa compilado

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Es necesario definir computacionalmente la semántica de un lenguaje para que el compilador sepa
interpretar cada posible código fuente del mismo. La forma más sencilla de hacer esto es asociar a
cada posible construcción gramatical ciertas reglas que permitan traducirla en términos computables.
Esto sólo es posible si se cumple el principio de traducción dirigido por la sintaxis
Traducción dirigida por la sintaxis
Construcción sintactica Traducción semántica

Tipo Ejemplo Tiempo de compilación Tiempo de ejecución


Declaración de CONST MAX = 100; Registrar MAX como –
constantes constante entera de valor
100
Declaración de TYPE TVector = ARRAY [1..MAX] OF INTEGER; Registrar TVector como tipo –
tipos ARRAY de tamaño 100 y base
INTEGER
Declaración de VAR v : TVector; Comprobar que TVector –
variables existe como un tipo y
registrar v como una variable
de ese tipo
Declaración de PROCEDURE Sort (VAR v : TVector); Registrar Sort como un –
procedimientos procedimiento del ámbito en
curso indicando la lista de
tipos de los parámetros.
Crear un nuevo ámbito y
registrar en él v como
variable de tipo TVector

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Es necesario definir computacionalmente la semántica de un lenguaje para que el compilador sepa
interpretar cada posible código fuente del mismo. La forma más sencilla de hacer esto es asociar a
cada posible construcción gramatical ciertas reglas que permitan traducirla en términos computables.
Esto sólo es posible si se cumple el principio de traducción dirigido por la sintaxis
Traducción dirigida por la sintaxis
Construcción sintactica Traducción semántica

Tipo Ejemplo Tiempo de compilación Tiempo de ejecución


Declaración de Function Sort (VAR v : TVector):INTEGER; Adicionalmente al caso de –
funciones procedimientos registrar que
el tipo de retorno es INTEGER
Expresiones v[j] > v[j + 1] Comprobar que v esta Generar código para
declarado previamente y que recuperar de memoria el
es de tipo TVector. valor de las sub-expresiones
Asegurarse de que las sub- y aplicar la comparación
expresiones son correctas y entre ambos con los
de tipos compatibles con el operadores del lenguaje de
operador mayor que bajo nivel
Sentencia For FOR j := 1 TO i DO Comprobar que la expresión Generar código para
... 1 e i son de tipo INTEGER. inicializar j a 1. Generar
Comprobar que j ha sido código de salto para iterar
previamente declarada como la ejecución del bloque
una variable de tipo INTEGER dentro de FOR i veces.
Generar código para
actualizar a cada paso el
valor de j a j + 1

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Introducción

¿Qué es la semántica de un lenguaje?


Es necesario definir computacionalmente la semántica de un lenguaje para que el compilador sepa
interpretar cada posible código fuente del mismo. La forma más sencilla de hacer esto es asociar a
cada posible construcción gramatical ciertas reglas que permitan traducirla en términos computables.
Esto sólo es posible si se cumple el principio de traducción dirigido por la sintaxis
Traducción dirigida por la sintaxis
Construcción sintactica Traducción semántica

Tipo Ejemplo Tiempo de compilación Tiempo de ejecución


Sentencia If IF (v[j] > v[j + 1]) THEN Comprobar que la expresión Generar código para
BEGIN de comparación es evaluar la expresión
tmp := v[j]; semánticamente correcta durante la ejecución.
v[j] := v[j + 1]; (ver anterior) y comprobar Generar código de salto que
v[j + 1] := tmp; que su evaluación devuelve ejecute el bloque THEN si la
END; un tipo lógico evaluación da TRUE en
ejecución
Sentencia de tmp := v[j]; Comprobar que tmp esta Generar código para
asignación definido. Comprobar que el evaluar el valor de v[j] y
tipo de base de v es copiar su valor en la
compatible con el de tmp posición de memoria
apuntada por tmp
Sentencia de sort (v, MAX); Comprobar que Sort esta Generar código para
llamada a declarado como procedi- gestionar memoria que
procedimiento miento y que el número, permita la activación del
orden y tipo de los procedimiento Sort.
parámetros actuales y Generar código de salto
formales coinciden para su ejecución

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Formalismos para la especificación de traducciones

Especificación de traducciones dirigidas por la sintaxis


Una vez entendido el proceso de traducción dirigida por la sintaxis que nos permite conferir semántica a
las construcciones de un lenguaje, necesitamos mecanismos formales y tecnológicos para especificar
dicha traducción de manera precisa

Formalismos para la especificación de traducciones dirigidas por la sintaxis


I. Definiciones dirigidas por la sintaxis
Las definiciones dirigidas por la sintaxis son un mecanismo de alto nivel R1. E ::= E + E , Rs1
que permite expresar la semántica asociada a las construcciones de un
lenguaje en términos de una colección de reglas semánticas asociadas R2. E ::= n , Rs2
a cada regla de producción gramatical

II. Esquemas de traducción dirigidos por la sintaxis


Los esquemas de traducción dirigidos por la sintaxis permiten insertar, E
entre los símbolos gramaticales de la parte derecha de las reglas de
producción, acciones semánticas cuyo propósito es realizar cierta
E + E {::}
traducción de carácter semántico. La ventaja de esta aproximación es
que aquí se prescribe el momento exacto de la compilación en el que
cada acción es ejecutada n {::} n {::}

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Elementos de las definiciones dirigidas por la sintaxis


Reglas de producción Reglas semánticas

declaracion ::= lVariables : tipo lVariables.tipo := tipo.tipo


lVariables ::= lVariables1 , ID lVariables1.tipo := lVariables.tipo
Subíndice de <<registrar ID como variable de tipo tipo>>
diferenciación
lVariables ::= ID <<registrar ID como variable de tipo tipo>>
tipo ::= INTEGER ; tipo.tipo := “ENTERO”
tipo ::= REAL ; tipo.tipo := “REAL”
atributo

I. Gramática con atributos II. Reglas semánticas


A cada no terminal se asocian un conjunto de Las reglas semánticas se encargan de transferir
atributos para contener determinada información la información de unos atributos a otros y
semántica que será utilizada en otras reglas de aplican acciones de traducción de carácter
producción semántico
declaracion [] lVariables1.tipo := lVariables.tipo
lVariables [tipo] <<registrar ID como variable de tipo tipo>>
tipo [tipo]

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Atributos
Un atributo es un espacio de información con tipificación implícita que sirve
para albergar una característica propia del proceso de traducción y que
puede ser transferida a otras producciones gramaticales para que pueda
ser utilizada desde allí por sus reglas semánticas

I. Atributos sintetizados A.a := f (B.b, C.c, D.D)


Se dice que un atributo es sintetizado si su valor es calculado A a
exclusivamente a partir de atributos de los símbolos gramaticales de la
parte derecha de sus reglas de producción. El carácter sintetizado de un B C D
atributo se mantiene a lo largo de toda la gramática b c d
tipos de
atributos II. Atributos heredados B.b := f (A.a, C.c, D.D)
Se dice que un atributo es heredados si su valor es calculado a partir de A a
atributos de los símbolos gramaticales de las regla de producción en que
aparece o de los antecedentes de las misma. El carácter heredado de B C D
un atributo se mantiene a lo largo de toda la gramática b c d

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Reglas semánticas
Una regla semántica es una expresión formal asociada a una regla de
producción que permite definir la semántica de la construcción gramatical
asociada a la misma en términos de los símbolos de la regla de producción

I. Reglas de ecuaciones de atributos atributo

Las reglas de ecuaciones de atributos se utilizan para copiar, mover o lVariables1.tipo := lVariables.tipo
transformar la información soportada por los atributos asociados a los
símbolos de una regla hacia los atributos asociados a los símbolos no No terminal Terminal o
tipos de terminales de otra u otras reglas. Para concatenar valores de tipo No terminal
reglas cadena se usa el operador ||
semánticas asignación

II. Reglas de acción semántica


Las reglas de acción semántica son instrucciones o pseudo-
insstrucciones que se utilizan para provocar algún efecto semántico <<registrar ID como variable ...>>
sobre la traducción. Dado sus posibles efectos colaterales deben ser
evitadas en la medida de lo posible.

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Grafos de dependencias
Un grafo de dependencias refleja, sobre un árbol de análisis sintáctico las
dependencias entre los atributos gramaticales establecidas en virtud de las
reglas semánticas que les asignan valor

La aplicación de las ecuaciones de atributos de El grafo de dependencias se utiliza para


las reglas semánticas inducen ciertas expresar gráficamente el orden en que deben
dependencias entre los mismos. En efecto, si un ser calculados los atributos y por ende inducen
atributo se calcula a partir de otros, es natural un orden de aplicación de las regla semánticas.
pensar que existe una dependencia del primero En efecto, si un atributo se calcula a partir de
para con los segundos. Esta dependencia se otros es natural pensar que antes de calcular el
dibuja en el grafo como un arco de cada uno de primeros necesario calcular los segundos
los segundos al primero
a A Calcular A.a
Calcular C.c en cualquier
orden
Calcular D.d
B C D
Calcular B.b Calcular después
B.b := f (A.a, C.c, D.D) b c d

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Grafos de dependencias
Un grafo de dependencias refleja, sobre un árbol de análisis sintáctico las
dependencias entre los atributos gramaticales establecidas en virtud de las
reglas semánticas que les asignan valor

Algoritmo de cálculo A.a := f (B.b, C.c, D.D)


a A
Para cada producción A ::= X1 X2 ... Xn
Crear un nodo por cada atributo Xi.aj de cada símbolo
B C D
Para cada regla semántica de la forma Xi.aj = f (... , Xk.al, ...) b c d
Para cada k y cada l
Crear arco desde Xk.al hasta Xi.aj a A

Unir todos los grafos resultantes

B C D
B.b := f (A.a, C.c, D.D) b c d

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Grafos de dependencias
declaracion ::= lVariables : tipo lVariables.tipo := tipo.tipo a, b : INTEGER;
lVariables ::= lVariables1 , ID lVariables1.tipo := lVariables.tipo
lVariables.tipo [Heredado]
<<registrar ID como variable de tipo tipo>> tipo.tipo [sintetizado]
lVariables ::= ID <<registrar ID como variable de tipo tipo>>
tipo ::= INTEGER ; tipo.tipo := “ENTERO”
declaración
tipo ::= REAL ; tipo.tipo := “REAL”

lVariables .tipo : tipo .tipo


El grafo de dependencias pone de  “ENTERO”
manifiesto que para registrar las
variables a y b es necesario recuperar la “ENTERO”
información de tipo extraída de la regla “ENTERO”
tipo ::= INTEGER y moverla sobre el lVariables .tipo , ID INTEGER
árbol de análisis sintáctico hasta las <<registrar ID con tipo>>
reglas con ID. Para ello se utiliza el
atributo tipo en cada no terminal y las
reglas semánticas adjuntas ID
<<registrar ID con tipo>>

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Diseño de definiciones dirigidas por la sintaxis


El diseño de definiciones dirigidas por la sintaxis es un ejercicio complejo que requiere realizarse
cuidadosa y sistemáticamente. A continuación proporcionamos un procedimiento orientativo que
puede ayudar a alcanzar más fácilmente este objetivo

I. Especificación gramatical IV. Selección de atributos


Construya la gramática sobre la cual desea Defina los atributos semánticos que requerirá su
articular la definición dirigida por la sintaxis. definición en cada símbolo gramatical y
Asegúrese de que esta gramática es correcta y caracterícelos como sintetizados o heredados.
no ambigua Esto último se puede postergar para el final
II. Selección de una frase representativa V. Grafo de dependencias
Seleccione una frase del lenguaje. Asegúrese de Dibuje el grafo de dependencias que debería
que es lo suficientemente compleja como para producirse para asegurar que la información
que implique visitar al menos una vez cada regla fluya adecuadamente. Considere siempre un
gramatical procesamiento descendente

III. Construcción del árbol de análisis VI. Especificación de la definición


Construya el árbol de análisis sintáctico asociado Escriba las reglas semánticas necesarias , con el
a dicha frase. Asegúrese de que existe al menos nivel de abstracción oportuno, para garantizar
una instancia de cada regla que se satisface el grafo de dependencias.
Incluya las reglas de acción pertinentes

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Ejemplo
Se pretende construir una calculadora que permita  E.value [Sintetizado]
T.value [Sintetizado]
escribir expresiones aritméticas y calcular su valor
F.value [Sintetizado]
asociado n.value [Sintetizado]

 E ::= E + T | E – T | T  2 + 3 * 5  E ::= E + T E.value := E.value + T.value


T ::= T * F | T / F | F E ::= E – T E.value := E.value - T.value
F ::= ( E ) | n E ::= T E.value := T.value
T ::= T * F T.value := T.value * F.value
E  E .value = 17
 2 T ::= T / F T.value := T.value / F.value
15
T ::= F T.value := F.value
E + T E .value + T .value F ::= ( E ) F.value := E.value

2 3 5 F ::= n F.value := n.value


T T .value
T * F T .value * F .value
2
F F .value 3 5
F n F .value n.value
2
n n .value 3
n n .value

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Ejercicios
A continuación se muestra una gramática de La siguiente gramática representa números
operadores no ambigua. Especifique sobre ella binarios. Defina una DDS que traduzca
una DDS para pasar expresiones aritméticas infijas cualquier binario colocando todos los 0 delante
a notación postfija y todos los 1 detrás. Por ejemplo 01101 se
traduce a 00111
E ::= E + T | E – T | T
T ::= T * F | T / F | F B ::= D B | D

F ::= ( E ) | n D ::= 0 | 1

La siguiente gramática corresponde a la La siguiente gramática se utiliza para


declaración de variables es Pascal. Especifique representar números en octal. Constrúyase una
sobre ella una DDS para traducir dichas DDS para obtener su traducción equivalente en
declaraciones a sintaxis C base 10
declaracion ::= lVariables : tipo N ::= D N | D
lVariables ::= lVariables1 , ID D ::= 0 | 1 | 2 | 3 | 4
lVariables ::= ID 5 | 6 | 7
tipo ::= INTEGER ;
tipo ::= REAL ;

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Gramáticas con atributos por la izquierda


En algunas ocasiones, las definiciones dirigidas por la sintaxis imponen un orden de evaluación de
las reglas semánticas contrario al orden natural en el que el analizador sintáctico va consumiendo
tokens de la cadena de entrada y construyendo el árbol de análisis sintáctico. En concreto el
problema surge cuando aparecen dependencias que fluyen de derecha a izquierda dentro del grafo

declaracion ::= lVariables : tipo


declaración
lVariables ::= lVariables1 , ID
lVariables ::= ID
tipo ::= INTEGER ;
tipo ::= REAL ;
lVariables .tipo : tipo .tipo

a, b : INTEGER; “ENTERO”
“ENTERO”
“ENTERO”
lVariables .tipo , ID INTEGER
<<registrar ID con tipo>>

ID <<registrar ID con tipo>>

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Gramáticas con atributos por la izquierda


Este tipo de definiciones son conflictivas ya que las dependencias de derecha a izquierda exigen
dejar pendiente el cálculo de un atributo y avanzar el procesamiento sintáctico hasta alcanzar la
regla que calcula el atributo del que depende para posteriormente completar el primero en una
segunda pasada. Esto obliga a hacer la siguiente clasificación

I. Traductores de una sola pasada  Gramática C


Los traductores sin dependencias de derecha a izquierda declaración
consiguen articular el cálculo de los atributos semánticos a
medida que construyen el árbol de análisis sintáctico con lo que
generan compiladores eficientes que recorren el árbol una sola tipo .tipo lVariables .tipo
Tipos de vez
traductores
II. Traductores de doble pasada 
Los traductores con dependencias de derecha a izquierda Gramática Pascal
deben postergar el cálculo de algunos atributos hasta que se declaración
conozca el valor de todos aquellos de los que depende. Este
tipo de compiladores deben construir el árbol de análisis
sintáctico y realizar una segunda pasada para calcular los lVariables .tipo : tipo .tipo
atributos pendientes

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Gramáticas con atributos por la izquierda


Los traductores de doble pasada empeoran notablemente el rendimiento del compilador. Por lo tanto
es deseable que las definiciones dirigidas por la sintaxis no presenten dependencias de derecha a
izquierda. De se así pueden aplicarse transformaciones gramaticales para intentar invertir la
polaridad de las dependencias favorablemente
declaración
El árbol de análisis sintáctico ahora no 
fuerza la existencia de dependencias de “ENTERO”
derecha a izquierda puesto que para
procesar la frase de declaración es
prescriptivo alcanzar el tipo ID , declaración .tipo
<<registrar ID con tipo>>
a, b : INTEGER; “ENTERO”

declaracion ::= ID , declaracion1 declaracion.tipo = declaracion1.tipo


<<registrar ID con tipo>> ID : tipo .tipo
declaracion ::= ID : tipo declaracion.tipo = tipo.tipo <<registrar ID con tipo>>
“ENTERO”
<<registrar ID con tipo>>
tipo ::= INTEGER ; tipo.tipo :=“ENTERO” INTEGER
tipo ::= REAL ; tipo.tipo := “REAL”

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Definiciones dirigidas por la sintaxis

Definiciones dirigidas por la sintaxis


Las definiciones dirigidas por la sintaxis (DDS) son un formalismo de alto nivel que permite asociar a
cada regla de producción gramatical una regla semántica descrita, principalmente, en términos de una
transformación de ciertos atributos asociados a cada no terminal de la gramática.

Gramáticas con atributos por la izquierda


Dados los problemas que presentan las dependencias de derecha a izquierda debemos buscar
gramáticas que no induzcan este tipo ordenamiento semántico. A estas gramáticas se les conoce por
el nombre de gramáticas con atributos por la izquierda

Una gramática con atributos por la izquierda es una gramática de atributos


en la que cada atributo heredado Xi.h de una regla de producción de la
forma A ::= X1 … Xi … Xn, solo depende de los atributos X1 a Xi-1 o los
atributos heredados de A

A

La información fluye de arriba abajo, de
de abajo a arriba y de izquierda a
derecha pero nunca de derecha a
izquierda
X1 X2 X3

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Elementos de las traducciones dirigidas por la sintaxis


Reglas de producción
Subíndice de diferenciación
E ::= T {: E’.trad := T.trad :} E’ {: E.trad := E’.trad :}
E’ ::= + T {: E’1.trad := E’.trad || T.trad || “+” :} E’1 {: E’.trad := E’1.trad :}
E’ ::= - T {: E’1.trad := E’.trad || T.trad || “-” :} E’1 {: E’.trad := E’1.trad :}
E’ ::= ε {: E’.trad := E’.trad :}
Acción semántica
T ::= num {: T.trad := num.lexema :}
Atributo

I. Gramática con atributos II. Acciones semánticas


Como en las definiciones dirigidas por la sintaxis, Las acciones semánticas se insertan entre los
los esquemas de traducción también se símbolos gramaticales de la parte derecha de
construyen sobre gramáticas con atributos cada regla y, cuando se visitan durante la
construcción del árbol de análisis sintáctico,
E [trad]
realizan los traducciones semánticas pertinentes
E’ [trad]
T [trad] E ::= T {: E’.trad := T.trad :}

num [lexema] E’ {: E.trad := E’.trad :}

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Atributos
Un atributo es un espacio de información con tipificación explícita que sirve
para albergar una característica propia del proceso de traducción y que
puede ser transferida a otras producciones gramaticales para que pueda
ser utilizada desde allí por sus reglas semánticas

I. Atributos sintetizados A.a := f (B.b, C.c, D.D)


Se dice que un atributo es sintetizado si su valor es calculado A a
exclusivamente a partir de atributos de los símbolos gramaticales de la
parte derecha de sus reglas de producción. El carácter sintetizado de un B C D
atributo se mantiene a lo largo de toda la gramática b c d
tipos de
atributos II. Atributos heredados B.b := f (A.a, C.c, D.D)
Se dice que un atributo es heredados si su valor es calculado a partir de A a
atributos de los símbolos gramaticales de las regla de producción en que
aparece o de los antecedentes de las misma. El carácter heredado de B C D
un atributo se mantiene a lo largo de toda la gramática b c d

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Acción semántica
Una acción semántica es un fragmento de código ejecutable, insertado en
algún punto de la parte derecha de una regla de producción, encargado de
realizar cierta lógica de traducción a partir de la información soportada por
los atributos de los símbolos gramaticales de dicha regla

E ::= T {: E’.trad := T.trad :} E’ {: E.trad := E’.trad :}



Cada acción semántica se inserta El contenido de la acción se Como en las DDS, las acciones
en el lugar adecuado para que expresa, frecuentemente, en el semánticas frecuentemente
sea ejecutada en el momento lenguaje de programación realizan operaciones de
preciso durante la construcción anfitrión del compilador que se manipulación de atributos pero
del árbol de análisis sintáctico está construyendo también puede llevar acabo
operaciones con potenciales
efectos colaterales

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Diseño de traducciones dirigidas por la sintaxis


Antes de dar un procedimiento orientativo para la construcción de esquemas de traducción dirigidos
por la sintaxis es preciso conocer ciertas restricciones de diseño de los mismos relacionadas con el
lugar adecuado donde deben ubicarse las acciones semánticas

 Si existen atributos sintetizados  Si existen atributos heredados deben


colocar la acción semántica después calcularse antes de que aparezca el
de todos los símbolos implicados o al símbolo en la parte derecha
final de la producción
A := B C {: A.a := f (B.a, C.a) :} D A := B C {: D.h := f (B.a, C.a) :} D
A:= B C D {: A.a := f (B.a, C.a) :}

 Un atributo sintetizado no debe  Si existen acciones con efectos


usarse antes de que aparezca el laterales deben situarse en el punto
símbolo en la parte derecha exacto de la parte derecha de la regla
en la que deberían evaluarse. Hay que
A := B {: A.s := f (B.s, C.s) :} C D
verificar que no utilizan atributos de
A := B C {: A.s := f (B.s, C.s) :} D símbolos situados a la derecha de
dicho punto

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Diseño de traducciones dirigidas por la sintaxis


El diseño de esquemas de traducción dirigidos por la sintaxis es un ejercicio complejo que requiere
realizarse cuidadosa y sistemáticamente. A continuación proporcionamos un procedimiento
orientativo que puede ayudar a alcanzar más fácilmente este objetivo

I. Especificación gramatical IV. Selección de atributos


Construya la gramática sobre la cual desea Defina los atributos que requerirá su esquema
articular la traducción dirigida por la sintaxis. de traducción en cada símbolo gramatical y
Asegúrese de que esta gramática es correcta y caracterícelos como sintetizados o heredados.
no ambigua Esto último se puede postergar para el final
II. Selección de una frase representativa V. Grafo de dependencias
Seleccione una frase del lenguaje. Asegúrese de Dibuje el grafo de dependencias que debería
que es lo suficientemente compleja como para producirse para asegurar que la información
que implique visitar al menos una vez cada regla fluya adecuadamente. Considere siempre un
gramatical procesamiento descendente

III. Construcción del árbol de análisis VI. Especificación de la traducción


Construya el árbol de análisis sintáctico asociado Escriba la traducción dirigida por la sintaxis
a dicha frase. Asegúrese de que existe al menos ubicando las acciones semánticas de acuerdo a
una instancia de cada regla las restricciones de diseño preliminares

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Esquemas de traducción dirigidos por la sintaxis

Esquemas de traducción dirigidos por la sintaxis


Las definiciones dirigidas por la sintaxis son formalismos abstractos de traducción de alto nivel y por
tanto adolecen de un mecanismo para indica el momento exacto en el que cada regla semántica debe
ejecutarse. Una versión computacional que soluciona este problema son los esquemas de traducción
dirigidos por la sintaxis

Ejemplo
E

T {: E’.trad := ‘9’ :} E’ {: E.trad := ‘9 5 – 2 +’ :}

num {: T.trad := ‘9’ :} - T {: E’1.trad := ‘9 5 -’ :} E’ {: E’.trad := ‘9 5 – 2 +’ :}


(9)

num {: T.trad := ‘5’ :} + T {: E’1.trad := ‘9 5 – 2 +’ :} E’ {: E’.trad := ‘9 5 – 2 +’ :}


(5)

num {: T.trad := ‘2’ :}


ε {: E’.trad := ‘9 5 – 2 +’ :}
(2)

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Implementación de clases No Terminales


La implementación de esquemas de traducción en cup parte de la implementación de una clase para
cada no terminal. Estas clases son contenedores para los atributos semánticos que serán utilizados
posteriormente
I. Construcción de la clase public Expresion extends NonTerminal {

Para implementar la clase asociada a cada no ...

terminal recomendamos que se utilice el mismo }


nombre que se usó para nombrarlo en cup,
eliminando caracteres extraños y siguiendo los
criterios de nombrado de Java. Si lo cree
conveniente créese un script para automatizar
la construcción de estas clases con un
esqueleto vacío. Además considere la
posibilidad de extender de una clase base para
factorizar cierto código común a todas las
clases de no terminales

Todas estas clases deben implementarse en el


paquete nonTerminal

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Implementación de clases No Terminales


La implementación de esquemas de traducción en cup parte de la implementación de una clase para
cada no terminal. Estas clases son contenedores para los atributos semánticos que serán utilizados
posteriormente
II. Implementación de constructores public Expresion extends NonTerminal {

Incluya en cada clase tantos constructores ...

como resulten necesarios. Recomendamos


definir un constructor por defecto sin public Expresion () { ... }
argumentos y otros que reciban como public Expresion (Expresion e) {...}
argumentos otras clases de no terminales public Expresion (Expresion left,
necesarias, de acuerdo al análisis de Expresion right) {...}
dependencias del esquema de traducción
}
dirigido por la sintaxis

Considere la posibilidad de centralizar la lógica


común de cada constructor en uno de los
constructores de manera que el resto delegue
en ellos

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Implementación de clases No Terminales


La implementación de esquemas de traducción en cup parte de la implementación de una clase para
cada no terminal. Estas clases son contenedores para los atributos semánticos que serán utilizados
posteriormente
III. Implementación atributos public Expresion extends NonTerminal {

Declare como variables privadas de clase cada List<QuadrupleIF> code;

uno de los atributos que contendrá el no TypeIF type;


terminal de la clase que está implementando. TemporalIF temporal;
Para cada atributo implemente dos métodos de ...
acceso público. una operación consultora con
prefijo get y otra modificadora con prefijo set. public List<QuadrupleIF> getCode () {...}
public void setCode (List<QuadrupleIF> code) {...}
Considere esta tarea como un proceso de
public TypeIF getType() {...}
refinamiento sucesivo que se irá completando
cuando tenga claro qué atributos es necesario public void setType (TypeIF type) {...}

incluir en cada clase no terminal a tenor del public TemporalIF getTemporal () {...}
esquema de traducción que está articulando public void setTemporal (TemporalIF temporal) {...}
...
}

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Implementación de clases No Terminales


La implementación de esquemas de traducción en cup parte de la implementación de una clase para
cada no terminal. Estas clases son contenedores para los atributos semánticos que serán utilizados
posteriormente
IV. Sobrescritura de métodos de Object public Expresion extends NonTerminal {

Java impone, normativamente, que la imple- ...

mentación de cualquier clase debe incluir la long hashcode () {


sobreescritura de 3 métodos: hashcode, para return 67 * 67 * code.hashcode() +
devolver una representación numérica única del 67 * type.hashcode() + temporal.hascode();
objeto; equals, para comparar un objeto con }
otro y toString para devolver una cadena que boolean equals (Object o) {
contenga inforrmación sobre el estado del
if (!(o instanceof Expresion)) return false;
problema.
else { Expression e = (Expresion) o;

Recomendamos encarecidamente la return e.code.equals(this.code) &&

implementación de estos tres métodos puesto e.type.equals(this.type) &&


que puede simplificar considerablemente la e.temporal.equals(this.temporal); }
construcción del compiladores en fases }
subsiguientes public String toString () {...}
}

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Tipificación de No Terminales en cup


Se incluye el
nombre de la
clase entre
nonTerminal y
el nombre del
no terminal.
Asegúrese de
haber importado
nonTerminal

Una vez construidas todas las clases de los no terminales que


conforman nuestra especificación gramatical en cup, es
necesario indicar a esta herramienta que, durante el proceso de
construcción del árbol de análisis sintáctico, debe considerar
cada no terminal como un objeto de la clase correspondiente.
Esto se hace alterando la sección de declaración de no
terminales mediante su tipificación

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Consúltese el documento
Esquemas de traducción en la práctica directrices de implementación

El siguiente paso para construir el compilador es articular en cup un esquema de traducción dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuación damos la
secuencia de pasos que deben realizarse

Implementación del esquema de traducción en cup


En cup, la implementación de esquemas de traducción dirigidos por la sintaxis permite utilizar
solamente atributos sintetizados. Cada regla de producción debe tener una acción semántica que
construya un objeto de la clase no terminal del antecedente, asigne valor a sus atributos, y, como
última instrucción, lo asigne a RESULT. Esto hará que dicho objeto se copie al no terminal del
antecedente para que sea consultado en otras reglas
Nombramiento de símbolos gramaticales

expresion ::= expresion:e1 MAS expresion:e2 Uso de constructor


{: Expresion e = new Expresion (e1, e2);
<<comprobación de tipos sobre e1 y e2>>
<<generación de código para e1 + e2>> Acciones semánticas
...
RESULT = e; :}

Asignación de reducción
Al hacer esta asignación el objeto en la expresión de la parte derecha del
igual se asigna como contenedor de información del no terminal del
antecedente. Asegúrese de que el tipo de esta expresión es compatible
con el declarado en la sección de no terminales para el antecedente

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Traducción dirigida por la sintaxis en la práctica

Desarrollo paso a paso


La construcción de esta fase del compilador consiste en la preparación de la infraestructura de
artefactos necesaria para articular los esquemas de traducción dirigida por la sintaxis tal y como se ha
descrito con anterioridad. A continuación damos un generación de los pasos principales a dar

1. Implementación de las clases java que representan los no terminales


1. Hacerlos heredar de la clase NonTerminal Los atributos de los no
2. Implementar constructores y constructores por copia terminales aún no son
conocidos por lo tanto es
3. Sobrescribir métodos heredados de la clase Object imposible implementar sus
métodos de acceso
4. Considere la posibilidad de automatizar el proceso con script
2. Tipificación de cada no terminal en Cup
1. Declare el tipo – clase java – de cada no terminal de cup
2. Considere la posibilidad de hacer jerarquías de clases
3. Pruebe a implementar algún esquema de traducción sencillo de prueba
1. Implemente una prueba para comprobar la propagación de información en cup
2. Tenga en cuenta siempre que cada acción introducida semánticas pueden generar nuevos conflictos

En Cup A ::= B {: <<acción>> :} C se traduce a


A ::= B M C; M ::= {:<<acción>>:} lo cual puede
llegar a generar nuevos conflictos en
ocasiones

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Bibliografía

Material de estudio
Bibliografía básica

Construcción de compiladores: principios y práctica


Kenneth C. Louden International Thomson Editores,
2004 ISBN 970-686-299-4

Javier Vélez Reyes jvelez@lsi.uned.es


Análisis semántico. Traducción dirigida por la sintaxis
Bibliografía

Material de estudio
Bibliografía complementaria

Compiladores: Principios, técnicas y herramientas.


Segunda Edición Aho, Lam, Sethi, Ullman
Addison – Wesley, Pearson Educación, México 2008

Diseño de compiladores. A. Garrido, J. Iñesta, F. Moreno


y J. Pérez. 2002. Edita Universidad de Alicante

Javier Vélez Reyes jvelez@lsi.uned.es

You might also like