Trabajos prácticos
ATENCIÓN
Al finalizar el bloque de ejercicios de cada uno de los trabajos prácticos se debe
subir al Aula Virtual, mediante los enlaces previstos a tal efecto, en un archivo
comprimido ZIP o RAR (ver **), conteniendo los ejercicios resueltos en las clases
prácticas de acuerdo a lo siguiente, según corresponda:
- Cada uno de los archivos fuente con el código de los programas en C y JS
desarrollados durante las prácticas. El nombre de los archivos deberá
comenzar con C o JS seguido del número de ejercicio al que corresponde.
- Cada uno de los archivos correspondientes a los diagramas de grafos
(árboles, autómatas, diagramas sintácticos u otros tipos de esquemas de
grafos) generados con la herramienta JFLAP. El nombre de cada archivo
fuente será el correspondiente al número de ejercicio.
- Un único archivo en formato .doc, .docx, .pdf o .txt, conteniendo las
respuestas a cuestiones planteadas no comprendidas en los casos
anteriores, las cuales se deben identificar con el número de ejercicio al que
corresponden.
** El nombre del archivo comprimido debe estar formado por las letras
TP seguidas de su número de legajo
TRABAJO PRÁCTICO
1. GRAMÁTICAS Y LENGUAJES FORMALES
1. ►Sea el vocabulario V={1, 2}. Indique cinco de las cadenas pertenecientes aV* y V+.
2. Sean los vocabularios V={i,x} y W={i,v,c}. Defina por extensión:
a) V3 b) W* c) V.W
3. ►Sea { 000 010, 10 01 } para la palabra “1010”, obtenga las derivaciones a derecha.
4. Sea { 000 010, 10 01 } para la palabra “1000”, obtenga las derivaciones a izquierda.
5. ►Defina los conjuntos P de la gramática de G = { {S, A, B, C}, {0, 1}, S, P } que reconozca:
001010
6. Defina los conjuntos P de la gramática de G = { {S, A, B, C}, {0, 1}, S, P } que reconozca:
000101
7. ►Definir las reglas de una gramática Tipo 2 en base a la especificación dada, que
reconozca el lenguaje:
L1 = {wncwn / w ε {a, b} n > 0}
G1 = ({A, S}, {a, b, c}, P, S)
9. Defina las reglas de producción para el lenguaje: L1 = { an c bm / n > 0 y m ≥ 0 }
10. ►Para la especificación dada dibuje el árbol de derivación para: a a c b b
P = { e0 a e1, e1 a e1 | c e2, e2 b e2 }
11. Sea la cuádrupla es G = ({S,A,B}, {0, 1}, P, S) con el siguiente conjunto de producciones,
indique 3 cadenas válidas diferentes y dibuje los respectivos árboles de derivación:
P : { S -> A1B, A -> 0A | λ, B -> 0B | 1B | λ }
12. Dibuje el árbol de derivación para la cadena z = (x + y) * z correspondiente a la siguiente
gramática:
ASSIGN -> ID ‘=’ EXPR
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 2
TRABAJO PRÁCTICO
ID -> ‘x’ | ‘y’ | ‘z’
EXPR -> ID ‘+’ EXPR | EXPR ‘*’ ID | ‘(‘ EXPR’)’ | ID
13. Verificar si la siguiente gramática, genera cadenas ambiguas, en cuyo caso dar los
ejemplos.
G = ({‘a’, ‘+’, ‘*’, ‘(‘, ‘)’}, {S}, S, P)
P = {S := ‘a’, S := S ‘+’ S, S := S * S, S := S}
14. ►Construya una gramática regular no ambigua que genere todas las cadenas de 0 y 1 en
las cuales los 0, si aparecen, lo hacen en grupos individuales de a tres.
Ej. cadenas que pertenecen al lenguaje Ej. cadenas que NO pertenecen al lenguaje
1,11111, 000, 1000, 1110001000 0, 00, 11000011, 000000, 000100
15. Escriba las reglas de producción para la gramática G1, no ambigua, que reconoce el
lenguaje L1.G1 = ({A}, {a, b, c}, P, S1) L1 = {wcwR / w Є {a | b} y R > 0}
16. ►Completar las reglas de producción para la gramática.
Sea G = ({A, B}, {a}, P, S) una gramática regular lineal a derechaque genera L = {a2n / n ≥ 0}
S→ε S→?
A →aB A →?
B →?
17. Completar las reglas de producción para la gramática.
Sea G = ({A, B, C}, {0, 1, 2, 3}, P, S) que genera: L = {0i 1i+k 2k 3n+1 / i, k, n ≥ 0 }
S→ ABC S→?
S→ BC S→?
A → 0A1 A →?
B → 1B2 B →?
C → 3C C→?
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 3
TRABAJO PRÁCTICO
2. NOTACIONES PARA ESPECIFICAR SINTAXIS
18. ►Dibuje el diagrama sintáctico equivalente:
ModDeclaration -> MODULE ident [priority] ; {Import} Block ident.
19. ►Exprese el equivalente del siguiente diagrama sintáctico, en notación EBNF:
Declaration
20. Dibuje el diagrama sintáctico equivalente:
<list> ::= <alternative> { ‘|’ <alternative> }[ <else> ]
21. Exprese el equivalente del siguiente diagrama sintáctico, en notación EBNF y BNF:
22. ►Re-escriba la expresión en notaciones pre y post fija. Dibuje el árbol de evaluación.
(x1 + x2) – x3 + (x4 / x5 + x6)
23. Re-escriba las expresiones en notaciones pre y post fija. Dibuje el árbol de evaluación.
a + b * c / d
a * (b + c / 3) * d – k
(b / 2 + b * b – 4 * x – 2 * y) / (2 + a)
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 4
TRABAJO PRÁCTICO
3. MÁQUINAS SECUENCIALES Y AUTÓMATAS
24. ►Para el siguiente autómata determine la expresión normal (regular) y su equivalente
en notación BNF:
25. ►Para la siguiente expresión: A.((A | B).C)*.C construya el AEFD. Realice la
descripción en forma gráfica, funcional y tabular.
26. Sea la expresión regular: a*.b.a*.b.(a|b)* construya el AEFD. Realice la descripción en
forma gráfica, funcional y tabular.
27. Determine la expresión regular para:
{ S -> b A, S -> a B, A -> a S, B -> b S }
28. ►Describa el autómata para la siguiente gramática G = { {S, A, B, C}, {x, y}, S, P } donde
P = { S ->xA, S ->yB, A ->xC, A ->yA, A ->λ, B ->xC, B ->yB, B ->λ, C ->λ }
29. Dada la siguiente especificación dibuje de autómata: L1 = {ancbm/ n > 0 y m ≥ 0 }
M ={ Q, ∑, f, e0, F }
Q = { e0, e1, e2 }
∑ = { a, b, c }
ei = e0
F = { e2 }
30. ►Obtenga el AFD equivalente para el AFND, dibuje el autómata AFD indicando a
cuáles nodos del AFND, representa cada nodo. Describa la tabla completa de transiciones
P(Q).
31. Obtenga el AFD equivalente para el AFND, dibuje el autómata AFD indicando a cuáles
nodos del AFNDoriginal, representa cada nodo.
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 5
TRABAJO PRÁCTICO
32. ►Obtenga el autómata equivalente mínimo para:
33. ►Obtenga el autómata equivalente mínimo. Indicar la secuencia de conjuntos partición
obtenidos y dibujar el autómata resultante.
34. Para el siguiente AFND, encuentre el AFD equivalente, dibuje el autómata AFD
indicando a cuáles nodos del AFND original, representa cada nodo.
35. Obtenga el autómata equivalente mínimo. Indicar la secuencia de conjuntos partición
obtenidos y dibujar el autómata resultante.
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 6
TRABAJO PRÁCTICO
Convención a usar con los AP: los símbolos en la pila se insertan en sentido
36. ►Definir el APD reconocedor para el siguiente lenguaje:L = { a2nbn / n >= 0 }
a)por vaciado de pila.
b)por alcance del estado final.
c) vaciado de pila y alcance del estado final.
37. Definir losAPD equivalentes que reconocenL = {1n0n-1 con n > 0} por:
a) vaciado de pila.
b) alcance del estado final.
c) vaciado de pila y alcance del estado final.
38. Definir los APD equivalentes que reconocen L = { XnYn : n ≥ 0 } por:
a) vaciado de pila.
b) alcance del estado final.
c) vaciado de pila y alcance del estado final.
39. Defina el APD que reconoce el lenguaje L = { xR / R es par > 0 } para la siguiente
especificación:
A = ( Σe, Γ, Q, a0, q0, F, f, g )
{x}: alfabeto de entrada {x, #}: alfabeto de la pila
{q0, q1, q2}: conjunto de estados #: símbolo inicial de la pila
q0: estado inicial {q2}: estado final
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 7
TRABAJO PRÁCTICO
4. ÁRBOLES DE ANÁLISIS
40. ►En base al documento con las reglas de sintaxis del lenguaje C ([Link]), dibuje los
árboles de análisis paralos siguientes enunciados, suponiendo análisis:
while (x < y)
if (x % 2 == 0) x = x + 1;
elsex = x + 2;
41. En base al documento con las reglas de sintaxis del lenguaje C ([Link]), dibuje los
árboles de análisis para los siguientes enunciados:
for (k = 1; k < 10; k++) {
if ( k < 5) j++;
elsej += 2;
}
Los siguientes ejercicios deben resolverse usando la aplicación Java
GoldParserGenerator. Para esto seguir los siguientes pasos:
1. Descargar el archivo y descomprimirlo.
2. En el directorio o carpeta donde se instale, escribir el texto del código a analizar en el archivo
codigo.c o [Link], según el caso.
3. Modificar el archivo [Link]:
a. en la primera línea colocar el nombre del archivo a utilizar [Link] [Link],
según el caso.
b. En la segunda línea escribir el nombre del archivo fuente a analizar: codigo.c o [Link],
según el caso.
4. Es cribir en la consola el comando: java -jar [Link] > [Link]
5. En el archivo [Link] quedará el texto resultante del proceso, indicando en la última línea si fue
exitoso (con OK) o si hubo ERROR. En caso de error analice la secuencia de procesamiento,
descubra dónde ocurrió, corrija el archivo fuente respectivo y verifique nuevamente.
42. ►Escriba ejemplos en C para los generadores indicados, en base a la gramática en C-
[Link], y verifique su correcto análisis utilizando la aplicación GoldParserGenerator.
<Expr> <Op Assign> <Stm>
<VarDecl> <FuncDecl>
43. Escriba dos ejemplos diferentes en JavaScript para los generadores indicados, en base a
la gramática en [Link], y verifique su correcto análisis utilizando la aplicación
GoldParserGenerator.
<Program> <Function Declaration> <Variable Statement>
44. ►Dibuje el árbol de derivación para las siguientes expresiones, luego según las
declaraciones y asignaciones de valores. Indique los resultados considerando la secuencia
en la que aparecen.
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 8
TRABAJO PRÁCTICO
char * s = {"0123456789"}, * c;
int * p;
long * q;
c = (s + 3);
p = (int *) s;
q = (long *) s;
Analizar:
*((char*)q);
*(++c);
*c++;
++*s;
45. Dibuje el árbol de derivación para las siguientes expresiones, luego según las
declaraciones y asignaciones de valores. Indique los resultados considerando la secuencia
en la que aparecen.
int a = 1, b = 2, c = 7, d = -4;
float x = 1, y = 2.5, z = 0.3;
unsigned char m = 'B', p = 64, r = '1';
Analizar:
a > c &&!(x != y) || m < -- p
(c++ * --b)
m += b + 5
(!p && m) + r
x / c * y + 3.5 - d % 3
b>c>d
b = c ?2 : 4
46. Eliminar la recursividad a izquierda de la gramática.
E E+T
E T
T T*F
T F
F (E)
F id
47. ►Haciendo uso de las herramientas Flex/Bison, desarrollar un analizador léxico
(scanner) y un analizador sintáctico (parser) para la gramática que se muestra. Obtener el
programa ejecutable que tome como ‘input’ un archivo de texto con un ejemplo de código
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 9
TRABAJO PRÁCTICO
fuente que corresponda al lenguaje y lo someta a las dos primeras fases del proceso de
traducción. Como resultado el analizador debe mostrar la tabla de lexemas-tokens obtenida
por el scanner y el árbol de derivación generado por el parser, o el error en caso de
producirse alguno de orden léxico o sintáctico durante el proceso de análisis.
GRAMÁTICA DEL LENGUAJE
rutina ::= identifierparameter_list
parameter_list ::= "(" defparameter {"," defparameter}* |
("&" identifier { "," "&" identifier}*
defparameter ::= parameter ["=" expression]
identifier ::= letter {letter | digit | "_"}*
parameter ::= identifier | "(" sublist ")"
expression ::= conditional_expression | lambda_form
letter ::= lowercase | uppercase
digit ::= "0"|"1"|...|"9"
identifier ::= (letter) {letter | digit | "_"}*
sublist ::= parameter ("," parameter)*
conditional_expression ::= "or_test"| "and_test"
lambda_form ::= "lambda"
lowercase ::= "a"|"b"|...|"z"
uppercase ::= "A"|"B"|...|"Z"
EJEMPLOS:
algo_1(alfa = or_test, Beta = lambda) // válido
algo_1(alfa = or_test, &Beta) // inválido
algo_1(alfa = or_test, _Beta = lambda) // inválido
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 10
TRABAJO PRÁCTICO
5. PROCESO DE TRADUCCIÓN Y EJECUCIÓN
Los errores que aparecen en algunos de los siguientes programas pueden ocurrir durante el
proceso de compilación o interpretación según el lenguaje, algunos no se detectan hasta la etapa
de ejecución y otros nunca se detectan, pero los programas muestran resultados erróneos.
48. ►Verifique si compilan y ejecutan correctamente los siguientes programas, luego corrija el
error y pruebe de nuevo el programa (verifique que el resultado que muestran es el correcto).
Califique los errores en de tipo léxico, sintáctico o semántico.
#include<iostream> #include <iostream>
using namespace std; using namespace std;
#define uno 1 void foo(){
#define dos 2 int i;
int a; cout<< i++<<endl;
a = uno; }
int main() { int main() {
a = dos; int j;
} for (j = 0; j < 10; j++) foo();
}
49. Verifique si compilan y ejecutan correctamente los siguientes programas, luego corrija el
error y pruebe de nuevo el programa (verifique que el resultado que muestran es el correcto).
Califique los errores en de tipo léxico, sintáctico o semántico.
#define VERSIÓN 1 #include <iostream>
#include <iostream> using namespace std;
using namespace std; int an[4] = { 1, 2, 3, 4 };
char *ss( char *s ) { int sum( int a[4] ) {
return s; int limit = sizeof(int)*4 / sizeof(int); result = 0;
} for( int i = 0; i < limit; i++ )
int main(){ result += a[i];
if (VERSIÓN > 0) return result;
cout<<"Hello "<<ss("world")<<endl; }
} int main(){
cout<< sum( an ) <<endl;
}
50. Analice el siguiente programa, corrija el error que tiene y verifique su funcionamiento.
#include <iostream>
using namespace std;
#include <malloc.h>
typedefconst char *PtrChar;
typedefPtrChar *PtrPtrChar;
PtrPtrCharcopia(PtrChar a, PtrChar b) {
PtrPtrChar p = (PtrPtrChar) malloc(sizeof(PtrChar) * 2);
p[0] = a;
p[1] = b;
return p;
}
intmain() {
PtrPtrChar mc = copia( "Novedades", "Mayormente" );
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 11
TRABAJO PRÁCTICO
PtrPtrCharhny = copia( "Similaridad", "Algunas veces" );
cout<< mc[0]<< mc[1]<<endl;
cout<<hny[0], hny[1] <<endl;
}
51. ►Analice lo que ocurre en cada caso, observando los mensajes desde la consola de
errores, en cada caso corrija el error y pruebe de nuevo (F5 recarga la página en el
navegador luego de ser modificada).
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Pruebas JS</TITLE> <TITLE>Pruebas JS</TITLE>
<SCRIPT LANGUAGE="JAVASCRIPT"> <SCRIPT LANGUAGE="JAVASCRIPT">
Nombre = "La salida es: "; function EscribeTitulo(t){
alert("Hola, este es un programa de prueba"); alert(t)
x = 10; }
y = x * x; </SCRIPT>
alert(nombre + y); </HEAD>
</SCRIPT> <BODY onLoad="EscribeTitulo(Título de la
página)">
</HEAD>
<p>Pruebas</p>
<BODY>
</BODY>
<p>Pruebas</p>
</HTML>
</BODY>
</HTML>
52. Analice lo que ocurre en cada caso, observando los mensajes desde la consola de errores,
en cada caso corrija el error y pruebe de nuevo (F5 recarga la página en el navegador luego
de ser modificada).
<HTML> ¿Por qué no muestra 15?
<HEAD> <html>
<TITLE>Pruebas JS</TITLE> <head>
<SCRIPT LANGUAGE="JAVASCRIPT"> <title>Un ejemplo</title>
function multiplicar(x, y){ <script language="JavaScript">
var w; function llamar(){
while (x =< y) x++; var x, y;
return w y = 3;
} x = 12;
function ver(){ y =+ x;
alert(multiplicar(2, 9)); alert(y);
} }
</SCRIPT> </script>
</HEAD> </head>
<BODY onLoad='ver()'> <body onLoad="llamar()">
</BODY> <p>Llamador</p>
</HTML> </body>
</html>
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 12
TRABAJO PRÁCTICO
53. Las expresiones regulares son patrones que permiten expresar coincidencias con
combinaciones de caracteres dentro de cadenas de texto. Muchos lenguajes modernos
incluyen evaluadores de expresiones regulares, como por ejemplo JS o Java. Verifique el
funcionamiento del siguiente programa JS, asignando a la variable la_expre (reemplace la
línea punteada), una de las siguientes expresiones, y determine cuáles son los patrones de
cadenas que son válidos como entrada para cada caso:
/^(.+\@.+\..+)$/
/(^[0-9\s\+\-])+$/
<html>
<head>
<title>Un ejemplo</title>
<script language="JavaScript">
functionexpresion(){
varla_expre = ……………………… ;
var texto = prompt("Valor: ");
if ( la_expre.test(texto) )
alert('La cadena es válida');
else
alert('La cadena NO es correcta');
}
</script>
</head>
<body onLoad="expresion()">
<p>Validador de expresiones regulares </p>
</body>
</html>
54. Analice la siguiente versión del programa, en la cual se quieren copiar las cadenas de
caracteres que se pasan como argumento a la función ‘copia’, corrija el error semántico que
tiene y verifique su funcionamiento. Explique por qué la versión anterior del programa sí
funcionaba y qué habría que corregir para que el programa funcione correctamente.
#include <iostream>
using namespace std;
#include <malloc.h>
#include <string.h>
typedef char *PtrChar;
typedefPtrChar *PtrPtrChar;
PtrPtrCharcopia(PtrChar a, PtrChar b) {
PtrPtrChar p = (PtrPtrChar) malloc(sizeof(PtrChar) * 2);
strcpy(p[0], a);
strcpy(p[1], b);
return p;
}
intmain() {
PtrPtrChar mc = copia( "Novedades", "Mayormente" );
PtrPtrCharhny = copia( "Similaridad", "Algunas veces" );
cout<<mc[0], mc[1] <<endl;
cout<<hny[0], hny[1] <<endl;
return 0;
}
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 13
TRABAJO PRÁCTICO
6. TRADUCCIÓN DE LA SEMÁNTICA DE DATOS
Los errores que aparecen en los siguientes programas, en general se deben a interpretaciones
erróneas de la semántica de datos de los enunciados, debido a que se han cometido errores al
escribir los [Link] los tamaños 1/4/4/8/8 para los tipos char/int/float/
long/double.
55. ►Verifique si compilan y ejecutan correctamente los siguientes programas, luego corrija el
error y pruebe de nuevo el programa (verifique que el resultado que muestran es correcto).
#include <iostream> #include <iostream>
using namespace std; using namespace std;
intcubo(unsigned int p){ struct pumpkin { int nose:1, eyes:2; } p = { 1, 2 };
int n; int f(){
n = p * p * p; if( [Link]> 0 &&[Link]> 1 ) return 1;
return n; else return 0;
} }
int main(){ int main(){
int n; if( f() ) cout<< "nose and eyes\n";
unsigned int p = 31489; else cout<< "malformed\n";
n = cubo(p); return 0;
cout<<"El cubo es:<< n<<endl;
}
}
56. ►Verifique si compilan y ejecutan correctamente los siguientes programas, luego corrija el
error y pruebe de nuevo el programa (verifique que el resultado que muestran es correcto).
Debería mostrar 1. Muestra: 0.286797199079244D-009. Re-escríbalo
en “C++” y JS,luego compare resultados.
<HTML>
<HEAD> program uno ! programa en Fortran 90
<TITLE>Pruebas JS</TITLE> implicit none
<SCRIPT call compara()
LANGUAGE="JAVASCRIPT"> stop
function compara(){ contains
var x = 0.333333333333333, y = 1/3; subroutine compara() ! anidada en uno
alert(x + " , " + y); integer :: k
if (x == y) real(kind=8) :: x, y ! equivale a double
alert(1); x = 1.0
else y = 3.0
alert(0); do k = 1, 20 ! es como un for
} x=x/y
</SCRIPT> end do
</HEAD> write(*, *) x ! es como un cout
<BODY onLoad=“compara()"> return
</BODY> end subroutine compara
</HTML> end program uno
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 14
TRABAJO PRÁCTICO
57. Analice y pruebe ambos programas, explique los resultados obtenidos:
function calcula(){ function calcula(n, m){
var x = new Array(); a = 1;
for (i = 0; i < 5; i++) x[i] = i * 2; if (n > m)
alert(x); b = 2;
for (i = 5; i < 10; i++) x[i] = i * 2; c = 3 + b;
alert(x); d = c + a;
} e = d * c;
alert(e);
Verificar para la llamada: calcula(23) }
Verificar para las llamadas:
calcula(4, 12)
calcula()
calcula(4, 2)
58. Verifique el funcionamiento de ambos programas y explique los resultados obtenidos.
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int main() { int main() {
struct foo { struct foo {
int i; int i;
}; };
foo x = {3}; foo x = {3};
foo y = x; foo *y = &x;
x.i = 4; x.i = 4;
cout<<“-”<< y->i<<endl;
cout<<“-”<<y.i<<endl;
}
}
59. ►Suponiendo la dirección de base 1000 para ‘alfa’ indique:
union VALOR { El tamaño de en bytes de los objetosde datos ‘alfa’ y ‘x’.
char a[10];
Forma de acceso al miembro 'b' del primer elemento de 'c'.
double b;
}; Dirección de memoria del 2do. elemento de 'a',
struct DATO { correspondiente al 2do. elemento de 'c'.
int a; Cómo asignar a ‘x’ la referencia a un objeto DATO.
double b;
union VALOR c[10];
float d;
char e;
};
DATO alfa, *x;
Suponiendo la dirección de base 500 para ‘x’. Indicar la dirección de memoria de cada miembro
de [Link] la sintaxis para asignar un valor a cada miembro.
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 15
TRABAJO PRÁCTICO
union COD {
long a;
char b[6];
};
struct CUOTA {
int *nro;
floatmonto;
};
struct PAGO {
COD id;
charnomb[30];
CUOTA *c;
};
PAGO x;
60. Responda las siguientes preguntas, para las definiciones y asignaciones que se indican.
Luego verifique sus respuestas usando el compilador, usando el debuger para verificar las
direcciones de memoria.
struct A { ¿Cuál es el tamaño en bytes de t?
int x;
Si se hacen las asignaciones y luego se recupera t.m.z.x¿ qué valor se
long y;
obtiene ?
};
union B { Suponiendo que la dirección de t es 1000:
long w; ¿ cuál es el valor de la dirección de t.m.z.y ?
struct A z;
}; ¿ cuál es el valor de la dirección de t.p.y ?
struct C { ¿ cuál es el valor de la dirección de t.m.w ?
union B m;
struct A p; Si hace t.p = t.m.z y luego se recupera t.p.x ¿qué valor se obtiene?
} t;
t.m.w = 10;
t.m.z.x = 10;
t.m.z.y = 12;
t.p.x = 15;
t.p.y = 21;
61. ►Si se declara un arreglo bidimensional X (organizado por fila/columna) de enteros
(tamaño 4 bytes), con rango de subíndices [1..5, -1..4], cuya dirección base es 200, indicar:
cantidad total de elementos espacio reservado para X en bytes
espacio dimensional M0 espacio dimensional M1
OV dirección X[2, 1]
62. Para la siguiente declaración en un lenguaje que utiliza enteros de 4 bytes, donde la
dirección base es 350, calcular los valores que se solicitan.
X is array [-3..4,5..12, 0..4] of integer;
cantidad total de elementos espacio reservado para X en bytes
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 16
TRABAJO PRÁCTICO
espacio dimensional M0 espacio dimensional M1
espacio dimensional M2 OV
dirección X[ -1, 6 , 0]
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 17
TRABAJO PRÁCTICO
7. TRADUCCIÓN DE LA SEMÁNTICA DE CONTROL
En los programas donde aparecen errores, en general se deben a interpretaciones erróneas de la
semántica de control de los enunciados, relativos el ámbito de datos y/o enunciados en los
subprogramas, porque se han cometido errores al escribir los programas.
63. ►Verifique el funcionamiento de ambos programas y explique los resultados obtenidos.
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Pruebas JS</TITLE> <TITLE>Pruebas JS</TITLE>
<SCRIPT LANGUAGE="JAVASCRIPT"> <SCRIPT LANGUAGE="JAVASCRIPT">
varx = 0; varx = 0;
function calcula(){ function calcula(){
var x = 2; x = 2;
recalcula(); recalcula();
} }
function recalcula(){ function recalcula(){
alert(x); alert(x);
} }
</SCRIPT> </SCRIPT>
</HEAD> </HEAD>
<BODY onLoad=“calcula()"> <BODY onLoad=“calcula()">
</BODY> </BODY>
</HTML> </HTML>
64. ►Verifique el funcionamiento del programa y explique los resultados obtenidos.
#include <iostream>
using namespace std;
int count( char *buf, char letter ) {
int n = 0;
char *p;
for ( p = buf; *p; p++ ) if ( *p == letter ) n++;
return n;
}
int main() {
char *p = "visualizacion";
if( p ) ; else cout<<"\nCount:"<< count( p, 'e' )<<endl;
}
65. Implemente el programa, verifique el funcionamiento y explique los resultados obtenidos.
var x = 0;
function calcula(){
x = 2;
recalcula();
}
function recalcula(){
alert(x);
}
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 18
TRABAJO PRÁCTICO
66. Implemente el programa, verifique el funcionamiento y explique los resultados obtenidos.
functioncalcula(){
var x = new Array();
for (i = 0; i < 5; i++) x[i] = i * 2;
alert(x);
for (i in x) alert(i * 2);
}
67. Analice el siguiente programa, luego agregue un par de llaves para agrupar bloques de
modo tal que se muestre el valor 2.
function calcula(n, m){
var x;
if (n > m)
x = 0;
if (n < m)
x = 1;
else
x = 2;
alert(x);
}
68. Analice el siguiente programa, corrija el/los error/es y verifique su funcionamiento.
#include <iostream>
using namespace std;
#include <string.h>
enum type { H=1 /* herbivore */;
C=2 /* carnivore */;
S=4 /* sweet tooth */;
D=8 /* Drinker */
};
char *dish( int x ){
charbuf[100]; char *p = buf; *p = 0;
if( x & D ) strcat( p, "rum-soaked " );
if( x & S ) strcat( p, "sugared " );
if( x & C ) strcat( p, "turkey " );
if( x & H ) strcat( p, "broccoli " );
return p;
}
int main(){
cout<< "please pass the <<dish(C|S)<< “and the"<< dish(H|D) <<endl;
}
69. Analice el siguiente programa y verifique su funcionamiento.
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 19
TRABAJO PRÁCTICO
<html>
<head>
<title>Un ejemplo</title>
<script language="JavaScript">
a = prompt("A= ");
b = prompt("B= ");
c = prompt(“C= ");
a = Number(a);
b = Number(b);
c = Number(c);
if (a > b && a > c)
miFuncion = new Function("x", "y", "z", "var m; m = x + y + z;return m;");
else if (b > a && b > c)
miFuncion = new Function("x", "y", "z", "return x * y * z;");
else
miFuncion = new Function("x", "y", "z", "var a, m; m = x / y; a = x / z; return a + m;");
alert(miFuncion(a,b,c));
</script>
</head>
<body>
<p>Ecuación, ingrese coeficientes</p>
</body>
</html>
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 20
TRABAJO PRÁCTICO
70. ►Analice el siguiente pseudocódigo y responda lo que se solicita:
procedimiento prog
Suponiendo que se aplican sólo reglas de alcance
x, a : entero; estático:
procedimiento uno
Dibuje un d iagrama de Venn que represente la
x, y : entero;
estructura del programa, indicando el ámbito en que
funcion dos está definido cada s ímbolo que aparece en el mismo.
a, y : entero;
Identificar las de líneas en las que hay err ores e
inicio
indique en qué cons isten.
y := cuatro;
tres; Indique cuáles errores son corregibles, sin cambiar
la estructura lógica del programa y cóm o lo haría.
regresa a;
fin dos; Suponiendo que se aplican reglas de alcance estático
inicio y en otro caso dinámico (sin usar discriminantes de
acceso), durante la ejecución deDos y Cuatro, indique
tres;
qué símbolos est arían vivos y cuáles serían
y := dos; accesibles, para cad a subprograma.
fin uno;
Dibuje el estado de la pila de memoria, indicand o los
procedimiento tres
enlaces de cadenas estáticas, luego haga lo mismo
m : entero; usando display, para el punto de ejecución
funcion cuatro inmediatamente ant es de y := dos;
y : entero;
inicio
x := cuatro;
regresa m;
fin cuatro;
inicio
uno;
fin tres;
inicio
tres;
a := dos;
fin prog;
71. Suponiendo que se ejecuta la llamada a la siguiente función, dibuje el diagrama del
registro de activación usando esquema de DISPLAY, para cada activación de calcula().
function llama(){
function calcula(a, n){
var p;
p = a + eval(n);
alert(p);
}
var x, y;
x = y = 3;
calcula(x, "x+y");
y = 4;
calcula(x, "x+y");
}
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 21
TRABAJO PRÁCTICO
72. ►Analice el siguiente código JS y responda lo que se solicita:
var u = 1; Dibujar el mapa de memoria para cuando existe la
máxima cantidad de RA en el stack, indicar las variables
function T(ro , p){
contenidas en cada uno y sus valores.
function Q(fl){ Realizar el análisis para las combinaciones de reglas
u = ro + fl; estáticas y dinámicas de alcance a los símbolos, con
mecanismos de vinculación al contexto profunda y
}
superficial.
if (ro >= 2){
var u = 7;
T(ro / 2, Q);
}
else {
p(ro + 1);
}
alert("T: " + u);
}
function Main(){
T(u + 3, T);
alert("M: " + u);
}
Main();
73. Analice el siguiente código y responda lo que se solicita:
function mx1(p) { Dibujar el mapa de memoria para cuando existe la
var x = 1; máxima cantidad de RA en el stack, e indicar las
p = x; variables contenidas en cada uno y sus valores.
function ny2(q){
Indicar los símbolos al alcance en cada ámbito mx1,
function gp3(z) {
ny2, fw4, gp3 (diferenciar usando discriminante de
return x + z;
acceso).
}
x = q; Realizar el análisis para las combinaciones de reglas
function fw4(y) { estáticas y dinámicas de alcance a los símbolos, con
var x = y + 1; mecanismos de vinculación al contexto profundo en un
return gp3(y * x); caso y en otro al superficial.
}
alert(fw4(4));
}
ny2(3);
}
mx1(2);
74. Analice el siguiente código y responda lo que se solicita:
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 22
TRABAJO PRÁCTICO
function P(){ Indicar la secuencia de valores de salida de los
var a, b; alert().
function Q(a, c){ Dibujar el esquema de registros de activación en el
var d; stack, para el instante previo a ejecutar la línea con
function R(n){ la flecha, indicando en cada RA las variables
accesibles y sus valores (use discriminante en caso
if (n > 0) {
necesario)
x = 1;
alert("R+: " + n + "," + x);
return R(n - x);
}
else {
alert("R-: " + n + "," + x);
d = T();
return d;
}
}
function T(){
x = a + b;
alert("T: " + d + "," + c);
return x;
}
b = 2;
d = R(b);
alert("Q: " + a + "," + c + "," + d);
return d;
}
a = 1;
b = 2;
b = Q(b, a);
alert("P: " + x + "," + b);
}
P();
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 23
TRABAJO PRÁCTICO
75. Verificar el funcionamiento del siguiente código y responda lo que se solicita:
#include <stdio.h> ¿Qué cantidad máxima de copias del registro de
#include <string.h> activación de “esta” llegan a existir en la memoria?
#define LARGO 20
char * esta(char s[], int c){ Indique el primer valor que muestra el programa.
if (strlen(s))
printf("\n%s", esta(s+c, c++)); Indique el ante-último valor que muestra el
return s; programa.
}
void main(){ Indique el último valor que muestra el programa.
char cad[LARGO]={"arteramente"};
int c = 0;
Indique los sucesivos valores que toma la variable c
printf("\n%s", esta(cad, c++));
de la función esta()
}
Sintaxis y Semántica de Lenguajes: Guía de trabajos prácticos 24