Está en la página 1de 36

FACULTAD DE INGENIERIA

UNIDAD ACADEMICA SANTA CRUZ

Facultad de Ingeniería

Ingeniería de Sistemas

SEXTO SEMESTRE

SYLLABUS DE LA ASIGNATURA
DISEÑO Y DESARROLLO DE COMPILADORES

Elaborado por: Ing. Ana Brigida Lima Loayza

Gestión Académica II/2006

U N I V E R S I D A D D E A Q U I N O B O L I V I A
1
FACULTAD DE INGENIERIA

VISION DE LA UNIVERSIDAD

Ser la Universidad líder en calidad educativa.

MISION DE LA UNIVERSIDAD

Desarrollar la Educación Superior Universitaria con calidad y


Competitividad al servicio de la sociedad.

Estimado (a) alumno (a);


La Universidad de Aquino Bolivia te brinda a través del Syllabus, la oportunidad de
contar con una compilación de materiales que te serán de mucha utilidad en el desarrollo
de la asignatura. Consérvalo y aplícalo según las instrucciones del docente.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
2
FACULTAD DE INGENIERIA

SYLLABUS UNIDAD II: DISEÑO DE UN COMPILADOR.

TEMA 2. Análisis Léxico.


Diseño y Desarrollo de
Asignatura:
Compiladores
2.1. Función del analizador léxico.
Código: CMP – 515
2.2. Especificaciones de los componentes
Requisito: CMP – 417 léxicos.
80 horas Teórico 2.3. Cadenas y lenguajes
Carga Horaria:
Prácticas 2.4. Operaciones aplicadas a lenguajes
Créditos: 4 2.5. Expresiones Regulares
2.6. Definiciones Regulares
2.7. Reconocimiento de componentes
I. OBJETIVOS GENERALES DE LA léxicos
ASIGNATURA. 2.8. Diagramas de transiciones
 Comparar las ventajas y desventajas de 2.9. Implantación de un diagrama de
los compiladores e interpretes transiciones
 Identificar las distintas fases lógicas de 2.10. Atributos de los Tokens
compiladores e intérpretes
 Describir las fases de un compilador TEMA 3. Análisis Sintáctico.
 Diseñar y desarrollar compiladores a
través del tratamiento de cadenas a partir 3.1. El papel del analizador sintáctico
de gramáticas y autómatas 3.2. Gramáticas Independientes del
 Implementar un compilador para un contexto
lenguaje de programación sencillo. 3.3. Terminología de los BNF
3.4. Árboles de análisis sintáctico
II. PROGRAMA ANALÍTICO DE LA 3.5. Estructura de una gramática
ASIGNATURA. 3.5.1. Supresión de la
ambigüedad
3.5.2. Factor común a la
UNIDAD I: INTRODUCCION A LA izquierda
COMPILACION. 3.5.3. Recursión a izquierda
3.5.4. Eliminación de la recursión
TEMA 1. Conceptos Básicos. por la izquierda

1.1. Esquema general de un compilador TEMA 4. Análisis Semántica.


1.2. Objetivo de un compilador
1.3. Entorno de un compilador 4.1. Función del analizador semántico
1.4. Estructura de un compilador 4.2. Tabla de símbolos
1.5. Fases de un compilador 4.2.1. Función
1.5.1. Análisis Léxico 4.2.2. Características
1.5.2. Análisis Sintáctico 4.2.3. Contenido
1.5.3. Análisis semántica 4.2.4. Estructura
1.5.4. Generación de código 4.2.5. Operaciones
intermedio 4.3. Análisis dirigido por sintaxis
1.5.5. Optimación de código 4.4. Gramática con atributos
1.5.6. Generación de código 4.4.1. Métodos de evaluación de los
atributos

U N I V E R S I D A D D E A Q U I N O B O L I V I A
3
FACULTAD DE INGENIERIA

4.4.2. Tipos de gramáticas con atributos ciencia y la tecnología en los tiempos


4.5. Comprobación y conversión de tipos actuales.
TEMA 5. Generación de código
intermedio. La ejecución de diferentes programas de
interacción social y la elaboración e
5.1. Lenguajes Intermedios implementación de proyectos de desarrollo
5.2. Declaraciones comunitario derivados de dichos programas
5.3. Proposiciones de asignación confiere a los estudiantes, quienes son, sin
5.4. Expresiones booleanas dudas, los más beneficiados con esta
5.5. Proposiciones CASE iniciativa, la posibilidad de:
5.6. Relleno de retroceso
5.7. Llamadas a procedimientos - Desarrollar sus prácticas pre-
profesionales en condiciones reales y
TEMA 6. Generación de Código. tutorados por sus docentes con procesos
académicos de enseñanza y aprendizaje
6.1. Aspectos del diseño de un generador de verdadera “aula abierta”-
de código
6.2. La maquina objeto - Trabajar en equipos, habituándose a ser
6.3. Administración de la memoria durante la parte integral de un todo que funciona
ejecución como unidad, desarrollando un lenguaje
6.4. Un generador de código simple común, criterios y opiniones comunes y
6.5. Generadores de generadores de código planteándose metas y objetivos comunes
para dar soluciones en común a los
problemas.
III. ACTIVIDADES PROPUESTAS PARA
LAS BRIGADAS UDABOL. - Realizar investigaciones multidisciplinarias
en un momento histórico en que la ciencia
Las Brigadas están destinadas a incidir de atraviesa una etapa de diferenciación y en
manera significativa en la formación que los avances tecnológicos conllevan la
profesional integral de nuestros estudiantes y aparición de nuevas y más delimitadas
revelan las enormes potencialidades que especialidades.
presenta esta modalidad de la educación
superior no solamente para que conozcan a - Desarrollar una mentalidad, crítica y
fondo la realidad del país y se formen de solidaria, con plena conciencia de nuestra
manera integral, sino, además, para que realidad nacional.
incorporen a su preparación académica los
problemas de la vida real a los que resulta ACTIVIDADES A REALIZAR VINCULADAS
imperativo encontrar soluciones desde el CON LOS CONTENIDOS DE LA MATERIA
campo profesional en el que cada uno se
desempeñará. Elaborar Software educativos como material
de apoyo a los estudiantes y maestros de los
El trabajo de las Brigadas permite que diferentes colegios de la ciudad.
nuestros estudiantes se conviertan a mediano
plazo en verdaderos investigadores, capaces
de elaborar y acometer proyectos de
desarrollo comunitario a la vez que se
acostumbren a trabajar en equipos
interdisciplinarios o multidisciplinarios como
corresponde al desarrollo alcanzado por la

U N I V E R S I D A D D E A Q U I N O B O L I V I A
4
FACULTAD DE INGENIERIA

ACTIVIDADES A REALIZAR VINCULADAS


CON LOS CONTENIDOS DE LA MATERIA

TAREAS TEMA(S) CON LOS LUGAR DE ACCIÓN FECHA


PROPUESTAS QUE PREVISTA
SE RELACIONA
Implementación de la Clase Tema 2 Laboratorios de
TCinta. computación.
Implementación del analizador Tema 2 y Tema 3 Laboratorios de
Léxico para el lenguaje CMP – computación.
515
Proyecto final de la materia Temas 2, 3, 4 Exposición de todos
implementar el compilador los proyectos del
CMP – 515 semestre en la feria de
computación.

ACTIVIDADES DE INCURSIÓN Se realizarán dos evaluaciones parciales con


MASIVA EN LA COMUNIDAD. contenidos teóricos y prácticos con una
puntuación entre 0 – 50 puntos.
A lo largo del semestre se realizarán dos El examen final abarcara todo lo avanzado
incursiones masivas en la comunidad, en el semestre y tendrá una puntuación de 0
comprendida la primera entre el 2 y el 8 de – 60 puntos, se realizara la defensa de un
octubre y la segunda entre el 13 y el 19 de proyecto que tendrá una puntación de 0 – 25
noviembre. Con la finalidad de realizar puntos.
trabajos ya sean de recojo de información, V. BIBLIOGRAFIA.
extensión o relacionada con los proyectos a BASICA.
desarrollar en la asignatura o la carrera.  AHO, A.V., SETHI, R., ULLMAN, J.D, “
Compiladores: principios, tecnicas y
IV. EVALUACIÓN DE LA ASIGNATURA. herramientas”, Addison-Wesley
Iberoamericana, 1990.
 PROCESUAL O FORMATIVA.  LOUDEN, K.C, ”Compiler Construction:
Principles and Practice”, PWS Publishing,
En todo el semestre se realizarán preguntas London (1997),
escritas, exposiciones de temas, trabajos
prácticos además de las actividades
planificadas para las Brigadas UDABOL. COMPLEMENTARIA
Estas evaluaciones tendrán una calificación  TEUFEL B, “Compiladores: Conceptos
entre 0 y 50 puntos. fundamentales”, Addison  Wesley  - 1995
En la etapa final se evaluaran preguntas
escritas, trabajos prácticos con una  GARRIDO, J. IÑESTA, F. MORENO Y J.
puntuación entre 0 – 15 puntos. PÉREZ, “Diseño de compiladores”,
Universidad de Alicante, 2002.
 PROCESO DE APRENDIZAJE O
SUMATIVA. VI. CONTROL DE EVALUACIONES.

1° evaluación parcial
Fecha

U N I V E R S I D A D D E A Q U I N O B O L I V I A
5
FACULTAD DE INGENIERIA

Nota
Examen final
2° evaluación parcial Fecha
Fecha Nota
Nota
APUNTES

VII. PLAN CALENDARIO

SEMANA ACTIVIDADES OBSERVAC.


1 TEMA 1
2 TEMA 1
3 TEMA 2
4 TEMA 2
5 TEMA 2
6 TEMA 2 EVAL PARC I
7 TEMA 3 Presentación de notas
8 TEMA 3
9 TEMA 3
10 TEMA 3
11 TEMA 4
12 TEMA 4 EVAL PARC II
13 TEMA 4 Presentación de notas
14 TEMA 5
15 TEMA 5
16 TEMA 5
17 TEMA 6
18 TEMA 6
19 TEMA 2, 3, 4, 5, 6

