Está en la página 1de 6

UNIVERSIDAD MARIANO GÁLVEZ DE GUATEMALA

DIRECCIÓN DE CENTROS UNIVERSITARIOS

Alumno(a): __________NERY ALEXANDER CASTILLO JIMENEZ______ Carné: __0905-18-6133__ Clave: _____

Centro Universitario de: Cuilapa, Santa Rosa.


Asignatura: Código: Fecha:
Compiladores 035 24/04/2021
Ciclo: Sección: Semestre: Año: Duración de la evaluación:
Séptimo B Primero 2021 2 horas
Catedrático(a): Código catedrático(a)
Ing. Gilberto Argueta 2516

Clase de evaluación: Primer parcial Segundo parcial Final Recuperación Extraordinario


(Indicar abajo de la casilla con una X
“x” qué clase de evaluación es)
Notas e instrucciones generales: Escala de Puntuación y valoración Firma y sello de
No se permite la consulta entre compañeros. coordinación de carrera
El examen es individual.
No se permite contestar celular.
Detalle cada uno de los problemas. Absoluta: 20
Conteste en forma clara y ordenada. Relativa: 100%
No se permite el uso de formularios. Variante: A

Instrucciones Generales: Resuelva lo mejor posible cada uno de los temas que se le presentan.
Sea claro y ordenado.

Serie 1 (5 puntos)

¿Cuál es la función del analizador Léxico?, Realice el diagrama de las interacciones entre el
analizador Léxico y el analizador sintáctico.

Su principal función consiste en leer los caracteres de entrada y elaborar como salida una
secuencia de componentes léxicos que utiliza el analizador sintáctico para hacer el análisis. Esta
interacción, suele aplicarse convirtiendo al analizador léxico en una subrutina o corrutina del
analizador sintáctico.

Como paso intermedio en la construcción de un analizador léxico, primero se produce un


diagrama de flujo estilizado, llamado diagrama de transiciones. Los diagramas de transiciones
representan las acciones que tienen lugar cuando el analizador léxico es llamado por el analizador
sintáctico para obtener el siguiente componente léxico.
¿Qué son los centinelas?

La forma descrita, debemos verificar, cada vez que movemos el apuntador avance, que no nos
hayamos salido de uno de los búferes; si esto pasa, entonces también debemos recargar el otro
búfer. Así, por cada lectura de caracteres hacemos dos pruebas: una para el final del búfer y la
otra para determinar qué carácter se lee (esta última puede ser una bifurcación de varias vías).
Podemos combinar la prueba del final del búfer con la prueba del carecer actual si extendemos
cada búfer para que contenga un valor centinela al final. El centinela es un carácter especial que
no puede formar parte del programa fuente, para lo cual una opción natural es el carácter eof. pero
con los centinelas agregados. Observe que eof retiene su uso como marcador del final de toda la
entrada.

¿A qué se refiere el concepto de carácter adelantado?

Lee de manera automática un carácter adelante del último carácter que forma el lexema
seleccionado, y después regresa la entrada para que sólo se consuma el propio lexema de la
entrada. No obstante, algunas veces puede ser conveniente que cierto patrón coincida con la
entrada, sólo cuando vaya seguido de ciertos caracteres más. De ser así, tal vez podamos utilizar
la barra diagonal en un patrón para indicar el final de la parte del patrón que coincide Maq.
Cap_3_AHO.indd 144 11/10/07 12:49:05 AM con el lexema. Lo que va después de / es un patrón
adicional que se debe relacionar antes de poder decidir que vimos el token en cuestión, pero que
lo que coincide con este segundo patrón no forma parte del lexema.

¿Cuáles son los dos tipos qué pueden ser los autómatas finitos?

(a) Los autómatas finitos no deterministas (AFN) no tienen restricciones en cuanto a las etiquetas
de sus líneas. Un símbolo puede etiquetar a varias líneas que surgen del mismo estado, y , la
cadena vacía, es una posible etiqueta.

