Resum pràctiques (2017)

Resumen Catalán
Universidad Universidad Autónoma de Barcelona (UAB)
Grado Ingeniería Informática - 3º curso
Asignatura Compiladors
Año del apunte 2017
Páginas 27
Fecha de subida 14/09/2017
Descargas 0
Subido por

Vista previa del texto

Atribut sintetitzat/heretat PRIMER PARCIAL COMPILADORS 2016 12- A 19- A 22- D 23- A 25- C 27- E 28- D 29- B 30- C 1 2 3 4 PRIMER PARCIAL COMPILADORS 2017 20- E 21- E 24- C,D 25- A 26- D 28- B 29- C 30- A 5 6 7 8 SEGUNDO PARCIAL COMPILADORS 2016 19- A 9 SEGUNDO PARCIAL COMPILADORS 2017 2-C 18-A 10 EXAMEN PRÀCTIQUES 2016 1.- ¿Cuál es la solución sintáctica que permite tener y escribir de manera adecuada en cada caso del switch desde ninguna a cualquier número de instrucciones asociadas? switch "(" <Expressio> ")" "{" {case <DecCas> ":" R1 otherwise ":" R1 a) b) c) d) e) "}" {<instruccio>} <bloc> {<instruccio>}|<bloc> <instruccio>|<bloc> Ninguna de las anteriores.
Explicació: La instrucció si mires el codi té dret a cridar a blocs i a tota la resta de coses, com “;”. Els corxet “{‘ serveixen per repetir de 0..n cops. Switch no entra al 2017.
2.- Respecto al siguiente test: 1 2 3 4 5 6 a) b) c) d) e) procedure main() { var a:array [2..4] of array[1..0] of real; var b:real; b = a[2][1 + 20; } Daría error sintáctico en las líneas 3 y 5 y semántico en la línea 3 Daría error sintáctico en la línea 5 y semántico en la línea 3 Daría error sintáctico en las líneas 3 y 5 pero no daría ningún error semántico Daría error sintáctico y semántico en las líneas 3 y 5 Ninguna de las anteriores Explicació: -Línia 3: L’error semàntic es degut a l’indexació de l’array, que és decreixent -Línia 5: L’error sintàctic és degut a la falta del símbol ‘]’ per tancar el segon índex.
S’accepta el valor 1+20 com a inicialització de la variable.
11 3. ¿Cuál es el orden e implementación correctos de las reglas BNF para añadir al compilador básico la posibilidad de hacer potencia y factorial, manteniendo correcta la asociatividad de las operaciones? a) … Rule <terme> :: = <factorial> { ** <factorial>} Rule <factorial> :: = <factor> {!} Rule <factor> :: … b) … Rule <potencia> :: = <factorial> { ** <potencia>} Rule <factorial> :: = <factor> {!} Rule <factor> :: … c) … Rule <potencia> :: = <factorial> [ ** <potencia>] Rule <factorial> :: = <factor> {!} Rule <factor> :: … d) … Rule <potencia> :: = <potencia> [ ** <factorial>] Rule <factorial> :: = <factor> {!} Rule <factor> :: … e) Ninguna de las anteriores Explicació: Només la resposta B i C poden baixar al següent nivel. La resposta A no contempla potencia.
Factorial té més prioritat que la potencià per això va més avall. Si creem una potència amb corxets”{“ es poden produir de 0..n potències del mateix nivell pel mateix número, cosa que donaria error (bucle infinit).
Per mantenir l’associativitat per la dreta fan falta els corxets “[“ i per l’esquerra “{“ 4) Respecto a la declaración de tipos con arrays multidimensionales, ¿qué comprobaciones se tienen que hacer en la regla <Tipus>? a) Comprobación de tipo de datos de las dimensiones b) Comprobación de dimensiones coherentes en el caso de arrays con rangos c) a) y b) y diferenciar casos de arrays con y sin rangos a la hora de introducir las dimensiones del TArray d) a), b), c) y comprobar que los tipos y tamaños coincidan en la inicialización e) Ninguna de las anteriores 5) Respecto a la declaración de parámetros y pensando en ampliarlo para poder admitir la declaración a la vez de varios parámetros de un mismo tipo: // <DecParametre> ==================================== Rule <DecParametre(&ListaParametres)>::= @var nom,t,referencia=false; [ & @referencia=true; ] identificador#(nom) @if (-](p<-ListaParametres,p.nom==nom)) throw Exception("Parametre ",nom," duplicat"); : <tipus(t,Unbound)> @ListaParametres=Parametre(nom,t,referencia)::ListaParametres; a) Habría que crear una lista donde almacenar los nombres de los diferentes parámetros b) a) y comprobar al añadir un nombre nuevo que no esté ya incluido en la lista de nombres y en la lista de parámetros global c) a), b) y crear una estructura Parametre para cada elemento de la lista de nombres.
d) a), b) y comprobar que no esté duplicado el nombre en la tabla de símbolos e) Ninguna de las anteriores 12 Explicació del codi: -Per declarar un paràmetre has de saber nom, t de tipus, referència (booleà).
-Opcional per paràmetre per referència [ “&” ...] -En identificador#(nom) li passem el nom -Posteriorment comprovem duplicat a la llista de paràmetres -Passem valors a la llista, afegir per l’esquerra Paràmetre és una funció del compilador que crea un paràmetre Explicació: S’hauria de crear una llista auxiliar per guardar els noms dels paràmetres i posteriorment (després de comprovar duplicat) hauríem de fer un bucle per inserir la llista a ListaParametres A: Falsa perquè la llista ja està creada, la passem a la rule B: Falsa perquè inclou la A C: Falsa perquè inclou la A i B.
D: Falsa perquè inclou la A i B. A la TS només generen entrada els ETSTipus, ETSVariables o ETSFunció 6) ¿Cuántos errores semánticos debería dar el siguiente código y en qué líneas? (supón que, aunque haya error, el compilador nos da los errores que hay en cada línea en vez de parar en el primero) 1 2 3 4 5 6 7 a) b) c) d) e) procedure main() { var a, b: integer; var c,c,b:real; b = a**2; c = b!; } Un error semántico en la línea 4 Dos errores semánticos en la línea 4 y uno en la línea 6 a) y error semántico en la línea 5 a), c) y un error semántico en la línea 6 Ninguna de las anteriores Explicació: -Línia 4: Error semàntic per repetició de la variable c a la mateixa línia, i per repetir la variable b.
-Línia 5: La potència ** retorna un real i aquest es guarda a b (que es converteix de variable entera a real).
-Línia 6: El factorial b! ha d'utilitzar un enter, i aquí no pot canviar de format i ens retorna un error semàntic.
7) ¿Cómo modificaríamos la regla DecVar para permitir múltiples inicializaciones de variables locales del mismo tipo a la vez? Rule <DecVar(cod)>::= @Var t,nom,LValue; Var identificador#(nom):<tipus(t,Unbound)> [ = <Expressio(cod,t,LValue)>] ";" @{ TS.ComprovarDuplicat(nom); ts.VarSz=ts.VarSz+t.MidaTipus(); posicio=-ts.VarSz; adreca=(0,posicio); TS.Insertar(ETSVariable(nom,t,Posicio)); R1 } 13 a) Añadir la posibilidad de recibir más de un nombre de variable (con las comprobaciones semánticas pertinentes) y, en R1, añadir @cod.Put(IPopBVar,t.MidaTipus(),Posicio) salvo en la última variable, donde pondremos @cod.Put(IStoreBVar,t.MidaTipus(),Posicio) b) Añadir la posibilidad de recibir más de un nombre de variable (con las comprobaciones semánticas pertinentes) y, en R1, añadir @cod.Put(IStoreBVar,t.MidaTipus(),Posicio) salvo en la última variable, donde pondremos @cod.Put(IPopBVar,t.MidaTipus(),Posicio) c) a) y añadir comprobación de si tenemos valor a inicializar o no (p.ej. un flag si entramos en Expressio), asegurándonos de que en este caso tengamos el valor en la pila.
d) b) y añadir comprobación de si tenemos valor a inicializar o no (p.ej. un flag si entramos en Expressio), asegurándonos de que en este caso tengamos el valor en la pila.
e) Ninguna de las anteriores Explicació: La A no pot ser perquè quan fem un Pop treiem el valor de la pila, per tant primer hauríem de fer un Store (no treiem valor de la pila però si el guardem) i finalment un Pop per deixar la pila buida. Seria la B amb una comprovació de valor d’inicialització.
8) ¿Cuál sería el código completo generado que debería generar el siguiente código? procedure main() { var a:integer=20; var b:array[3] of integer = [1,2,3]; } ICall L1 IExit L1: ILink 16 IPushLit 4 20 IPopBVar 4 -4 IPushLit 4 3 IPushLit 4 2 IPushLit 4 1 IPopBVar 12 -16 IUnlink IRet (a) ICall L1 IExit L1: ILink 16 IPushLit 4 20 IPopBVar 4 -4 IPushLit 4 1 IPushLit 4 2 IPushLit 4 3 IPopBVar 12 -16 IUnlink IRet (b) ICall L1 IExit L1: ILink 16 IPushLit 4 20 IPopBVar 4 -4 IPushLit 4 3 IPopBVar 4 -16 IPushLit 4 2 IPopBVar 4 -16 IPushLit 4 1 IPopBVar 4 -16 IUnlink IRet (c) ICall L1 IExit L1: ILink 16 IPushLit 4 20 IPopBVar 4 -4 IPushLit 4 1 IPopBVar 4 -8 IPushLit 4 2 IPopBVar 4 -8 IPushLit 4 3 IPopBVar 4 -8 IUnlink IRet (d) e) Ninguna de las anteriores Explicació: La resposta A és l’única que guarda els valors de l’array en ordre invers a la posició de memòria on aquest està (-16 i mida 12 (3 enters)).
14 9) ¿Cuál es la solución correcta para solucionar el offset al emplear arrays unidimensionales declarados con rangos, dejando el tipo de dato correcto en la pila? Código de ejemplo de uso: procedure main(){ var a:integer=20; var b:array[2..3] of integer; a[2] = 10; } a) @t=t.TipusElements; <Expressio(CodIndex,ti,true,LValue,TipusEsperat)> @if (ti!:=TInt) throw Exception("Tipus erroni en index"); @CodIndex.CodiResultatValor(); @codIndex.Put(IPushLit,4,t.Mida[0]); @CodIndex.Put(ISubInt); @CodIndex.Put(IPushLit,4,t.MidaTipus()); @CodIndex.Put(IMultInt); @CodIndex.Put(IAddInt); b) <Expressio(CodIndex,ti,true,LValue,TipusEsperat)> @if (ti!:=TInt) throw Exception("Tipus erroni en index"); @CodIndex.CodiResultatValor(); @t=t.TipusElements; @codIndex.Put(IPushLit,4,t.Mida[0]); @CodIndex.Put(ISubInt); @CodIndex.Put(IPushLit,4,t.MidaTipus()); @CodIndex.Put(IMultInt); @CodIndex.Put(IAddInt); c) @t=t.TipusElements; <Expressio(CodIndex,ti,true,LValue,TipusEsperat)> @if (ti!:=TInt) throw Exception("Tipus erroni en index"); @CodIndex.CodiResultatValor(); @CodIndex.Put(IPushLit,4,t.MidaTipus()); @CodIndex.Put(IMultInt); @codIndex.Put(IPushLit,4,t.Mida[0]); @CodIndex.Put(IPushLit,4,t.MidaTipus()); @CodIndex.Put(IMultInt); @CodIndex.Put(ISubInt); d) <Expressio(CodIndex,ti,true,LValue,TipusEsperat)> @if (ti!:=TInt) throw Exception("Tipus erroni en index"); @CodIndex.CodiResultatValor(); @codIndex.Put(IPushLit,4,t.Mida[0]); @CodIndex.Put(ISubInt); @CodIndex.Put(IPushLit,4,t.MidaTipus()); @CodIndex.Put(IMultInt); @CodIndex.Put(IAddInt); @t=t.TipusElements; e) Ninguna de las anteriores Explicació: Indexació darrays -IPushAdressBvar: Direcció -IPushLit: Índex de l’array -IPushLit: Mida de l’array (Enter, Real) -IMultInt (Mida total) -IAddInt (Mida + Adreça) -IPopInd 15 10) ¿Cuál de los siguientes test han de dar algún error (ya sea sintáctico o semántico)? 10.1) procedure main() { No entra switch 2017 var a:integer=10; switch(a) { case 1..a: print(“<10"); case 10: print("=10"); otherwise: print("Otra cosa"); } } 10.2) procedure main() { var n1: array[5] of integer = [1,2,3,4,5]; var n2: array[5] of integer = [1,2,3,4,5; var n3: integer; n3 = n1[6] + n2[5]; } 10.3) type tabla=array [1..3] of integer; procedure main() { var a:tabla=[1,2.0,3+6,5]; } 10.4) procedure main() { function f1(a,b:real,c:integer):real{ var d:real; d = a**b + c; return d; } } a) 10.1 y 10.2 dan error sintáctico, 10.3 da error semántico y 10.4 no da error de ningún tipo b) 10.1 da error sintáctico, 10.2 y 10.3 dan error semántico y 10.4 no da error de ningún tipo c) 10.3 da error semántico y 10.1, 10.2 y 10.4 no dan error de ningún tipo d) 10.1 y 10.2 dan error sintáctico, 10.2 y 10.3 dan error semántico y 10.4 no da error de ningún tipo e) Ninguna de las anteriores Explicació: Només es conta el primer -10.1: Dóna error sintàctic perquè ha de ser número...número o variable...variable -10.2: Error sintàctic al no tancar ‘]’ i semàntic per accedir a una posició. També donaria error semàntic.
-10.3: Error semàntic perquè l’array està declarat amb enter i entra un real. El 3+6 es podria fer a la indexació, però no a la declaració. Es declaren 4 valors i inicialment està declarat per 3.
16 EXAMEN FINAL DE PRÀCTICAS 2016 1.- ¿Cuál es la solución sintáctica que permite ampliar la gramática de LOOS para permitir realizar operaciones aritméticas de potencia y factorial con priorización correcta? … // <ExpArit>=== Rule<ExpArit>::= <terme> {(+ | -) <terme> } … a) Rule <terme>::= <factorial> {(* | / | **) <factorial>} Rule <factorial>::= <factor> {!} b) Rule <terme>::= <potencia> {(* | / ) <potencia>} Rule <potencia>:: <factorial> [** <potencia>] Rule <factorial>::= <factor> {!} c) Rule <terme>::= <potencia> {(* | / ) <potencia>} Rule <potencia>:: <potencia> [** <factorial>] Rule <factorial>::= <factor> {!} d) Rule <terme>::= <potencia> {(* | / ) <potencia>} Rule <potencia>:: <factor> [** <potencia>]{!} e) Ninguna de las anteriores.
Explicació: Només la resposta B i C poden baixar al següent nivel. La resposta A no contempla potencia.
Factorial té més prioritat que la potencià per això va més avall. Si creem una potència amb corxets”{“ es poden produir de 0..n potències del mateix nivell pel mateix número, cosa que donaria error (bucle infinit).
Per mantenir l’associativitat per la dreta fan falta els corxets “[“ i per l’esquerra “{“ 2.- Respecto al siguiente test teniendo en cuenta los requisitos de la práctica: 1 2 3 4 5 6 7 8 procedure main() { var a:integer=10; switch a { case 10.5: print(‘a’); } } a) Daría error sintáctico en las líneas 4 y 7 y semántico en la línea 6 b) Daría error sintáctico en la línea 4 y semántico en la línea 6 c) Daría error semántico en la línea 6 y ningún error sintáctico d) Daría error sintáctico en la línea 7 y semántico en la línea 6 e) Ninguna de las anteriores Explicació: -Línia 4: Error sintàctic per a fora de parèntesis (a) -Línia 6: Error semàntic per valor real -Línia 7: Error sintàctic per falta del cas per defecte (otherwise) 17 3. ¿Cuál de las siguientes opciones sería la más correcta para declarar los casos de un switch? a) Rule <Cas> :: = (numero|caracter)[..(numero|caracter)]: <instruccio> “;” b) Rule <Cas> :: = ((numero [..numero])|(caracter[..caracter])) :{<instruccio>} “;” c) Rule <Cas> :: = ((numero [..numero])|(caracter[..caracter])) :{<instruccio>} d) Rule <Cas> :: = ((numero [..numero])|(caracter[..caracter])) :<instruccio> e) Ninguna de las anteriores Explicació: No entra al 2017. La A no és perquè ha de ser número...número o variable...variable. Dintre el case es pot fer 0..n instruccions, i la instrucció porta incorporat el símbol “;”. El problema ve s i no introduïm cap instrucció, que el símbol “;” ha d’estar-hi igualment, per això també és vàlida la B.
4) Respecto a la declaración de variables múltiples del mismo tipo, ¿cuál es la solución que permite hacer todas las comprobaciones necesarias? Rule <DecVar>:: @Var t, nom, llista = [], ets, LValue=true; a) Var identificador#(nom) @TS.ComprovarDuplicat(nom); @llista = nom::llista; {, identificador#(nom) @TS.ComprovarDuplicat(nom); @llista = nom::llista; } :<tipus(t,unbound)> @for(n<-llista) TS.Insertar(ETSVariable(n,t,unbound)); b) Var identificador#(nom) @llista = nom::llista; {, identificador#(nom) @for(n<-llista) if(n==nom) throw Exception(“duplicado”); @llista = nom::llista; } :<tipus(t,unbound)> @for(n<-llista) TS.Insertar(ETSVariable(n,t,unbound)); c) Var identificador#(nom) @llista = nom::llista; {, identificador#(nom) @for(n<-llista) if(n==nom) throw Exception(“duplicado”); @llista = nom::llista; } :<tipus(t,unbound)> @for(n<-reverse(llista)) TS.Insertar(ETSVariable(n,t,unbound)); 18 d) Var identificador#(nom) @llista = llista::nom; {, identificador#(nom) @for(n<-llista) if(n==nom) throw Exception(“duplicado”); @llista = llista::nom; } :<tipus(t,unbound)> @for(n<-reverse(llista)) TS.Insertar(ETSVariable(n,t,unbound)); e) Ninguna de las anteriores Explicació: S’ha d’inserir a la TS a l’inrevès.
5) ¿Qué comprobaciones son imprescindibles para realizar para el análisis semántico de la inicialización de arrays multidimensionales? a) El número de elementos del array ha de ser igual a lo indicado en el campo Mida en la descripción del tipo array concreto en la Tabla de Símbolos b) a) y comprobar que el tipo de los elementos coincida con el campo TipusElements en la descripción del tipo array concreto en la Tabla de Símbolos c) a), b) y que los tipos de los elementos entre sí concuerden d) a) y b) y comprobar que los diferentes tipos de datos de los elementos estén introducidos en el orden correcto e) Ninguna de las anteriores Explicació: 6) ¿Cuántos errores semánticos debería dar el siguiente código y en qué líneas? (supón que, aunque haya error, el compilador nos da los errores que hay en cada línea en vez de parar en el primero) 1 2 3 4 5 6 7 a) b) c) d) e) procedure main() { var a, b: integer; var c,c,d, :real; b = a**2; c = b!; } Un error semántico en la línea 4 Dos errores semánticos, uno en la línea 4 y otro en la línea 6 Dos errores semánticos en la línea 4, uno en la línea 5 y otro en la línea 6 a) y error semántico en las línea 5 y 6 Ninguna de las anteriores Explicació: -Línia 4: Error semàntic al declarar 2 cops c -Línia 5: Error semàntic al intentar guardar el resultat d’un pow en un enter (sempre retorna real) -Línia 6: Error semàntic per intentar guardar resultat factorial en real, utilitza enter i retorna enter.
19 7) De las opciones siguientes, ¿cuál es la óptima para comprobar la entrada en un caso concreto de un switch que admite sólo enteros y que permite indicar rango de valores? Suponemos que: el selector está guardado en una variable que va desde B-4 a B, que tenemos guardados en literal 1 y 2 los extremos del rango y que tenemos dos etiquetas definidas para cada caso (una para ejecutar la instrucción en el caso de entrar y otra salir del rango sin ejecutar instrucción).
a) @cod.Put(IPushBVar,4,-4); @cod.Put(IPushLit,4,literal1); @cod.Put(IGreaterEqInt); @cod.Put(IJmpFalse,RefEtiqueta(fuerarango)); @cod.Put(IPushLit,4,literal2); @cod.Put(ILessEqInt); @cod.Put(IJmpTrue,RefEtiqueta(dentrorango)); @cod.Put(IJmp,RefEtiqueta(fuerarango); b) @cod.Put(IPushBVar,4,-4); @cod.Put(IPushLit,4,literal1); @cod.Put(ILessEqInt); @cod.Put(IJmpFalse,RefEtiqueta(fuerarango)); @cod.Put(IPushBVar,4,-4); @cod.Put(IPushLit,4,literal2); @cod.Put(IGreaterEqInt); @cod.Put(IJmpTrue,RefEtiqueta(dentrorango)); @cod.Put(IJmp,RefEtiqueta(fuerarango); c) @cod.Put(IPushLit,4,literal1); @cod.Put(IPushBVar,4,-4); @cod.Put(ILessEqInt); @cod.Put(IJmpFalse,RefEtiqueta(fuerarango)); @cod.Put(IPushLit,4,literal2); @cod.Put(IPushBVar,4,-4); @cod.Put(ILessEqInt); @cod.Put(IJmpTrue,RefEtiqueta(dentrorango)); @cod.Put(IJmp,RefEtiqueta(fuerarango) d) @cod.Put(IPushBVar,4,-4); @cod.Put(IPushLit,4,literal1); @cod.Put(IGreaterEqInt); @cod.Put(IJmpFalse,RefEtiqueta(fuerarango)); @cod.Put(IPushBVar,4,-4); @cod.Put(IPushLit,4,literal2); @cod.Put(ILessEqInt); @cod.Put(IJmpTrue,RefEtiqueta(dentrorango)); @cod.Put(IJmp,RefEtiqueta(fuerarango); e) Ninguna de las anteriores Explicació: 8) ¿Cuál sería el código completo generado que debería generar el siguiente código? procedure main() { var a,b:integer=20; var c:real; c = a/b; } 20 ICall main IExit main: ILink 16 IPushLit 4 20 IPopBVar 4 -4 IStoreBVar 4 -8 IPushBVar 4 -4 IIntToReal IPushBVar 4 -8 IIntToReal IDivReal IPopBVar 8 -16 IUnlink IRet ICall main IExit main: ILink 16 IPushLit 4 20 IStoreVar 4 -4 IPopBVar 4 -8 IPushBVar 4 -4 IIntToReal IPushBVar 4 -8 IIntToReal IDivReal IPopBVar 8 -16 IUnlink IRet (a) ICall main IExit main: ILink 16 IPushLit 4 20 IStoreVar 4 -4 IPopBVar 4 -8 IPushBVar 4 -4 IPushBVar 4 -8 IDivInt IIntToReal IPopBVar 8 -16 IUnlink IRet (b) (c) ICall main IExit main: ILink 16 IPushLit 4 20 IPopVar 4 -4 IStoreVar 4 -8 IPushBVar 4 -4 IPushBVar 4 -8 IDivInt IIntToReal IPopBVar 8 -16 IUnlink IRet (d) e) Ninguna de las anteriores Explicació: Hem d’inicialitzar les variables a i b amb el valor 20, per això fem primer Store i després Pop.
Per fer una divisió de Reals s’ha de transformar els enters a reals (IIntToReal).
9) ¿Cuál es el código correcto para el bucle que ha de incluir la siguiente implementación de la operación factorial? Suponer que en DespLimit tenemos almacenado el número del que queremos hacer factorial, que en DespRes tenemos almacenado el resultado hasta el momento y que tenemos dos etiquetas de repetir y fin de bucle.
while(n>1) do { r = r*n; n = n-1; } a) @Cod.Put(DefEtiqueta(EtiFact)); @cod.put(IPushBVar,4,DespLimit); @cod.put(IPushLit,4,1); @cod.put(IGreaterInt); @cod.put(IJmpFalse,RefEtiqueta(EtiEndFact)); @cod.put(IPushBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IPopBVar,4,DespRes); @cod.put(IMultInt); @cod.put(IPopBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IPushLit,4,1); @cod.put(ISubInt); @cod.Put(IPopBVar,4,DespLimit); @cod.Put(IJmp,RefEtiqueta(EtiFact)); @Cod.Put(DefEtiqueta(EtiEndFact)); 21 b) @Cod.Put(DefEtiqueta(EtiFact)); @cod.put(IPushLit,4,1); @cod.put(IPushBVar,4,DespLimit); @cod.put(IGreaterInt); @cod.put(IJmpFalse,RefEtiqueta(EtiEndFact)); @cod.put(IPushBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IPopBVar,4,DespRes); @cod.put(IMultInt); @cod.put(IPopBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IPushLit,4,1); @cod.put(ISubInt); @cod.Put(IPopBVar,4,DespLimit); @cod.Put(IJmp,RefEtiqueta(EtiFact)); @Cod.Put(DefEtiqueta(EtiEndFact)); c) @Cod.Put(DefEtiqueta(EtiFact)); @cod.put(IPushLit,4,1); @cod.put(IPushBVar,4,DespLimit); @cod.put(ILessEqInt); @cod.put(IJmpTrue,RefEtiqueta(EtiEndFact)); @cod.put(IPushBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IMultInt); @cod.put(IPushLit,4,1); @cod.put(IPushBVar,4,DespLimit); @cod.put(ISubInt); @cod.Put(IPopBVar,4,DespLimit); @cod.Put(IJmp,RefEtiqueta(EtiFact)); @Cod.Put(DefEtiqueta(EtiEndFact)); d) @Cod.Put(DefEtiqueta(EtiFact)); @cod.put(IPushBVar,4,DespLimit); @cod.put(IPushLit,4,1); @cod.put(IGreaterInt); @cod.put(IJmpFalse,RefEtiqueta(EtiEndFact)); @cod.put(IPushBVar,4,DespRes); @cod.Put(IPushBVar,4,DespLimit); @cod.put(IPopBVar,4,DespRes); @cod.put(IMultInt); @cod.put(IPushBVar,4,DespLimit); @cod.put(IPushLit,4,1); @cod.put(ISubInt); @cod.Put(IPopBVar,4,DespLimit); @cod.Put(IJmp,RefEtiqueta(EtiFact)); @Cod.Put(DefEtiqueta(EtiEndFact)); e) Ninguna de las anteriores 22 Explicació codi: -Definim l’etiqueta inicial -Carreguem valors n, 1 i mirem si n és més gran -Si és fals, saltem al final del while (etiqueta EtiEndFact)en un salt condicional -Realitzem les operacions dins del while -Salt incondicional a l’etiqueta inicial -Definim l’etiqueta final 10) ¿Cuál es el tipo (sintáctico o semántico) del primer error que dan (si lo dan) los siguientes test? 10.1) procedure main() { var a:array[2] of integer=[10,20,30,40]; switch(a[0]) { case 1..a: print(“<10"); case 10: print("=10"); otherwise: print("Otra cosa"); } } 10.2) procedure main() { var n1: integer=10; var n2: real=2.0 var n3: real = n1**n2!; } 10.3) type tabla=array [1..1+2] of integer; procedure main() { var a:tabla=[1,2.0,3+6,5]; } a) 10.1 y 10.2 dan error sintáctico, 10.3 dan error semántico b) 10.1, 10.2 dan error semántico, 10.3 da error sintáctico c) 10.1 da error semántico, 10.2 y 10.3 dan error sintáctico d) 10.1 da error sintáctico, 10.2 y 10.3 dan error semántico e) Ninguna de las anteriores Explicació: -10.1: Es produeix error semàntic per intentar inicialitzar mes variables que les declarades (4 i 2). També donaria error sintàctic per posar 1..a (només pot ser número...número o variable...variable).
-10.2: Error semàntic a l’intentar fer el factorial d’un nombre real (només permet enters) .També donaria error sintàctic per no finalitzar amb “;” (Error del professor, per això també pot ser ninguna de las anteriores).
-10.3: L’array permet 1..1 o 1+2, però no els dos alhora, per tant és error sintàctic perquè després del 1..1 espera un “]”. També falla després al intentar inicialitzar la variable tabla amb més valors dels inicials.
23 EXAMEN DE PRÁCTICAS 2017 1.- Respecto al siguiente test, el compilador dará el siguiente resultado: procedure main() { var a:array [2] of array[3.0] of integer; var b:integer; b = a[2][1 ; } a) Daría error semántico en la línea 3.
b) Daría error sintáctico en la línea 5.
c) Daría error sintáctico en la línea 3.
d) No daría ningún error.
e) Ninguna de las anteriores Explicació: El compilador falla al primer error -Línia 3: Error semàntic perquè hem declarat un array i només es poden introduir les dimensions com a enters, mai reals.
-Línia 5: Error sintàctic perquè falta “]” per tancar array.
El 0 o es pot posar en l’nicialització d’un array, però si en l’accés. S’accepta 3+2 ? 2. ¿Cuál es el orden e implementación correctos de las reglas BNF para añadir al compilador básico un operador con mayor prioridad que el producto y la división y con asociatividad por la derecha? a) … Rule <NouOp> :: = <factor> { OpX <factor>} Rule <factor> :: … b) … Rule < NouOp> :: = <factor> { OpX < NouOp >} Rule <factor> :: … c) … Rule < NouOp> :: = <factor> [ OpX < NouOp >] Rule <factor> :: … d) … Rule < NouOp > :: = < NouOp > [OpX <factor>] Rule <factor> :: … e) Ninguna de las anteriores Explicació: Ha de ser associativitat per la dreta i per això s’utiltiza “[“, per fer associativitat per l’esquerra seria “{“. La D no avança per l’arbre.
3) Respecto a la declaración de tipos con arrays, ¿qué comprobaciones se tienen que hacer en la regla <Tipus>? a) Comprobación de tipo de datos de las dimensiones b) Comprobación de dimensiones coherentes en el caso de arrays con rangos y de dimensiones mayores que 0 en arrays multidimensionales.
c) a) y b) d) a) y b) y comprobar que los tipos de datos y tamaños coincidan en la inicialización.
e) Ninguna de las anteriores Explicació: -Tipo de datos: Que la declaració de dimensions sigui sempre en enters -Dimensiones: En rangos ha de ser igual o creixent (1..1, 1..3, no 2..1) i en multidimensionals han de ser major que 0 24 -L’array es declara a <Tipus> però s’inicialitza a <DecVar> quan crides a <DecInit> (on es comprova e dades i mida coincideixin.
4) ¿Cuál sería el código completo generado que debería generar el siguiente código? function f1(): array [2] of array [2] of integer; { var b:array [2] of array [2] of integer; b[0][1] =3; return b; } f1: ILink 16 IPushLit 4 3 IPushAddressBVar -16 IPushLit 4 0 IPushLit 4 8 IMultInt IAddInt IPushLit 4 1 IPushLit 4 4 IMultInt IAddInt IPopInd 4 IPushBVar 16 -16 IPopBVar 16 8 IUnlink IRet f1: ILink 16 IPushLit 4 3 IPushAddressBVar -16 IPushLit 4 0 IPushLit 4 8 IMultInt IPushLit 4 1 IPushLit 4 4 IAddInt IPopInd 4 IPushBVar 16 -16 IPopBVar 16 8 IUnlink IRet (a) (b) f1: ILink 16 IPushLit 4 3 IPushAddressBVar -16 IPushLit 4 0 IPushLit 4 8 IMultInt IAddInt IPushLit 4 1 IPushLit 4 4 IMultInt IAddInt IPopInd 4 IPushBVar 16 -16 IPopBVar 16 8 IUnlink IRet IUnlink IRet (c) f1: ILink 16 IPushLit 4 3 IPopAddressBVar -16 IPushLit 4 0 IPushLit 4 8 IMultInt IAddInt IPushLit 4 1 IPushLit 4 4 IMultInt IAddInt IPushInd 4 IPopBVar 16 -16 IPushBVar 16 8 IUnlink IRet IUnlink IRet (d) e) Ninguna de las anteriores Explicació: El resultat podria ser C però el retorn d’un array s’ha de fer mitjançant l’instrucció IPopDispVar 16 8 0. Aquesta instrucció treu el valor de la pila i el guarda en el bloc d’activació a través del display (mida, nivell, desplaçament).
5.- ¿Cuál de los siguientes test han de dar algún error (ya sea sintáctico o semántico)? 10.1) procedure main() { var n1: array[5] of integer; n1 = {1,2,3,4,5; var n2: array[0] of integer = 1; var n3: integer; n3 = n1[6]; } 10.2) type tabla=array [2] of array [3] of integer; procedure main() { var a:tabla={{1,2.0,3+6,5},{3,5,8}}; } 10.3) procedure main() { function f1(a,b:real,c:integer):real { var d:real; d = a/c + b; return d; } } 25 a) 10.1 y 10.2 dan error sintáctico y 10.3 no da error de ningún tipo b) 10.1 da error sintáctico, 10.2 da error semántico y 10.3 no da error de ningún tipo.
c) 10.1 da error sintáctico, 10.2 y 10.3 dan error semántico.
d) 10.1, 10.2 y 10.3 dan error semántico.
e) Ninguna de las anteriores Explicació: -10.1: Errors sintàctic per no tancar “}”, semàntic per inicialitzar a 0 un array i intentar accedir-hi, i semàntic al final per accedir a una posició que no pertany a l’array n1 -10.2: Error semàntic perquè és una taula d’enters i intentem introduir un array, també hi ha un error semàntic al inicialitzar malament la taula, doncs han de ser 2 arrays de 3 valors.
6.- ¿Cómo se comprueba una declaración duplicada cuando en la regla aparece identificador#(a)? a) @TS.ComprovarDuplicat(identificador); b) @TS.ComprovarDuplicat(a); c) @ComprovarDuplicat(identificador); d) @ComprovarDuplicat(a); e) Ninguna de las anteriores.
Explicació: Quan fem indentificador#(a) estem guardant el nom de l’identificador dins la variable a. La comprovació del duplicat es fa mirant “a” a la taula de símbols (TS).
7.- En la regla <AccesIndex(CodAcc,&t,&LValue)> el código generado para calcular la posición de un elemento de un array (a[i]) se guarda en: a) En CodAcc.Codi b) En CodAcc.Adreca c) En CodAcc. TipusResultat d) En Cod.Codi e) Ninguna de las anteriores.
Explicació: Dins d’AccesIndex utilitzem CodAcc per calcular l’adreça (conté Adreca per guardar posició adreça, TipusResultat i Codi). També s’utilitza CodIndex per calcular l’index per posteriorment trobar l’adreça.
8.- ¿Dónde se genera el código que pone el valor en una inicialización de una variable simple? a) En <DecVar> y el código será IPushBVar o IPushGVar.
b) En <Tipus> y el código será IPushBVar o IPushGVar.
c) En <DecVar> y el código será IPushBVar, IPushGVar o IPushDispVar.
d) En <Tipus> y el código será IPushBVar, IPushGVar o IPushDispVar.
e) Ninguna de las anteriores.
Explicació: La inicialització es fa mitjançant un push i un pop (portar a la pila i posteriorment a variable) i es duu a terme a <DecInit> (inserir el valor a la variable), a <DecVar> generes la declaració de la variable (nom de la variable) i a <Tipus> especifiques tipus de la variable.
9.- ¿Cuáles son las operaciones que se pueden hacer con una etiqueta? a) Crearla con e=Etiqueta(nombre), definirla con Cod.Put(DefEtiqueta(e)) y referenciarla con Cod.Put(…,RefEtiqueta(e)).
b) Crearla con e=NovaEtiqueta(nombre), definirla con Cod.Put(DefEtiqueta(e)) y referenciarla con Cod.Put(…,RefEtiqueta(e)).
c) Crearla con e=TS.NewEtiqueta(nombre), definirla con Cod.Put(DefEtiqueta(e)) y referenciarla con Cod.Put(…,RefEtiqueta(e)).
d) Crearla con e=Etiqueta(nombre), definirla con Cod.Put(e) y referenciarla con Cod.Put(IJmp,e).
e) Ninguna de las anteriores.
Explicació: Etiqueta no té relació amb la taula de símbols (TS) 26 10.- ¿Qué comprobación semántica se realiza en una condición representada sintácticamente con <Expressio(cod,t,true,LValue)>? a) @if (LValue!=TBool) throw Exception(…); b) @if (!LValue) throw Exception(…); c) @if (t!=TInt) throw Exception(…); d) @if (t!=TBool) throw Exception(…); e) Ninguna de las anteriores.
Explicació: Quan utilitzem condició (if o while) voldrem comprovar que t és booleà per poder guardar el resultat en cas que haguem de fer un jump.
LValue (valor de l’esquerra) comprova quina classe d’expressió tenim, true som assignables (a de a=1) i si és false serà que ens poden assignar (1 de a=1) 27 ...

Comprar Previsualizar