U N I V E R S I D A D D E A Q U I N O B O L I V I A
6
FACULTAD DE INGENIERIA

20 EVALUACION FINAL Presentación de notas


21 EVALUACION FINAL Presentación de notas
22 SEGUNDA INSTANCIA Presentación de notas

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 1

UNIDAD O TEMA: CONCEPTOS BÁSICOS

TITULO: Traductores

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Primera etapa

Introducción
Uno de los principales mecanismos de Programabásico
siguientedefigura muestra el esquema
Programa de salida
comunicación entre un ordenador y una que compone a un compilador/intérprete. Lenguaje
entrada escrito en escrito en
Lenguaje Fuente Destino
persona viene dado por el envío y recepción TRADUCTORES
de mensajes de tipo textual: el usuario escribe
una orden mediante el teclado, y el ordenador
la ejecuta devolviendo como resultado un Mensaje de
Errores
mensaje informativo sobre las acciones
llevadas a cabo. Esta comunicación solo es
posible a través de traductores que son los
encargados de traducir las diferentes ordenes
que el usuario le da al computador para que
este los pueda entender y ejecutar.

Concepto de traductor
Un traductor se define como un programa que Tipos de traductores
traduce o convierte desde un texto o Desde los orígenes de la computación, ha
programa escrito en un lenguaje fuente hasta existido un abismo entre la forma en que las
un texto o programa equivalente escrito en un personas expresan sus necesidades y la
lenguaje destino produciendo, si cabe, forma en que un ordenador es capaz de
mensajes de error. Los traductores engloban interpretar instrucciones. Los traductores han
tanto a los compiladores (en los que el intentado salvar este abismo para facilitarle el
lenguaje destino suele ser código máquina) trabajo a los humanos, lo que ha llevado a
como a los intérpretes (en los que el lenguaje aplicar la teoría de autómatas a diferentes
destino está constituido por las acciones campos y áreas concretas de la informática,
atómicas que puede ejecutar el intérprete). La

U N I V E R S I D A D D E A Q U I N O B O L I V I A
7
FACULTAD DE INGENIERIA

dando lugar a los distintos tipos de ejecuta por lo que la ejecución es


traductores que veremos a continuación. interactiva. De hecho los interpretes
más puros no guardan copia del
Las técnicas empleadas en el desarrollo de programa que se esta escribiendo.
un compilador no son solo útiles para esto,
sino que estas técnicas son validas para
cualquier programa que reciba una entrada
estructurada de alguna forma, tenga que CUESTIONARIO WORK PAPER No. 1
analizarla y comprenderla generando una
salida. 1. ¿Cuál fue el primer compilador que
apareció? Y de una breve cronología del
Un interprete analiza el programa de mismo.
entrada línea a línea y ejecuta cada una 2. Construya una tabla compiladores Vs
de esas líneas de forma interactiva. Un interprete
compilador lee una determinada 3. Cite 3 ejemplos de interpretes
entrada, lo mas eficientemente posible, 4. Cite 3 ejemplos de compiladores
es capaz de analizar y entender lo que 5. Como se clasifican los compiladores
quiere decir esa entrada y genera una 6. Describa cada uno de los tipos de
salida en función del significado de la compiladores que existe.
entrada. 7. Con un ejemplo de un código fuente
describa el funcionamiento de un
Hay dos grandes tipos de traductores: interprete y un compilador
a) Los interpretes. 8. ¿El lenguaje ensamblador requiere de un
b) Los compiladores de código o compilador ó interprete?. Justifique su
compiladores. respuesta.
9. Mencione 3 aplicaciones (diferentes a los
El interprete ejecuta el código según lo lenguajes de programación tradicionales)
va interpretando. Cada vez que se que utilicen compilador y 3 que utilicen
escribe una línea el programa interprete.
comprueba si es correcta y si lo es la 10. ¿Que es un Decompilador?

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 2

UNIDAD O TEMA: CONCEPTOS BÁSICOS

TITULO: Descripción de compilador

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Primera etapa

Esquema general de un compilador

U N I V E R S I D A D D E A Q U I N O B O L I V I A
8
FACULTAD DE INGENIERIA

Los principios y técnicas que se usan en la código máquina relocalizable, en el cual las
escritura de compiladores se pueden emplear direcciones serán relativas a ciertas
en muchas otras áreas. Se basan en los posiciones de origen, y quizás algunas
conceptos de teoría de autómatas y lenguajes llamadas a rutinas no estén resueltas.
formales que se están exponiendo en la parte
teórica, y constituyen un campo de aplicación Finalmente, el editor de carga y enlace (o
práctica bastante directo. “montador”, o “link”) resolverá las llamadas a
rutinas, incluyéndolas a partir de otros objetos
Objetivo de un compilador de biblioteca si procede, y obtendrá
El objetivo es, básicamente es traducir un direcciones absolutas, de modo que ya se
programa (o texto) escrito en un lenguaje dispondrá del código máquina absoluto
“fuente”, que llamaremos programa fuente, en ejecutable.
un equivalente en otro lenguaje denominado
“objeto”, al que llamaremos programa o Programa fuente
código objeto. Si el programa fuente es
correcto (pertenece al lenguaje formado por
los programas correctos), podrá hacerse tal Analizador
léxico
traducción; si no, se deseará obtener un
mensaje de error (o varios) que permita
determinar lo más claramente posible los
orígenes de la incorrección. Analizad
or
sintáctic
La traducción podrá hacerse en dos formas: o
interpretación: la traducción se hace “frase a
frase” tabla Manejador
compilación: la traducción se hace del texto de símbolos Analizador de errores
completo semántico

Concentraremos nuestra atención en el


Generador de
segundo de los métodos. código
intermedio
Entorno de un compilador
Es frecuente que, además del compilador, se
utilicen otros programas para crear un código
Optimizador
objeto ejecutable. Un esquema típico es el de código
que se describe a continuación.

La estructura del programa fuente se escribe,