(b) Los autómatas finitos deterministas (AFD) tienen, para cada estado, y para cada símbolo de
su alfabeto de entrada, exactamente una línea con ese símbolo que sale de ese estado.

Indique que es un buffer y como se usan.

Por ejemplo, no podemos estar seguros de haber visto el final de un identificador sino hasta ver un
carácter que no es letra ni dígito, y que, por lo tanto, no forma parte del lexema para id. En C, los
operadores de un solo carácter como −, = o < podrían ser también el principio de un operador de
dos caracteres, como −>, == o <=. Por ende, vamos a presentar un esquema de dos búferes que
se encarga de las lecturas por adelantado extensas sin problemas. Después consideraremos una
mejora en la que se utilizan “centinelas” para ahorrar tiempo al verificar el final de los búferes.

Un esquema importante implica el uso de dos búferes que se recargan en forma alterna, como se
sugiere en la figura
¿Qué es un analizador sintáctico y cuál es su función?

(analizador sintáctico) utiliza los primeros componentes de los tokens producidos por el analizador
de léxico para crear una representación intermedia en forma de árbol que describa la estructura
gramatical del flujo de tokens. Una representación típica es el árbol sintáctico, en el cual cada
nodo interior representa una operación y los hijos del nodo representan los argumentos de la
operación. En la figura se muestra un árbol sintáctico para el flujo de tokens como salida del
analizador sintáctico. Este árbol muestra el orden en el que deben llevarse a cabo las operaciones
en la siguiente asignación:

¿Qué son los errores sintácticos?

Incluyen la colocación incorrecta de los signos de punto y coma, además de llaves adicionales o
faltantes; es decir, “{” o “}”. Como otro ejemplo, en C o Java, la aparición de una instrucción case
sin una instrucción switch que la encierre es un error sintáctico (sin embargo, por lo general, esta
situación la acepta el analizador sintáctico y se atrapa más adelante en el procesamiento, cuando
el compilador intenta generar código).

Liste y defina cada una de las estrategias para recuperarse de los errores.

Recuperación en modo de pánico: Con este método, al describir un error el analizador sintáctico
descarta los símbolos de entrada, uno a la vez, hasta encontrar un conjunto designado de tokens
de sincronización. Por lo general, los tokens de sincronización son delimitadores como el punto y
coma o}, cuya función en el programa fuente es clara y sin ambigüedades. El diseñador del
compilador debe seleccionar los tokens de sincronización apropiados para el lenguaje fuente.
Aunque la corrección en modo de pánico a menudo omite una cantidad considerable de entrada
sin verificar errores adicionales, tiene la ventaja de ser simple y, a diferencia de ciertos métodos
que consideraremos más adelante, se garantiza que no entrará en un ciclo infinito.

Recuperación a nivel de frase: Al descubrir un error, un analizador sintáctico puede realizar una
corrección local sobre la entrada restante; es decir, puede sustituir un prefijo de la entrada restante
por alguna cadena que le permita continuar. Una corrección local común es sustituir una coma por
un punto y coma, eliminar un punto y coma extraño o insertar un punto y coma faltante. La
elección de la corrección local se deja al diseñador del compilador. Desde luego que debemos
tener cuidado de elegir sustituciones que no nos lleven hacia ciclos infinitos, como sería, por
ejemplo, si siempre insertáramos algo en la entrada adelante del símbolo de entrada actual.

