UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
LUIS JONATHAN CHISIQUINGA ESPINOZA
EJERCICIOS SECCION 1.1 1.- CUAL ES LA DIFERENCIA ENTRE UN COMPILADOR Y UN INTERPRETE? COMPILADOR Lee un programa en un lenguaje (lenguaje fuente) y traducirlo a otro lenguaje (lenguaje destino)
INTERPRETE No produce programa destino, da la apariencia de ejecutar directamente las operaciones especificadas en el programa origen
Detecta cualquier error en el programa mientras lo traduce 2.- ¿CUALES SON LAS VENTAJAS DE (A) UN COMPILADOR SOBRE UN INTERPRETE, Y (B) LAS DE UN INTERPRETE SOBRE UN COMPILADOS? Compilador El programa destino del compilador, es más rápido que un intérprete al momento de asignar las entradas a las salidas
interprete El intérprete puede ofrecer mejores diagnósticos de error que un compilador, ya que ejecuta el programa fuente instrucción por instrucción
3.- QUE VENTAJAS HAY PARA UN SISTEMA DE PROCESAMIENTO DE LENGUAJES EN EL CUAL EL COMPILADOR PRODUCE LENGUAJE ENSAMBLADOR EN VEZ DE LENGUAJE MAQUINA? El lenguaje ensamblador es todavía más entendible ya que usa símbolos que representan dichas operaciones pero este se acerca mucho al lenguaje de una máquina que es el binario. 4.- A UN COMPILADOR QUE TRADUCE UN LENGUAJE DE ALTO NIVEL A OTRO LENGUAJE DE ALTO NIVLE SE LE LLAMA TRADUCTOR DE source-to-source. ¿Qué VENTAJAS HAY EN CUANTO AL USO DE C COMO LEGUAJE DESTINO PARA UN COMPILADOR? “C” es un lenguaje de medio nivel pero con muchas características de bajo nivel y dispone de las estructuras típicas de los lenguajes de alto nivel pero también permite control a muy bajo nivel y los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C , entonces aquí C utilizaría un compilador de alto nivel o el source to source. 5.- DESCRIBA ALGUNAS DE LAS TAREAS QUE NECESITA REALIZAR UN ENSAMBLADOR Es un lenguaje de programación de bajo nivel que Traduce el lenguaje ensamblador a lenguaje máquina ya que usa código binario usualmente se ocupa para los microprocesadores y utiliza operaciones aritméticas y lógicas. EJERCICIOS SECCION 1.3 1.- INDIQUE CUAL DE LOS SIGUIENTES TERMINOS: a) imperativo
b) declarativo
c) von Neumann
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES d) orientado a objetos
e) funcional
LUIS JONATHAN CHISIQUINGA ESPINOZA
f) de tercera generación
g) de cuarta generación h) secuencias de comandos se aplican a los siguientes lenguajes 1) C
2) C++ 3) Cobol
4) Fortran
5) Java
6) Lisp
7) ML 8) Perl
9) Python
10) VB
SOLUCION:
a) C++, Java e) ML
b) ML
c) C, Fortran
f) C, C++, Cobol, Fortran, Java, Lisp
d) C++, Java, VB
h) Perl, Python
EJERCICIOS SECCION 1.6 1.- PARA EL CODIGO EN C ESTRUCTURADOS POR BLOQUES DE LA FIGURA 1.13(a), INDIQUE LOS VALORES ASIGNADOS A w,x,y Y z
𝑤 = 13, 𝑥 = 9, 𝑦 = 13, 𝑧 = 9
2.- REPITA EL EJERCICIO 1 PARA EL CODIGO DE LA FIGURA 1.13(b)
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
𝑤 = 9, 𝑥 = 7, 𝑦 = 13, 𝑧 = 7
LUIS JONATHAN CHISIQUINGA ESPINOZA
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
LUIS JONATHAN CHISIQUINGA ESPINOZA
3.- PARA EL CODIGO ESTRUCTURADO POR BLOQUES DE LA FIGURA 1.14, SUPONIENDO EL ALCANCE ESTATICO USUAL DE LAS DECLARACIONES, DE EL ALCANCE PARA CADA UNA DE LAS DOCE DECLARACIONES.
DECLARACION
ALCANCE
w del B1 x del B1 y del B1 z del B1 x del B2 z de B2 w de B3 w de B4 x de B4 y de B5 z de B5
B1;B2 B1 B1;B2;B3;B4 B1;B4 B2 B2;B3 B3 B4;B5 B4;B5 B5 B5
4.- ¿QUE IMPRIME EL SIGUIENTE CODIGO?
32 EJERCICIOS PARA LA SECCION 2.2 1.- CONSIDERE LA SIGUIENTE GRAMATICA LIBRE DE CONTEXTO 𝑆 → 𝑆𝑆 + | 𝑆𝑆 ∗| 𝑎 a) Muestre como puede generarse la cadena aa+a* mediante esta gramática.
S → SS ∗ S → (SS +)S ∗ S → (SS +)a ∗ S → (aa +)a ∗
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
LUIS JONATHAN CHISIQUINGA ESPINOZA
S → aa + a ∗ b) Construya un árbol de análisis sintáctico para esta cadena.
S S
S
*
S
a
*
S
S
+
a
a
+
c) ¿Qué lenguaje genera esta gramática? Justifique su respuesta. Genera un lenguaje regular ya que se genera a partir de un lenguaje básico 2.- ¿Qué LENGUAJE SE GENERA MEDIANTE LAS SIGUIENTE GRAMATICAS? EN CADA CASO JUSTIFIQUE SU RESPUESTA. a) 𝑆 → 0𝑆1 | 01
𝑆 → 0 (01)1 𝑆 → 0 011 Genera una secuencia de ceros seguida por una secuencia de unos. b) 𝑆 → +𝑆𝑆|−𝑆𝑆| 𝑎
S −> −SS S −> −S(+SS) S −> −a + aa Genera un conjunto de sumas o restas de a’s. c) 𝑆 → 𝑆(𝑆)𝑆 |𝜖 Genera un conjunto vacío o conjunto de paréntesis d) 𝑆 → 𝑎𝑆𝑏𝑆 | 𝑏𝑆𝑎𝑆| 𝜖
S → aSbS S → aSbS
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
LUIS JONATHAN CHISIQUINGA ESPINOZA
S → a(bSaS)bS S → abSaSbs Genera un secuencia de a y b o vacío. e) 𝑆 → 𝑎 | 𝑆 + 𝑆 | 𝑆𝑆 | 𝑆 ∗|(𝑆)
S → (S ) S → (S ∗) S → (SS ∗) S → (S + SS ∗) S → (a + aa ∗) Genera una secuencia de a's que pueden ser vacías o todo lo anterior entre paréntesis. 3.- ¿Cuáles DE LAS GRAMATICAS EN EL EJERCICIO 2 SON AMBIGUAS?
Las gramáticas b) y d) son ambiguas. EJERCICIOS SECCION 2.3 1.- CONSTRUYA UN ESQUEMA DE LA TRADUCCION ORIENTADO A LA SINTAXIS, QUE TRADUZCA EXPRESIONES ARITMETICAS DE LA NOTACION INFIJA A LA NOTACION PREFIJA, EN LA CUAL UN ORDENADOR APARAECE ANTES DE SUS OPERANDOS; POR EJEMPLO, -xy ES LA NOTACION PREFIJA PARA x – y. PROPORCIONE LOS ARBOLES DE ANALISIS SINTACTICO ANOTADO PARA LAS ENTRADAS 9-5+2 Y 9-5*2 2+5-9
2*5-9
259-+
259-*
+-952
*-952
Expr -> expr - term {print(‘-’)}
Expr -> expr - term {print(‘-’)}
Expr -> expr + term {print(‘+’)}
Expr -> expr * term {print(‘*’)}
Expr -> term
Expr -> term
Term -> 0
print {(‘0’)}
Term -> 0
print {(‘0’)}
Term -> 1
print {(‘1’)}
Term -> 1
print {(‘1’)}
Term -> 2
print {(‘2’)}
Term -> 2
print {(‘2’)}
…… Term -> 9
…… print {(‘9’)}
Term -> 9
print {(‘9’)}
UNIVERSIDAD CENTRAL DEL ECUADOR INGENIERIA INFORMATICA LENGUAJES Y COMPILADORES
LUIS JONATHAN CHISIQUINGA ESPINOZA
2.-CONSTRUYA UN ESQUEMA DE TRADUCCION ORIENTADO A LA SINTAXIS, QUE TRADUZCA EXPRESIONES ARITMETICAS DE LA NOTACION POSTFIJA A LA NOTACION INFIJA. PROPORCIONE LOS ARBOLES DE ANALISIS SINTACTICO ANOTADOS PARA LAS ENTRADAS 95-2* Y 925*-.
Expr -> expr |term - {print(‘term’)}
Expr -> expr| term * {print(‘term’)}
Expr -> term |term * {print(‘term’)} Expr -> term
Expr -> expr |term - {print(‘term’)} Expr -> term
Term -> 0
print {(‘0’)}
Term -> 0
print {(‘0’)}
Term -> 1
print {(‘1’)}
Term -> 1
print {(‘1’)}
Term -> 2
print {(‘2’)}
Term -> 2
print {(‘2’)}
…… Term -> 9
…… print {(‘9’)}
Term -> 9
print {(‘9’)}