usando algún programa de edición de texto Generador
(por ejemplo vi), y puede incluir texto en de código
lenguaje fuente y algunas órdenes para el
preprocesador. Este realizará algunas tareas,
como eliminación de comentarios, expansión Programa objeto
de macros (#IF . . . ), inclusión de archivos
(#include . . . ), sustitución de constantes Esquema de un compilador
(#define . . . ), o algunas extensiones del
lenguaje fuente. No siempre todo este proceso es necesario,
El compilador traducirá el resultado del y, aún cuando se realice, no siempre será
preproceso obteniendo un programa observado por el usuario, de forma que una
equivalente en lenguaje ensamblador, que a sola orden puede provocar el proceso
su vez será traducido por el ensamblador a completo. Los compiladores suelen incluir

U N I V E R S I D A D D E A Q U I N O B O L I V I A
9
FACULTAD DE INGENIERIA

opciones que permiten obtener explícitamente


(o conservar) los resultados intermedios.
Cada uno de los componentes es realmente
un traductor. La dificultad máxima de
traducción suele estar en la compilación
propiamente dicha.

Estructura de un compilador
Cuando se ha hablado de programas
equivalentes en distintos lenguajes (fuente y
objeto), nos
referimos a “tener el mismo significado”. Por CUESTIONARIO WORK PAPER No. 2
ello, la compilación requiere dos grandes
partes o tareas: Describa brevemente y de un ejemplo
análisis : en la que se analiza el programa especifico de:
fuente para dividirlo en componentes y 1. Analizador Léxico
extraer de algún modo el significado.
2. Analizador Sintáctico
síntesis : en la que el significado obtenido
se escribe en el lenguaje objeto 3. Analizador Semántico

De las dos, la síntesis es la que requiere 4. Generador de código intermedio


técnicas más especializadas. Durante el
análisis, se determinan las operaciones que 5. Optmizador de código
indica el programa fuente obteniendo una
representación del significado, normalmente 6. Generador de código
en una estructura jerárquica, de árbol, en la
que cada nodo representa una operación, y 7. Describa la Gestión de la tabla de
cuyos hijos son los argumentos de dicha símbolos en las fases del compilador
operación.
8. Describa la detección e información de
De este modo, a partir de la representación errores en las fases del compilador
intermedia, diferentes partes de síntesis
podrían obtener distintos códigos, para
distintos lenguajes objeto; también, a partir de Dado el siguiente código escrito en C++
distintos lenguajes fuente, con partes de Builder:
análisis adecuadas, se podría obtener una
representación intermedia, que una parte de void __fastcall TForm1::Button1Click(TObject
síntesis tradujera a su vez a un único lenguaje *Sender)
objeto. Nuevamente cada una de estas partes {
es también un traductor. int x,y;
String nombre,zz;
x=3; /* esto es un un
y:= y+'hola';
nombre = InputBox("DEFINICION DE
NOMBRE","Introduzca su nombre, x);
zz = zz + x;
ShowMessage('el resultado es' + x=3);
}

9. Identifique los errores que ocurrirá al


compilar el código.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
10
FACULTAD DE INGENIERIA

10. Identifique que fases del compilador están


encargadas de dar los mensajes de
errores al programador.

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 3

UNIDAD O TEMA: ANALIZADOR LÉXICO

TITULO: Análisis Léxico

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Primera etapa

Análisis Léxico  Constantes de caracteres: literales que


Funciones del analizador léxico. representan cadenas concretas de
Analizador léxico (scanner): lee la secuencia caracteres, \hola mundo",...
de caracteres del programa fuente, carácter a
carácter, y los agrupa para formar unidades El analizador léxico opera bajo petición del
con significado propio, los componentes analizador sintáctico devolviendo un
léxicos (tokens en ingles). componente léxico conforme el analizador
Componente sintáctico lo va necesitando para avanzar en
Programa léxico la gramática. Los componentes léxicos son
fuente Analizador Analizador los símbolos terminales de la gramática.
léxico sintáctico
árbol de anal.
Suele implementarse como una subrutina del
Obtén siguiente sintáctico analizador sintáctico. Cuando recibe la orden
componente léxico obtén el siguiente componente léxico, el
analizador léxico lee los caracteres de
entrada hasta identificar el siguiente
Estos componentes léxicos representan: componente léxico.
 Palabras reservadas: if, while, do, . . .
 identificadores: asociados a variables, Otras funciones secundarias:
nombres de funciones, tipos definidos por  Manejo del fichero de entrada del
el usuario, etiquetas,... Por ejemplo: programa fuente: abrirlo, leer sus
posición, velocidad, tiempo, . . . caracteres, cerrarlo y gestionar posibles
 operadores: = * + - / == > < & ! = . . . errores de lectura.
 Símbolos especiales: ; ( ) [ ] { } ...  Eliminar comentarios, espacios en blanco,
 Constantes numéricas: literales que tabuladores y saltos de línea (caracteres
representan valores enteros, en coma no validos para formar un token).
flotante, etc, 982, 0xF678, -83.2E+2,...  Inclusión de ficheros: # include...

U N I V E R S I D A D D E A Q U I N O B O L I V I A
11
FACULTAD DE INGENIERIA

 La expansión de macros y funciones Los componentes léxicos se especifican


inline: # define ... haciendo uso de expresiones regulares.
 Contabilizar él numero de líneas y Tomando en cuenta las tres operaciones
columnas para emitir mensajes de error. básicas: concatenación, repetición (*) y
 Reconocimiento y ejecución de las alternativas (|).
directivas de compilación (por ejemplo,
para depurar u optimizar el código fuente). Reconocimiento de los componentes
léxicos: autómatas finitos.
Ventajas de separar el análisis léxico y el Los AFD se pueden utilizar para reconocer las
análisis sintáctico: expresiones regulares asociadas a los
 Facilita transportabilidad del traductor (por componentes léxicos.
ejemplo, si decidimos en un momento Identificadores
dado cambiar las palabras reservadas identifier = letter (letter | digit)*
begin y end de inicio y fin de bloque, por f números naturales y reales
y g, solo hay que cambiar este modulo. nat = [0-9]+
 Se simplifica el diseño: el analizador es un Operadores relacionales
objeto con el que sé interactúa mediante Operadores < | = | <= | <> | >= | >
ciertos métodos. Se localiza en un único
modulo la lectura física de los caracteres, CUESTIONARIO WORK PAPER No. 3
por lo que facilita tratamientos
especializados de E/S. Diseña una expresión regular y construye el
AFD para las siguientes especificaciones en
lenguaje natural:
Componentes léxicos, Patrones, Lexemas
Patrón: es una regla que genera la secuencia 1. ¿Qué diferencias hay entre un
de caracteres que puede representar a un AFD y un DT? ¿Cuál de las dos máquinas
determinado componente léxico (una de
expresión regular). 2. estados sirve mejor para
Lexema: cadena de caracteres que representar un analizador léxico?
concuerda con un patrón que describe un 3. Los números enteros expresados en
componente léxico. Un componente léxico notación decimal, octal o hexadecimal. En
puede tener uno o infinitos lexemas. Por notación decimal, un entero consiste en
ejemplo: palabras reservadas tienen un único uno o mas dígitos. En notación octal hay
lexema. Los números y los identificadores al menos dos dígitos, el primero de los
tienen infinitos lexemas. cuales es siempre un cero y los restantes
quedan comprendidos entre el cero y el
Compon. léxico Lexema Patrón siete. En notación hexadecimal, hay al
menos tres caracteres, los dos primeros
identificador indice, a, Temp. Letra seguida de
letras o dígitos. caracteres son un cero y una equis y los
num_entero 1492, 1, 2 Digito seguido restantes son dígitos del cero al nueve o
de mas digitos. letras entre la A y la F.
if if Letra i seguida
de letra f.
do do Letra d seguida 4. Las palabras clave: char, integer, float.
de o.
op_div / Carácter / 5. Identificadores y las palabras reservadas:
op_asig = Caracter = case, char, const, continue.

6. Comentarios tipo C++ /* esto es un


Especificación de los componentes comentario */, //esto es un comentario.
léxicos: expresiones regulares.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
12
FACULTAD DE INGENIERIA

7. Los identificadores compuestos de letras, <P>Esto es un párrafo</P>


dígitos y subrayados, que empiezan por <H4>Titulo4</H4>
una letra y no puede haber mas de un <H5>Titulo5</H5>
subrayado seguido. <H6>Titulo6</H6>
<UL>
<LI> Uno </LI>
8. Los comentarios delimitados por ##, que <LI> Dos </LI>
permiten un # dentro del cuerpo del <LI> Tres </LI>
comentario </UL>
</BODY>
9. Construye el AFD para reconocer los </HTML>
operadores menor que (<), menor o igual
que (<=), igual que (==), mayor que (>), 13. Especificar el conjunto de
mayor o igual que (>=), distinto de (<>). tokens que debe reconocer el
Escribe en pseudocódigo el código analizador, incluyendo su tipo y
correspondiente para su implementación. lexema
10. Escribe un programa que cuente el 14. Especificar el patrón léxico
numero de veces que aparece las (expresión regular) que define cada
palabras reservadas while, if, el operador posible token del lenguaje
de asignación = y el numero de 15. Construir el autómata que
identificadores en un programa en C. reconoce el lenguaje anterior

11. Escribe un programa que sustituya las Se pretende construir una calculadora que
palabras reservadas while, do, if, else a evalúe expresiones de aritmética simple tales
mayúsculas. Debe generar un fichero como:
igual al de la entrada donde se han 10 - (((( 2 - ( 4 - 2) - 30 ) + 2 ) - 10 ) - 2 )
cambiado esas palabras reservadas. ((( 100 * 10 ) - 20 ) - ( 30 * 2 ))

12. Supongamos que hay una pagina web 16. Se requiere construir un
donde se quiere cambiar todas las analizador léxico de este lenguaje.
referencias http:nnbugs.uv.es Por Para ello se pide:
http:nninformatica.uv.es. Escribe un dt que 17. Especificar la colección de
lo haga de forma automática. tokens del analizador indicando su
tipo y lexema
HTML es el nombre del lenguaje que se utiliza 18. Construir el DT que reconozca
especificar contenidos Web. Su el conjunto de tokens
funcionamiento se basa en utilizar una serie
de etiquetas que indican de qué forma se Dado el siguiente código fuente:
debe representar dicho texto en pantalla. program problema2;
Especificar un analizador léxico que function F2 (uno, dos: integer) {
reconozca los elementos lexicográficos que function F1 (uno, dos: integer) {
var a, b: integer;
aparecen en el siguiente ejemplo:
a:= 5;
<HTML>
b:= 10;
<HEAD>
b:= ((a * uno) + (b * dos))
<TITLE> Ejemplo de compiladores
return b;
</TITLE>
}
</HEAD>
var c, d: integer;
<BODY>
c:= uno;
<!-- Esto es un comentario -->
d:= dos;
<HR>
return ( (c + F1(c, d)) * (d + F1(3, 4))
<H1>Titulo1</H1>
}
<H2>Titulo2</H2>
var uno: integer;
<H3>Titulo3</H3>

U N I V E R S I D A D D E A Q U I N O B O L I V I A
13
FACULTAD DE INGENIERIA

begin =
uno := 1; :
uno := F2 (uno, 1); :=++
end. :=--
Se pide: NUM
19. Escribir la estructura de los VAR
tokens que debe emitir el analizador Donde:
léxico NUM = Números enteros sin signo.
20. Determinar los patrones léxicos Ejm: 10, 256
(expresiones regulares) de cada uno VAR = Variables. Deben comenzar por una
21. Especificar el autómata que letra, a la que puede seguir un número
reconoce el conjunto de tokens indeterminado de letras o números (var12, a).
Se pide:
Dada la siguiente sentencia: 28. Escribir las expresiones
if (a > ((b *3) / 4)) {
regulares que describen los
a := (b * 4) + 1000.0; }
elsif (a = ((b*3.4) /4)) { componentes VAR y NUM.
b := 100; 29. Dibujar el diagrama de
} transiciones determinista para el
else { analizador.
a := 100.0; 30. Generar la tabla de
} transiciones a partir del diagrama del
apartado anterior.
Se pide: 31. Indicar los tokens reconocidos
por el analizador para la siguiente
22. Escribir la estructura de los cadena de entrada:
tokens que debe emitir el analizador a:=+x2=57+2y::=---
léxico
23. Determinar los patrones léxicos Diseñar un analizador léxico que reconozca
(expresiones regulares) de cada uno los siguientes componentes:
24. Especificar el autómata que
reconoce el conjunto de tokens TOKEN DESCRIPCIÓN EJEMPLO
Identificadores.
Se desea especificar un analizador léxico que Comienzan por una
reconozca sentencias para asignar letra, a la que var12, a
ID
pueden seguir
expresiones matemáticas (con sumas (+), caracteres
restas (-), productos (*), divisiones (/), alfanuméricos
potencias (^) y paréntesis). Por ejemplo: Números enteros
ENTERO -5, 30, +77
• A := 3 * (2 – 5^3) con o sin signo
• B3 := 4 – C+ 8 / (6 – D) Números reales
con o sin signo. No
Se pide: se admiten
25. Indicar la estructura de los -0.5, 45.2, +0.2
REAL construcciones
tokens como .2 ó
26. Expresar los patrones léxicos 50.
de cada uno de ellos
Números enteros o
27. Construir el scanner que EXP reales con signo y
4.2e-3, 50e20,
reconoce el lenguaje 3e+2, -1e+10
con exponente

Se pretende diseñar un analizador léxico que Palabra reservada


PR_WHILE -
‘while’
reconozca los siguientes símbolos:
Palabra reservada -
+ PR_WHEN
‘when’
- OP_ASIGNACIÓ Símbolo ‘=’ -

U N I V E R S I D A D D E A Q U I N O B O L I V I A
14
FACULTAD DE INGENIERIA

N
Símbolo‘/’ Se pide:
OP_DIV -
35. Escribir las expresiones
regulares para VAR, FLOAT y EXP
Se pide:
36. Dibujar el reconocedor para
32. Expresiones regulares para ID,
este analizador léxico utilizando la
ENTERO, REAL y EXP.
representación elegida en el
33. Dibujar el diagrama de
apartado anterior
transiciones determinista para el
37. Indicar los tokens que
analizador.
reconocerá el analizador para las
34. Indicar los tokens reconocidos
siguientes cadenas de entrada:
por el analizador para las siguientes
resultado=34e2+33-2.e2
entradas:
vertice=25.3-2e-2e-2
área=12e2/50e-x
resultado2=var/3.3/2e-10
38. Escribir un analizador léxico
que reciba como entrada un texto y
Se quiere diseñar un analizador léxico que
muestre como salida el número de
reconozca los siguientes símbolos:
caracteres, el número de palabras y el
número de líneas que hay en el texto

39. Escribir un analizador léxico


para cifrar un texto de entrada invirtiendo
el orden de las letras de cada palabra
TOKEN DESCRIPCIÓN EJEMPLO
Comienzan por 40. Modificar el programa anterior
una letra, a la
que para que cifre todo menos los números,
x1, z que deben mantenerse en el orden en el
VAR pueden seguir
caracteres que aparecen
alfanuméricos
41. Modificar el programa anterior
Números enteros
INT
sin signo
4, 50 para que invierta línea a línea y no palabra
Números reales a palabra
sin signo. No se
admiten 42. Escribir un analizador léxico
45.2, 0.2
FLOAT construcciones
como .2 ó
para cifrar un texto de la siguiente forma:
50. Tamaño(palabra) <= 4 letras inversa
Tamaño(palabra) == 5 ó 6 letras inversa
Números enteros en bloques de dos caracteres
o reales sin 4.2e-3, Tamaño(palabra) == 7,8 ó 9 letras en
signo y con 3e+2,
EXP
exponente con 1e10 bloques de 3 caracteres
signo Tamaño(palabra) > 9 en bloques de 4
caracteres
Palabra -
TO
reservada “to” 43. La Secretaría de la D.T.I.U. de
Palabra -
THEN
reservada “then” Informática recibe de los Departamentos
operador de - las notas de los alumnos en un fichero
ASIG
asignación “=” formato texto, en el que cada línea posee
SUMA
operador de - tres campos separados por espacios: C.I.
suma “+” del alumno, Convocatoria del examen
operador de -
RESTA
resta “-”
(Diciembre, Febrero o Junio), y la Nota.
Hacer un programa que efectúe la lectura

U N I V E R S I D A D D E A Q U I N O B O L I V I A
15
FACULTAD DE INGENIERIA

de dicho fichero, emitiendo al final la


media de las notas recuperadas.
Asimismo informará de los errores de
formato que se pueda encontrar: líneas en
las que falten campos, valores incorrectos,
etc…

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 4

UNIDAD O TEMA: ANÁLISIS SINTACTICO

TITULO: Análisis Sintáctico

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Segunda etapa

Funciones del analizador sintáctico


 Comprobar si la cadena de componentes
léxicos proporcionada por el analizador
léxico puede ser generada por la
gramática que define el lenguaje fuente
(gramática Independiente del Contexto,
GIC).
 Construir el árbol de análisis sintáctico
que define la estructura jerárquica de un
programa y obtener la serie de El análisis sintáctico se puede considerar
derivaciones para generar la cadena de como una función que toma como entrada la
componentes léxicos. El árbol sintáctico secuencia de componentes léxicos producida
se utilizara como representación por el análisis léxico y produce como salida el
intermedia en la generación de código. árbol sintáctico.
 Informar de los errores sintácticos de En la realidad, el análisis sintáctico hace una
Gram. indep. contexto
forma precisa y significativa y deberá estar petición al análisis léxico del componente
Componente
dotado de un
léxico
mecanismo de recuperación léxico siguiente en la entrada (los símbolos
Programa
fuente de
Analizadorerrores para continuar con
Analizador el análisis.Analizador terminales) conforme lo va necesitando en el
léxico sintáctico
árbol de anal.
semántico proceso de análisis, conforme se mueve a lo
Obtén siguiente sintáctico largo de la gramática.
componente léxico

U N I V E R S I D A D D E A Q U I N O B O L I V I A
16

Gestor de Tabla de
errores símbolos
FACULTAD DE INGENIERIA

Reconocedor versus analizador sintáctico Las expresiones regulares NO SABEN contar.


Un reconocedor trata de determinar NO es posible especificar la estructura de un
simplemente si la cadena puede o no ser lenguaje de programación con solo
generada por la gramática (salida boolena). expresiones regulares.
Podríamos preguntar algo más. Si queremos
reconocer las estructuras propias de los ¿Son suficientes las gramáticas
lenguajes de programación en el fichero de independientes del contexto?
entrada para guiar la traducción, es necesario NO, existen ciertos aspectos de los lenguajes
conocer su estructura jerárquica, el árbol de de programación que no se pueden
análisis sintáctico. representar con una GIC. A estos aspectos se
les llama aspectos semánticos, son aspectos
Especificación sintáctica de los lenguajes en general dependientes del contexto.
de programación Por ejemplo, el problema de declaración de
La mayoría de las construcciones de los los identificadores antes de uso. Se podría
lenguajes de programación se pueden representar mediante el lenguaje
representar con una gramática L={wcw tal que w  (a | b)*}
independiente del contexto (GIC). La este lenguaje no puede ser representado por
mayoría de las construcciones de los una GIC.
lenguajes de programación implican
recursividad y anidamientos. Derivaciones. Árboles de anal. sintáctico
G = {S; VT ; VNT ; P} Dada ,   (VTVNT )* cadenas arbitrarias de
S : el axioma o símbolo de inicio símbolos gramaticales, se dice que
VT : conjunto de terminales, los componentes A   es una derivación, si existe una
léxicos producción A 
VNT : conjunto de no-terminales
P : conjunto de reglas de producción de la Sea S , si   (VTVNT )* se dice que 
forma es una forma de frase o forma sentencial
si   (VT)* se dice que  es una frase o
VNT  X1, ...., ;Xn , con Xi  (VT  VNT ) sentencia.

¿Expresiones regulares o gramáticas Existen dos tipos de derivaciones:


independientes del contexto?  Derivación mas a la izquierda: se sustituye
Las expresiones regulares no permiten en cada paso el no-terminal mas a la
construcciones anidadas tan comunes en los izquierda de la forma de frase. La
lenguajes de programación: paréntesis denotaremos por:
equilibrados, concordancia de pares de  
palabras clave como begin-end, do-while, ...
Por ejemplo: consideremos el problema de los  Derivación mas a la derecha: se sustituye
paréntesis equilibrados en una expresión en cada paso el no-terminal mas a la
aritmética. El hecho de que haya un derecha de la forma de frase. La
paréntesis abierto obliga a que haya un denotaremos por:
paréntesis cerrado. Este problema es similar
a considerar el lenguaje  
L = {aba, aabaa, aaabaaa, ...,} = {anban  0}
Por ejemplo para la gramática:
Si intentamos escribir una expresión regular, E  id | num | E + E | ( E ) | - E
lo más próximo seria: {a*ba*} pero no se Si queremos derivar la frase ¡(id + id)
garantiza que él numero de a's antes y
después sea el mismo. E - E  -(E + E)  -(id + E) )  -(id + id)
Derivación mas a la izquierda.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
17
FACULTAD DE INGENIERIA

E - E  -(E + E)  -(E + id) )  -(id + id) gramáticas limpias y bien formadas


Derivación mas a la derecha. Llamamos símbolo vivo al símbolo a partir del
Árboles de análisis sintáctico cual se puede derivar una cadena de
terminales. Llamamos símbolo muerto a los
Un árbol de análisis sintáctico indica como a
símbolos no-vivos, no generan una cadena
partir del axioma de la gramática se deriva
del lenguaje. Llamamos símbolo inaccesible si
una frase (cadena) del lenguaje. Dada una
nunca aparece en la parte derecha de una
gramática independiente del contexto, un
producción. A las gramáticas que contienen
árbol de análisis sintáctico es un árbol tal que:
estos tipos de símbolos se les llama
gramáticas sucias.
1. La raíz esta etiquetada con el símbolo
inicial.
Teorema 1: si todos los símbolos de la parte
2. Cada hoja esta etiquetada con un
derecha de una producción son símbolos
componente léxico. Las hojas de izquierda
vivos, entonces el símbolo de la parte
a derecha forman la frase (el programa
izquierda también lo es.
fuente).
3. Cada nodo interior esta etiquetado con un
Teorema 2: si el símbolo no-terminal de la
no-terminal.
parte izquierda de una producción es
4. Si A es un no-terminal y X1, ...., ;Xn son
accesible, entonces todos los símbolos de la
sus hijos de izquierda a derecha, entonces
parte derecha también lo son.
existe la producción A  X1, ...., ;Xn , con
Xi  (VTVNT ). Para limpiar una gramática primero se
eliminan los símbolos muertos y después los
El árbol de análisis sintáctico contiene símbolos inaccesibles.
en general mucha mas información que
la estrictamente necesaria para generar Una gramática esta bien formada si es limpia
el código.
y además no contiene producciones -.
Se puede construir una estructura mas
Ejemplo: limpiar la gramática
sencilla, los árboles abstractos de análisis
SaABA
sintáctico. Ejemplo: expresiones aritméticas
(igual semántica, menor complejidad) AcBd
BefS
CgDhDt
Dxyz
gramáticas ambiguas
Una gramática es ambigua cuando para una
determinada sentencia produce mas de un
árbol de derivación.
La gramática siguiente es ambigua:

E  id  num  E + E  E * E  ( E )  - E
Supongamos la sentencia id + id * id

U N I V E R S I D A D D E A Q U I N O B O L I V I A
18
FACULTAD DE INGENIERIA

descendente corresponde con un recorrido


El significado semántico es DIFERENTE. No prefijo del árbol de análisis sintáctico (primero
existe una única traducción posible. Se expandimos el nodo que visitamos y luego
genera código diferente. procesamos los hijos).
Necesidad de evitar las gramáticas ambiguas. S  Sujeto Verbo Objeto
Como? Sujeto  el Nombre | un Nombre
 transformando la gramática o Objeto  el Nombre | un Nombre
 estableciendo precedencias entre Verbo  el Nombre | un Nombre
operadores y de asociatividad. Nombre  perro | gato | león
Se puede eliminar la ambigüedad
transformando la gramática agrupando todos Ejemplo: El león cazo un gato
los operadores de igual precedencia en Crear el árbol...
grupos y asociando a cada uno una regla, de
forma que los que tengan menor precedencia Problemas: reexcursión a izquierdas,
aparezcan más cercanos al símbolo de inicio, diferentes alternativas en una producción,
precedencia en cascada. Esto conlleva el ¿cómo conseguir un coste lineal?
aumento de la complejidad de la gramática y
con ello en la del árbol sintáctico. La  Métodos ascendentes: se construye el
gramática deja de ser intuitiva. árbol de análisis sintáctico desde las hojas
hasta la raíz. En las hojas esta la cadena
Ejemplo 1: gramática ambigua a analizar y se intenta reducirla al símbolo
E  num  E + E  E - E  E * E  E / E de inicio de la gramática que esta en la
raíz. Se trata de desplazar-se en la
Si la transformamos, esta gramática ya no es cadena de entrada y encontrar una
ambigua. subcadena para aplicar una reducción
(una regla de producción a la inversa),
exp  exp + term  exp - term  term (shift- reduce). El análisis sintáctico
term  term * factor  term / factor  factor ascendente corresponde con un recorrido
factor  ( exp )  num postorden del árbol (primero reconocemos
IMPORTANTE: Una regla recursiva a los hijos y luego mediante una reducción
izquierdas, hace que el operador sea reconocemos el padre).
asociativo por la izquierda. Una regla
recursiva a derechas hace que el operador Insertar un ejemplo de como efectivamente
sea asociativo por la derecha. los dos tipos de análisis corresponden con los
tipos de recorrido prefijo y postfijo.
Clasificación métodos de análisis Atendiendo a la forma en que procesan la
sintáctico cadena de entrada se clasifican en:
Atendiendo a la forma en que se construye el
árbol de análisis sintáctico los métodos de  Métodos direccionales: procesan la
análisis sintáctico se clasifican: cadena de entrada símbolo a símbolo de
izquierda a derecha.
Métodos descendentes: se parte del símbolo  Métodos no-direccionales: acceden a
de inicio de la gramática que se coloca en la cualquier lugar de la cadena de entrada
raíz y se va construyendo el árbol desde para construir el árbol. Necesitan tener
arriba hacia abajo hasta las hojas, eligiendo la toda la cadena de componentes léxicos en
derivación que da lugar a una concordancia memoria. Más costosos, no se suelen
con la cadena de entrada. Se basa en la idea implementar.
de predice una derivación y establece una
concordancia con el símbolo de la entrada Atendiendo al numero de alternativas posibles
(predict/match). El análisis sintáctico en una derivación se clasifican en:

U N I V E R S I D A D D E A Q U I N O B O L I V I A
19
FACULTAD DE INGENIERIA

term  term mulop factor 


 Métodos deterministas: dado un símbolo factor
de la cadena de entrada se puede decidir mulop  *  /
en cada paso cual es la alternativa / factor  ( exp )  num
derivación adecuada a aplicar, solo hay
una posible. No se produce retroceso y el 3. Dada la siguiente gramática simplificada
coste el lineal. de una expresión en LISP: (a) escribe las
derivaciones mas a la derecha y más a la
 Métodos no-deterministas: en cada paso izquierda de la entrada (a 23 (m x y)).
de la construcción del arbol se deben Dibuja el árbol de análisis sintáctico para
probar diferentes alternativas / esa sentencia.
derivaciones para ver cual es la lexp  atom  list
adecuada, con el correspondiente atom  number  identifier
aumento del coste. list  ( lexp-seq )
lexp-seq  lexp-seq lexp 
Importancia de los métodos direccionales y lexp
deterministas en el diseño de traductores. El 4. Dada la siguiente gramática, construya el
determinismo por la necesidad de eficiencia árbol de análisis sintáctico para la frase
(coste lineal frente a exponencial que le haría not (true or false). ¿Es una gramática
prohibitivo en el diseño practico de ambigua?
traductores) y porque las herramientas para la
generación de traductores asumen esta bexp  bexp or bterm  bterm
condición. Los métodos direccionales por la
bterm  bterm and bfactor 
propia naturaleza secuencial en que se va
bfactor
procesando los símbolos del fichero fuente de
bfactor  not bfactor  ( bexp )
izquierda a derecha.
 true  false

CUESTIONARIO WORK PAPER No. 4 5. Escribe una gramática para expresiones


booleanas que incluya las constantes true
1. Dadas la siguiente gramática, elimina los y false, los operadores and, or y not y los
símbolos muertos e inaccesibles. paréntesis. Se ha de tener en cuenta que
el operador or tiene menor precedencia
que el operador and y este menor que el
SaABCDd
operador not. Construye la gramática de
AaBC
forma que los operadores and y or sean
Bb asociativos por la izquierda y el operador
Cc not por la derecha.
Dd
Egh 6. Comprueba que se puede resolver el
problema de la ambigüedad del dangling
2. Dada la siguiente gramática, escribe la else transformando la gramática a la
derivación mas a la izquierda, el árbol de forma:
análisis sintáctico y el árbol sintáctico
abstracto para las siguientes expresiones: statment  matched-stmt |
unmatched-stmt
a. 3+4*5-6 matched-stmt  if ( exp ) matched-
b. 3*(4-5+6) stmt else matched-stmt | other
unmatched-stmt  if ( exp ) statement
exp  exp addop term  term
addop  +  -

U N I V E R S I D A D D E A Q U I N O B O L I V I A
20
FACULTAD DE INGENIERIA

| if ( exp ) matched- statment  if ( exp )


stmt else unmatched- statement | matched-
stmt stmt
exp  0 | 1 matched-stmt  if ( exp
) matched-stmt else
Justificar usando un ejemplo. statment | other
exp  0 | 1
7. Comprueba que el intento de resolver el Justificar usando un ejemplo.
problema de la ambigüedad del dangling
else no es adecuado:

PROGRAMA DE CONTROL DE CALIDAD


WORK PAPER # 5

UNIDAD O TEMA: ANÁLISIS SINTACTICO

TITULO: Análisis Sintáctico Descendente

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Segunda etapa

ANALISIS DESCENDENTE: EL AUTOMATA de caracteres para almacenar los lexemas en


PREDICE/CONCUERDA el analizador léxico).
Especificación de la sintaxis de un lenguaje
mediante gramáticas independientes del Fundamento de los métodos
contexto (GIC). Estas gramáticas permiten descendentes: autómata
recursividad y estructuras anidadas. Por predice/concuerda
ejemplo: sentencias if-else anidadas, En cada paso del proceso de derivación de la
paréntesis anidados en expresiones cadena de entrada se realiza una predicción
aritméticas, que no pueden ser representadas de la posible producción a aplicar y se
mediante expresiones regulares. comprueba si existe una concordancia entre
el sımbolo actual en la entrada con el primer
La recursividad va a implicar: terminal que se puede generar a partir de esa
Algoritmos de reconocimiento mas complejos, regla de producción, si existe esta
que hagan uso de llamadas recursivas o usen concordancia se avanza en la entrada y en el
explıcitamente una pila, la pila de análisis árbol de derivación, en caso contrario se
sintáctico. vuelve hacia atrás y se elige una nueva regla
de derivación.
La estructura de datos usada para Ejemplo Supongamos la siguiente gramática
representar la sintaxis del lenguaje ha de ser que permite generar expresiones aritméticas:
también recursiva (el árbol de análisis
sintáctico), en vez de lineal (caso de un vector E  T E’
E’  + TE’  - T E’  

U N I V E R S I D A D D E A Q U I N O B O L I V I A
21
FACULTAD DE INGENIERIA

T _F T’ modifican el lenguaje que se esta


T’  * FT’  / F T’   reconociendo, pero si que cambian el aspecto
F  ( E )  num  id de la gramatica, que es en general menos
intuitiva.
Para la entrada num + id * num. Recursividad a izquierdas y su eliminación
Una gramática es recursiva por la izquierda si
Crear el arbol de analisis sintactico.. tiene un no-terminal A tal que existe una
. producción A  A
Nos restringimos al caso de metodos
deterministas (no hay vuelta atras) teniendo Algoritmo para eliminar recursividad a
en cuenta un solo sımbolo de preanalisis izquierdas:
(componente lexico que se esta analizando primer paso: se agrupan todas las
en la cadena de entrada en ese momento), producciones de A en la forma:
sabemos exactamente en todo momento que
producción aplicar. El sımbolo de preanalizas A  A1 | A2 |......| Am | 1 | 2 |..... n
se actualiza cada vez que se produce una |
concordancia. donde ninguna i comienza con una A.

Los métodos descendentes se caracterizan segundo paso: se sustituyen las


porque analizan la cadena de componentes producciones de A por:
lexicos de izquierda a derecha, obtienen la A  1 A’ | 2 A’ |..... n A’ |
derivación mas a la izquierda y el árbol de A  1 A’ | 2 A’ |......| m A’ | 
derivación se construye desde la raız hasta
las hojas.
Ejemplo: Eliminar la recursividad a izquierdas
Problemas de decisión: ¿Que producción de
elegir cuando hay varias alternativas? E E+TT
T T * F F
A    ..... F ( E )  num  id
Una gramática recursiva a izquierdas nunca
Conjunto PRIMEROS(): el conjunto de puede ser LL(1). En efecto, asume que
tokens que pueden comenzar cualquier frase encontramos un token t, tal que predecimos la
derivable de ,   ( VT  VNT)*. producción A  A, después de la predicción,
al apilar la parte derecha de la producción, el
Conjunto SIGUIENTES(A): el conjunto de símbolo A estará en la cima de de la pila, y
tokens que pueden aparecer después de un por tanto, se predecirá la misma producción, y
no-terminal A, A  VNT tendríamos de nuevo A en la cima, ası hasta
Problemas en el análisis descendente: que el infinito, produciéndose un
 La recursividad a izquierdas da lugar a un desbordamiento de la pila de análisis
bucle infinito de recursion. sintáctico.
 Problemas de indeterminismo cuando
varias alternativas en una misma GRAMATICAS LL(1)
produccion comparten el mismo prefijo. Las gramáticas LL(1) permiten construir
No sabrıamos cual elegir. Probarıamos de forma automática un analizador
una y si se produce un error harıamos determinista descendente con tan solo
backtracking. Si queremos que el metodo examinar en cada momento el sımbolo
sea determinista hay que evitarlas. actual de la cadena de entrada (sımbolo
de preanalizas) para saber que
Existen transformaciones de gramaticas para producción aplicar.
su la eliminacion. Estas transformaciones no

U N I V E R S I D A D D E A Q U I N O B O L I V I A
22
FACULTAD DE INGENIERIA

 L: método direccional, procesamos la 1. Para las producciones de la forma A


entrada de izquierda a derecha (from left  1 | 2 |......| n se debe cumplir que:
to rigth).
 L: obtenemos derivación mas a la
izquierda (left-most derivation). Esta regla permite decidir que alternativa
 1: usamos un sımbolo de preanalisis para elegir conociendo solo un sımbolo de la
decidir la producción a aplicar. entrada.

Teorema 1: Una gramática LL(1) no 2. Si A  VN, tal que {  }  PRIMEROS(A),


puede ser recursiva a izquierdas y debe entonces:
estar factorizada.
Teorema 2: Una gramática LL(1) es no Esta condicion garantiza que para aquellos
ambigua. sımbolos que pueden derivar la cadena vacia,
el primer sımbolo que generan y el siguiente
Las afirmaciones inversas no tienen porque que puede aparecer detras de ellos sean
ser ciertas. distintos, sino no sabrıamos como decidir si
Ejemplo de gramatica LL(1). vamos a empezar a reconocer el no-terminal
o que ya lo hemos reconocido.
SaB
B b | a B b Comprobar que la gramatica anterior para
generar expresiones aritméticas es LL(1).
Para la cadena aabb.
Construir el arbol . . .
CUESTIONARIO WORK PAPER No. 5
¿Como garantizar que una gramatica es
LL(1): los conjuntos PRIMEROS y 1. Demuestra que la gramatica siguiente no
SIGUIENTES? es LL(1).
Sea   (VN  VT)*, PRIMEROS() indica el
conjunto de terminales que pueden aparecer Construye el pseudocodigo correspondiente
al principio de cadenas derivadas de . para un analizador descendente recursivo
como si lo fuera y comenta el problema que
Si  1 ... n entonces {  }  se encuentra.
PRIMEROS(  ) con   VT 2. Demuestra que la gramatica siguiente es
LL(1).
Si   entonces {  } 
PRIMEROS(  ) Construye el pseudocodigo correspondiente
para un analizador descendente y analiza la
Sea A  VN entonces SIGUIENTES(A) indica entrada (()).
el conjunto de terminales que en cualquier 3. Dada la siguiente gramatica:
momento de la derivacion pueden aparecer
inmediatamente a la derecha (despues de) A. Stmt  Assign_stmt | Call_stmt | other
Assign_stmt  id := Exp
Sea   VT , {  }  SIGUIENTES(A) si Call_stmt  id ( Exp )
existe ,   (VN  VT)*, tales que
Escribe el pseudocodigo para analizar de
S A
La condicion LL(1)
Para que una gramatica sea LL(1) se debe forma descendente recursiva esta gramatica.
cumplir que: Muestra la traza para una entrada concreta.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
23
FACULTAD DE INGENIERIA

4. Considera el siguiente fragmento de ¿Es LL(1)? Si no, transformala para que lo


gramatica que permite generar sea. Implementa un analizador descendente
identificadores como etiquetas: recursivo y dibuja la traza de llamadas
Stnt  Label Unlabeled_stmt recursivas a procedimientos para reconocer la
Label  id : cadena de entrada:
Label  
Unlabeled_stmt  id := Expresion etiqueta1 :
a:= 3 + 4;

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 6

UNIDAD O TEMA: ANÁLISIS SINTACTICO

TITULO: Análisis Sintáctico Ascendente

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Segunda etapa

ANALISIS ASCENDENTE: EL AUTOMATA Nos restringimos al caso de métodos


DESPLAZA / REDUCE deterministas (no hay vuelta atrás) analizando
Análisis ascendente: se construye el árbol de un solo sımbolo de preanalisis sabemos
análisis sintáctico de la cadena de entrada exactamente en todo momento que acción
desde las hojas hasta la raız. En las hojas realizar: bien desplazarnos en la entrada o
tenemos la cadena a analizar (los sımbolos bien aplicar una reduccion. En el caso de una
terminales) que se intentan reducir al axioma, reducción debemos saber de forma única que
que se encontrara en la raız, si la cadena es producción aplicar.
correcta sintacticamente. Los métodos ascendentes se caracterizan
porque analizan la cadena de componentes
Ejemplo: Supongamos la siguiente gramática léxicos de izquierda a derecha, obtienen la
: derivación mas a la derecha y el árbol de
derivación se construye desde la raız hasta
EE+E las hojas.
EEE TIPOS DE CONFLICTOS
E  id  ¿Que acción realizar: desplazar o reducir?
E  num  ¿Que producción elegir al reducir cuando
Para la entrada id + id + id hay varias posibles?
Conflicto desplaza-reduce:
E  E + E | E  E | id | num

U N I V E R S I D A D D E A Q U I N O B O L I V I A
24
FACULTAD DE INGENIERIA

Para la entrada 2  3  2
Desventajas: los métodos son difıciles de
Conflicto reduce-reduce: comprender, de implementar a mano y de
Supongamos una sencilla gramática que realizar una traza. Necesidad de usar
permite generar sentencias que son bien generados automáticos de analizadores
llamadas a procedimientos o asignaciones. sintácticos LR. Por ejemplo: Bison (para
S  id | V:=E Linux) y Yacc (yet another compiler compiler)
V  id para Unix.
E  id | num
Dentro del análisis sintáctico LR se distinguen
Para la entrada suma := 3, equivalente a los cuatro técnicas:
componentes léxicos: id := num, tenemos las  El método LR(0). Es el más fácil de
posibilidades implementar, pero el que tiene menos
poder de reconocimiento. No usa la
información del sımbolo de preanalisis
para decidir la acción a realizar.
 El método SLR(1) (del ingles Simple LR).
Usa ya un sımbolo de preanalisis.
 El método LR(1). Es el mas poderoso y
costoso. El tamaño del autómata a pila
para el reconocimiento se incrementa
considerablemente.
 El método LALR(1) (del ingles Look-
Ahead LR, con sımbolo de anticipación).
Es una versión simplificada del LR(1), que
combina el coste en tamaño (eficiencia)
GRAMATICAS LR de los métodos SLR con la potencia del
Los métodos de análisis sintáctico LR LR(1).
permiten reconocer la mayorıa de las Jerarquıa de las gramáticas:
construcciones de los lenguajes de
programación. Son métodos muy potentes,
con mayor poder de reconocimiento que los
métodos LL (Las gramáticas LL son un
subconjunto de las gramáticas LR).

Las gramáticas LR(k) se caracterizan porque:


 L: Procesamos la cadena de entrada de
izquierda a derecha (from leftto- right)
 R: proporcionan la derivación mas a la
derecha de la cadena de entrada en orden
inverso (rigth-most derivation)
 k: se examinan k-sımbolos de la entrada La diferencia que hace a los métodos LR más
por anticipado para tomar la decisión poderosos que los LL es que los primeros
sobre la acción a realizar. disponen de la información de la entrada y los
estados por lo que ha ido pasando el
Ventajas: es un método potente que permite analizador (la cadena que ha ido
reconocer la mayorıa de las construcciones reconociendo hasta ahora), mientras que los
de los lenguajes de programación con k=0,1. métodos LL solo disponen de la información
Es un método sin retroceso y por tanto de la entrada.
determinista.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
25
FACULTAD DE INGENIERIA

 para que una gramática sea LR(k) no-terminal de la parte izquierda de la


tenemos que ser capaces de reconocer la producción.
presencia del lado derecho de una
producción habiendo visto todo lo que Este mecanismo nos lo proporciona el
deriva del lado derecho y usando k- autómata Finito Determinista de elementos
sımbolos por anticipado. LR(0).
 para que una gramática sea LL(k) Definición de Elemento LR(0) y
tenemos que ser capaces de reconocer el Construcción del autómata Finito de
uso de una producción viendo solo los k- elementos LR(0)
sımbolos que derivan su lado derecho.
Modo de operación del análisis Un elemento de análisis sintáctico LR(0) de
ascendente: una gramática G, es una producción de G con
 La entrada formada por la serie de un punto en alguna posición del lado derecho.
componentes léxicos a reconocer. [ A 12 ]
 Un programa conductor que lee tokens
de la cadena de entrada de uno en uno y siendo A 12 una producción. Este punto
utiliza una pila para almacenar los separa la parte que se ha analizado hasta ese
sımbolos que va reconociendo y los momento, y por tanto esta en la cima de la
estados por los que pasa el analizador. pila, de la parte que se espera aun analizar,
 Una pila. El contenido de la pila es de la que es el resto de la cadena de entrada. Por
forma s0 X1S1X2S2 ... SmXm donde cada Xi ejemplo para la producción AXYZ tenemos
son sımbolos de la gramática que se van los posibles siguientes items LR(0):
reconociendo, Xi  (VT  VNT), y los Si son A  XYZ se espera en la entrada una
los estados por los que pasa el analizador. cadena derivable de XYZ
Los sımbolos terminales se introducen en A  XYZ se ha reconocido una
la pila mediante desplazamientos de la cadena derivable de X y se espera en
cadena de entrada a la pila, los no- la entrada una cadena derivable de
terminales se apilan como resultado de YZ
hacer una reducción. A  XYZ -
 La tabla de análisis sintáctico formada A  XYZ Item completo. Indica que
por dos partes. La primera parte es de la ya se ha reconocido por completo una
forma acción (sm, ai) indica que acción se cadena derivable de A. Hemos
debe de realizar si observamos en la encontrado el mango.
entrada el token ai y el analizador esta en
el estado sm. Las acciones posibles son: autómata finito de elementos LR(0)
desplazar, reducir, error, aceptar. La Los estados son los propios items LR(0).
segunda parte es de la forma ir_a (sm, Las transiciones son de la forma:
VNT) indica el estado al que tenemos que Si X  VT tenemos una transición
ir despues de hacer una reducción. [ A  X] [ A  X]
 Salida: la derivación mas a la derecha de
la cadena de entrada en orden inverso (de Si X  VT tenemos una transición
abajo hacia arriba).
[ A  X] [ A  X]
Definición de mango (handle):
Mango o asidero: conjunto de sımbolos y además
terminales y no-terminales en la cima de la [ A  X] [ X   ]  X 
pila que forman la parte derecha de una
producción y que se pueden reducir En el primer caso, cuando X  VT significa
sacándolos de la pila y sustituyéndolos por el que hemos reconocido X en la entrada y
estamos haciendo un desplazamiento del

U N I V E R S I D A D D E A Q U I N O B O L I V I A
26
FACULTAD DE INGENIERIA

terminal X desde la entrada a la cima de la del no-terminal al que se quiere reducir (sino
pila. En el segundo la interpretación es más seria un error).
complicada. Significa que hemos reconocido
un no-terminal como consecuencia de haber Se dice que una gramática es SLR(1) si la
hecho una reducción, por tanto tenemos que aplicación de las reglas anteriores no son
haber reconocido ese no terminal ambiguas. Es decir, una gramática es SLR(1)
previamente, por tanto tenemos que añadir sii se cumple para cada estado una de las
transiciones a estados que indiquen que siguientes condiciones:
vamos a reconocer ese no-terminal. además,  Para cada item de la forma A  X en
como no consumimos ningún token de la S con X terminal, no existe un item
entrada son  - transiciones. completo B    en S, con X 
SIG(B). Si no tendrıamos un conflicto
ANALISIS LR(0) desplaza-reduce.
El análisis LR(0) es el más sencillo de los  Para cada par de items completos A  
métodos ascendentes. No usa información de y B   en S, entonces
la entrada, el sımbolo de preanalisis, para SIG(A)SIG(B)=. De lo contrario se
decidir la acción a realizar. produciría un conflicto reduce-reduce.
Se dice que una gramática es LR(0) si la El aspecto de la tabla de análisis sintáctico
aplicación de las reglas anteriores no son cambia respecto al análisis LR(0), puesto que
ambiguas, es decir, que si un estado contiene un estado puede admitir desplazamientos o
un item de la forma A  , entonces no reducciones dependiendo del token en la
puede contener cualquier otro item. entrada. Por tanto, cada entrada debe tener
una etiqueta de desplazamiento o reducción.
Si se produjera eso aparecerıan conflictos. En ANALISIS LR(1)
efecto: Para solucionar este problema se introduce el
 Si tuviera además un item de la forma A método más general que existe, el llamado
 X con X terminal tendrıamos un análisis sintáctico LR(1). Este es el método
conflicto desplaza-reduce. más poderoso que existe, a costa de que se
 Si tuviera además un item de la forma B incrementa la complejidad (un factor de 10
  , se producirıa un conflicto reduce- respecto a los métodos que usan el AFD de
reduce. items LR(0)).
Por tanto, una gramática es LR(0) sii cada
estado es bien un estado de desplazamiento Las limitaciones del método LR(0) y SLR(1)
(contiene solo items que indican desplazar) o radican en que tienen en cuenta el sımbolo de
bien un estado de reducción (contiene un preanalisis después de la construcción del
único item completo). AFD de items LR(0), que por sı misma ignora
ANALISIS SLR(1) los sımbolos siguientes en la entrada.
Este tipo de análisis usa el AFD construido a Definición de Elemento LR(1) y
partir de elementos LR(0) y usa el token de la Construcción del autómata finito de
cadena de entrada para determinar el tipo de elementos LR(1)
acción a realizar. Este método consulta el
token de la entrada antes de realizar un Un elemento de análisis sintáctico LR(1) de
desplazamiento para tener seguro que existe una gramática G, es un par consistente de un
una transición correspondiente en el estado item LR(0) y un sımbolo de preanalisis.
en el que se encuentra el analizador (sino [A  , a]
serıa un error) y en el caso de que se tenga siendo A   un item LR(0) y a el token de
que hacer una reducción se comprueba que preanalisis.
el token actual pertenece al conjunto de SIG

U N I V E R S I D A D D E A Q U I N O B O L I V I A
27
FACULTAD DE INGENIERIA

Un item completo [A  , a], indica que ya 1. La siguiente gramática corresponde a


se ha reconocido por completo una cadena algunas de las listas validas en PROLOG.
derivable de A y reduciré siempre que en la Se pide:
entrada tenga el token a.
(a) Construir la tabla de análisis SLR(1).
autómata finito de elementos LR(1) (b) Eliminar los posibles conflictos que
Los estados son los propios items LR(1). aparecen, considerando que el
Las transiciones son de la forma: operador, es asociativo por la derecha.
Lista  [ ] | [ Termino ]
Si X  VT tenemos una transición Termino  Termino , Termino |
[ A  X, a] [ A  X, a] Lista | id

Si X  VT tenemos una transición 2. Dada la siguiente gramática que genera


bloques de código que pueden contener
[ A  X, a] [ A  X, a] declaraciones y sentencias. Se pide:
(a) Construir la colección de
y además  -transiciones elementos LR(1).
(b) Construir la tabla de análisis
[ A  X, a] [ X  , b]  X   y sintáctico LALR(1).
 b  PRIM (a) (c) Obtener la traza del análisis
LALR(1) para la cadena de
El estado inicial del AFD se obtiene entrada: begin d; d; s; s end
ampliando la gramática, como para el caso de
items LR(0), y poniendo como sımbolo de 3. Dada la siguiente gramática
preanalisis #. S  if E S | if E S else S | id
[S’  S, #] E  E and E | E or E | id | ( E )
que significa que reconoceremos una cadena (a) Construir la tabla de análisis
derivable de seguida del sımbolo #. sintáctico SLR(1).
Análisis LALR(1) (b) En el caso de que haya conflictos
Una modificación del método LR(1), llamada elegir la acción adecuada para que
método LALR(1) mantiene el poder del LR(k) el operador disyunción or tenga
y preserva la eficiencia del SLR(1). El análisis menor prioridad que el operador
LALR(1) se basa en la observación de que en conjunción and, y que ambos
muchos casos el tamaño grande del AFD de tengan asociatividad por la
items LR(1) se debe a la existencia de derecha; y que toda parte del else
muchos estados diferentes que tienen igual la de una sentencia condicional debe
primera componente, los items LR(0), y estar asociada al if mas proximo.
difieren solo de la segunda componente, los
sımbolos de preanalisis. 4. Demostrar que la siguiente gramática no
Lo que haremos es identificarlos como un es LR(1). ¿ Es LR(k) para algún k?
único estado combinando los sımbolos de S _ X Y a
preanalisis. Si el proceso esta bien hecho, X _a _ Y a b
llegaremos a un autómata como el de items Y c 
LR(0), excepto que cada estado tiene
sımbolos de preanalisis. 5. Construir la tabla de precedencias de
operadores para la siguiente gramática de
El algoritmo de análisis LALR(1) es idéntico al operadores de forma que la parte del else
LR(1). este asociada al if más cercano.
CUESTIONARIO WORK PAPER No. 6
S if C then S  if C then S else S  id

U N I V E R S I D A D D E A Q U I N O B O L I V I A
28
FACULTAD DE INGENIERIA

C01 Indica el contenido de la pila, la


entrada y la acción a realizar para la
entrada if 0 then id else id.

PROGRAMA DE CONTROL DE CALIDAD

WORK PAPER # 6

UNIDAD O TEMA: ANÁLISIS SEMANTICO

TITULO: Análisis Semántico

FECHA DE ENTREGA:

PERIODO DE EVALUACION: Etapa Final

LA FASE DE ANÁLISIS SEMÁNTICO ejemplo: el valor de una expresión, el tipo de


una variable, su ámbito, un trozo de código, el
En este tema se aborda el problema del número de argumentos de una función, etc.).
cálculo de información que no puede ser Los valores de los atributos se calculan
descrita por las gramáticas independientes mediante reglas semánticas asociadas a las
del contexto (GIC), y que por tanto, no se producciones gramaticales.
considera como parte del análisis sintáctico.
La información que se calcula en esta fase El análisis semántico incluye:
está relacionada con el significado (La
semántica) del programa y no con su  La construcción de la Tabla de Símbolos
estructura (la sintaxis). para llevar un seguimiento del significado
de los identificadores en el programa
Se asocia información a las construcciones (variables, funciones, tipos, parámetros y
del lenguaje de programación proporcionando método de paso de parámetros en
atributos a los símbolos de la gramática (por funciones, etc.).

U N I V E R S I D A D D E A Q U I N O B O L I V I A
29
FACULTAD DE INGENIERIA

 Realizar la comprobación e inferencia de de una variable, su ámbito de declaración, el


tipos en expresiones y sentencias (por número de argumentos de una función, etc.).
ejemplo, que ambos lados de una
asignación tengan tipos adecuados, que Conceptualmente, se analiza sintácticamente
no se declaren variables con el mismo la cadena de componentes
nombre, que los parámetros de llamada a léxicos de entrada, se construye el árbol de
una función tengan tipos adecuados, análisis sintáctico y después se recorre el
número de parámetros correcto, ) árbol, en un determinado orden para tener en
cuenta las dependencias, para evaluar las
A partir de la construcción del árbol de reglas semánticas en sus nodos.
análisis sintáctico, lo recorreremos
en un determinado orden y calcularemos en
cada nodo la información semántica
necesaria (el valor de una expresión, el tipo

Cadenas de Árbol análisis Grafo de Orden de


entrada sintáctico dependencias evaluación de
reglas semánticas

ATRIBUTOS Y GRAMÁTICAS DE independiente del contexto en la que cada


ATRIBUTOS símbolo gramatical (Terminal o no-terminal)
tiene asociado un conjunto de atributos.
Un atributo es cualquier propiedad de una Si X es un símbolo de la gramática, y a es un
construcción de un lenguaje de programación. atributo asociado a X, entonces escribiremos
Varían en función del tipo de información que X.a para denotar el atributo a asociado a X.
contienen, su complejidad de cálculo y el Dada una producción de la forma X0 X1
momento en el que son calculados (en tiempo X2 … Xn, el valor de los atributos Xi.aj para
de compilación (atributos estáticos) o de cada símbolo de la gramática se relacionan
ejecución (dinámicos)). entre si mediante lo que llamaremos
ecuaciones de atributos. Estas ecuaciones
Ejemplos típicos son: tienen la forma:
 El nombre de una variable
 El tipo de una variable Xi.aj = fij (X0.a1,…, X0.ak ,X1.a1,…,X1.ak,
 El ámbito de una variable …,Xn.a1,…, Xn.ak )
 El valor de una expresión
 El número de argumentos de una función En la práctica estas funciones matemáticas fij
 La posición en memoria de una variable suelen ser bastante sencillas y los atributos
suelen ser independientes unos de otros (o
 Un fragmento de código
como mucho dependientes entre varios).
Se llama enlace (binding) al proceso de
Las gramáticas de atributos se suelen escribir
calcular el valor del atributo y asociarlo a su
en forma tabular, con una parte donde
correspondiente construcción lingüística.
aparecen las producciones y otra donde
Puede ser enlace dinámico o estático según
aparecen las reglas semánticas (o ecuaciones
el momento en que se calcule.
de atributos) que permiten calcular los
atributos.
Una gramática de atributos es una
generalización de una gramática

U N I V E R S I D A D D E A Q U I N O B O L I V I A
30
FACULTAD DE INGENIERIA

Producción Reglas hacia el del lado izquierdo. Por ejemplo, para


Semánticas la entrada (4-3)*2, el árbol seria:

Producción 1 Ecuaciones de atributos


para producción 1
... ...
Producción n Ecuaciones de atributos
para producción n

Ejemplo 1. Consideremos la gramática para


la generación de expresiones aritméticas
simples: ¿Qué atributos nos interesan en esta
gramática?

E E +T\E - T\T
E T *F\F
F (E) \ num

El valor numérico de la expresión. Lo


denotaremos por val.
Las reglas semánticas para el cálculo de este
atributo serían:

Tipos de atributos

Los atributos se clasifican en función de cómo


se calculen en: atributos sintetizados y
atributos heredados.

Atributos sintetizados: Un atributo es


sintetizado si su valor depende de los valores
de los atributos de sus hijos. Se podrán
calcular a la vez que se realiza el análisis
sintáctico ascendente LR, desde las hojas a la
raíz.

Un atributo _ es sintetizado si, dada una


Nota: Si un símbolo aparece más de una vez producción
en una producción, entonces cada aparición la única ecuación de atributos que tenemos
debe ser distinguida de las otras apariciones, es de la forma:
para que los diferentes valores de las
ocurrencias sean distinguidos. A.a = f (X1.a1,…, X1.ak ,…, X1.a1,…,Xn.ak)
Los atributos se colocan al lado de los nodos Por ejemplo: el valor de una expresión en la
del árbol de análisis sintáctico y se dibujan las gramática del ejemplo anterior era un atributo
dependencias entre ellos. sintetizado.
Una flecha que va desde los atributos que Una gramática en la que todos los atributos
aparecen en la parte derecha de la ecuación son sintetizados se le llama gramática de
atributos-S.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
31
FACULTAD DE INGENIERIA

Atributos heredados: Un atributo es CUESTIONARIO WORK PAPER N O . 5


heredado si su valor depende de los valores
de los atributos de su padre y/o de sus 1. De una posible construccion sintactica
hermanos. para las siguientes expresiones de
tipo:
Por ejemplo: el tipo de una variable en la  intXpointer(int)  char
gramática anterior era un atributo heredado.  array(10; float)
 int
Las dependencias entre los atributos se
representan en un grafo. A partir de este se 2. Dado el siguiente subconjunto de
obtiene un orden de evaluación de las reglas producciones de nuestra gramatica:
semánticas. <expresion> --><expresion simple> {=
<expresion>| <relacion> <expresion>}
Árbol anotado o decorado: Defina el ETDS que implemente el
Es el árbol de análisis sintáctico al que se le chequeo de tipos segun el sistema de
han añadido los atributos. tipos dado como semantica.

MÉTODOS PARA LA EVALUACIÓN DE 3. Dada la siguiente gramatica:


LOS ATRIBUTOS P--> D ; A
D--> id : B , D | id : B
Se han propuesto varios métodos para la B--> real | integer
evaluación de las reglas semánticas: A--> id = E ; A | id = E
E--> E + T | T
 Métodos basados en grafos de T--> T * F | F
dependencias: en el momento de la F--> id | num | num.num
compilación estos métodos obtienen un
orden de evaluación a partir del grafo de 4. Construir un esquema de traduccion
dependencias sobre el árbol de análisis dirigido por la sintaxis que implemente un
sintáctico para la entrada dada (el chequeador de tipos teniendo en cuenta lo
programa fuente). Poco eficientes (en siguiente:
espacio y tiempo) porque necesitan
construir todo el árbol de análisis  + y * estan sobrecargados;
sintáctico y sobre el, el grafo de  No se permite coercion de
dependencias para cada entrada. tipos;
Posibilidad de ciclos.  Considere, de acuerdo a su
criterio, las acciones a llevar a
 Métodos basados en reglas: en el cabo respecto a los
momento de la construcción del identificadores no declarados y
compilador, para cada producción queda duplicados;
predeterminado por el diseñador del 5. En el caso de intercambiar en la
compilador el orden de evaluación de los gramatica del ejercicio anterior las
atributos de esa construcción lingüística, y producciones:
así la forma de recorrer el árbol para
calcular ese atributo (prefija, infija, B --> real | integer por B --> <nro1> ..
postfija). No siempre será necesario <nro2>
construir el árbol de análisis sintáctico
para después recorrerlo, los atributos donde <nroi> es un entero no negativo
sintetizados se pueden calcular a la vez y nro1 < nro2 y para asignar un valor a
que se realiza el análisis sintáctico. una

U N I V E R S I D A D D E A Q U I N O B O L I V I A
32
FACULTAD DE INGENIERIA

variable, este debe estar incluido en el


rango con que fue declarada la
variable. Es posible que el chequeador
de tipos controle que el valor de una
variable este en el rango en la cual fue
declarada?

6. Dada la siguiente expresion generada


por la gramatica de nuestro lenguaje:
a = 2 _ b + (c = 2)

Analize como sera el chequeador


de tipos para el sistema de tipos
dado por la semantica. Implemente
un ETDS e incorporelo al parser
descendente recursivo.

U N I V E R S I D A D D E A Q U I N O B O L I V I A
33
PROGRAMA DE CONTROL DE CALIDAD

DIF´s # 1

UNIDAD OTEMA: GENERACIÓN DE CODIGO


TITULO: Ambientes para el momento de la ejecución.
FECHA DE ENTREGA:

Al momento de desarrollar un compilador, debemos tomar en cuenta el ambiente para el momento de


la ejecución de un código fuente, así también la administración de la memoria.
Para esto tome como puntos de análisis los siguientes puntos:

 Estrategias que deben tomarse en cuenta para la asignación de memoria.


 Tablas de dispersión (tablas hash)
 Asignación explicita de bloques de tamaño fijo
 Asigna la memoria en C++
 Asigna la memoria en Java

Además de la bibliografía de la materia, puede utilizar la siguiente:

http://148.204.45.33:8080/cursos/compiladores%20Ago-Dic2003/compilers.htm

CONCLUSIONES (deberán sintetizar la opinión del grupo):

COMENTARIOS (deberán sintetizar la opinión del grupo):


GRUPO (máximo cinco integrantes):
AP. PATERNO AP. MATERNO NOMBRES FIRMA

PROGRAMA DE CONTROL DE CALIDAD

DIF´s # 2

UNIDAD OTEMA: GENERACIÓN DE CODIGO


TITULO: Optimización de código
FECHA DE ENTREGA:

En la mayoría de los casos no hace falta optimizar el código, pero la optimización de código es
necesaria en programas de calculo intensivo que efectúan millones de operaciones en amplios
intervalos de tiempo, también es necesario desarrollar programas que puedan dar respuestas de
forma extremadamente rápida antes unos determinados datos de entrada, para ello debemos conocer
las técnicas que existen para llevar a cabo la optimización del código fuente sin intervención del
usuario programador.
Para este tema analicé los siguientes puntos:

 Optimizaciones que no modifican la estructura.


 Escribir código claro y simple.
 Bloque Básico
 Optimización dentro de bucles

Además de la bibliografía de la materia, puede utilizar la siguiente:


http://www.ual.es/~jjfdez/IC/Practicas/optim.html
www.di.uniovi.es/~rrobles/ceesi/apuntes/Optima.pdf
www.cvc.uab.es/shared/teach/a25002/TEMA3.PPT

CONCLUSIONES (deberán sintetizar la opinión del grupo):

COMENTARIOS (deberán sintetizar la opinión del grupo):

GRUPO (máximo cinco integrantes):


AP. PATERNO AP. MATERNO NOMBRES FIRMA

También podría gustarte