Producciones de errores: Al anticipar los errores comunes que podríamos encontrar, podemos
aumentar la gramática para el lenguaje, con producciones que generen las construcciones
erróneas. Un analizador sintáctico construido a partir de una gramática aumentada por estas
producciones de errores detecta los errores anticipados cuando se utiliza una producción de error
durante el análisis sintáctico. Así, el analizador sintáctico puede generar diagnósticos de error
apropiados sobre la construcción errónea que se haya reconocido en la entrada.
Corrección global: Lo ideal sería que un compilador hiciera la menor cantidad de cambios en el
procesamiento de una cadena de entrada incorrecta. Hay algoritmos para elegir una secuencia
mínima de cambios, para obtener una corrección con el menor costo a nivel global. Dada una
cadena de entrada incorrecta x y una gramática G, estos algoritmos buscarán un árbol de análisis
sintáctico para una cadena y relacionada, de tal forma que el número de inserciones,
eliminaciones y modificaciones de los tokens requeridos para transformar a x en y sea lo más
pequeño posible. Por desgracia, estos métodos son en general demasiado costosos para
implementarlos en términos de tiempo y espacio, por lo cual estas técnicas sólo son de interés
teórico en estos momentos.

Defina lo que es una gramática libre de contexto.

las gramáticas para describir en forma sistemática la sintaxis de las construcciones de un lenguaje
de programación, como las expresiones y las instrucciones. Si utilizamos una variable sintáctica
instr para denotar las instrucciones, y una variable expr para denotar las expresiones, la siguiente
producción:

especifica la estructura de esta forma de instrucción condicional. Entonces, otras


producciones definen con precisión lo que es una expr y qué más puede ser una instr. En esta
sección repasaremos la definición de una gramática libre de contexto y presentaremos la
terminología para hablar acerca del análisis sintáctico. En especial, la noción de derivaciones es
muy útil para hablar sobre el orden en el que se aplican las producciones durante el análisis
sintáctico.

¿Qué son las gramáticas LL(1)?

Los analizadores sintácticos predictivos, es decir, los analizadores sintácticos de descenso


recursivo que no necesitan rastreo hacia atrás, pueden construirse para una clase de gramáticas
llamadas LL(1). La primera “L” en LL(1) es para explorar la entrada de izquierda a derecha (por left
en inglés), la segunda “L” para producir una derivación por la izquierda, y el “1” para usar un
símbolo de entrada de anticipación en cada paso, para tomar las decisiones de acción del análisis
sintáctico.
Serie 2 (15 puntos)

1)
Divida el siguiente programa en C++:
float cuadradoLimitado(x) float x {
/* devuelve x al cuadrado, pero nunca más de 100 */
return (x<=−10.0||x>=10.0)?100:x*x;
}
en lexemas apropiados, ¿Qué lexemas deberían obtener valores léxicos asociados? ¿Cuáles deberían ser
esos valores?

<float> <id, cuadradolimitado> <(> <id, x> <)> <{>


<float> <id, x>
<return> <(> <id, x> <op,"<="> <num, -10.0> <op, "||"> <id, x> <op, ">="> <num, 10.0>
<)> <op, "?"> <num, 100> <op, ":"> <id, x> <op, "*"> <id, x>
<}>

2)
Suponga que tenemos dos tokens: (1) la palabra clave if y (2) los identificadores, que son cadenas de letras
distintas de if. Muestre:

a) El AFN para estos tokens.

b) El AFD para estos tokens.


3)
Considere la siguiente gramática libre de contexto:

S→SS+|SS∗|a

y la cadena aa + a∗.

a) Proporcione una derivación por la izquierda para la cadena.

S =lm=> SS* => SS+S* => aS+S* => aa+S* => aa+a*

b) Proporcione una derivación por la derecha para la cadena.

S =rm=> SS* => Sa* => SS+a* => Sa+a* => aa+a*

c) Proporcione un árbol de análisis sintáctico para la cadena.

d) ¿La gramática es ambigua o no? Justifique su respuesta.

Es ambigua “se pueden emplear los términos confuso, oscuro, incierto, turbio, indetermi-
nado, dudoso, entre otros”.

e) Describa el lenguaje generado por esta gramática.

El conjunto de todas las expresiones postfijas consta de suma y multiplicación

También podría gustarte