7 de Febrero de 2007 Examen CP1 de prácticas Nombre: Apellidos: DNI: 1 2 3 4 5 6 7 8 9 10 Respuestas al Test a b c d a b c d a b c d a b c d a b c d a b c d a b c d a b c d a b c d a b c d e e e e e e e e e e 1. La gramática que generamos en la práctica es: a. LR(0) y libre de contexto. b. LR(k) para k>1 c. LL(1) y ambigua. d. LL(1) y no ambigua. e. Ninguna de las anteriores. 2. El compilador que generamos en la práctica es: a. De una pasada y el análisis sintáctico Bottop-up (ascendente). b. De una pasada y el análisis sintáctico Top-down (descendente). c. De n pasadas siendo n el número de pasadas necesarias para el análisis y el análisis sintáctico Bottop-up (ascendente). d. De n pasadas siendo n el número de pasadas necesarias para el análisis y el análisis sintáctico Top-down (descendente). e. Ninguna de las anteriores. 3. ¿Cómo se define la instrucción de escritura de la gramática de la práctica? a. write “(“ ( string | <exp_aritmetica> ) { , ( string | <exp_aritmetica> ) } “)” “;” b. write “(“ <exp> { , <exp> } “)” “;” c. write “(“ ( ident “[“numero”]” | string ) { , ( ident “[“numero”]” ) } “)” “;” d. write “(“ ( <exp> | string ) { , ( <exp> | string ) } “)” “;” e. Respuestas c y d. 4. ¿Cómo se define la instrucción de control de flujo if de la gramática de la práctica? a. if <exp> then {<instruccio>} [else {<instruccio>} ] endif b. if <exp_booleana> then {<instruccio>} [else {<instruccio>} ] endif c. if “(“ <exp_booleana> “)” <instruccio> [else <instruccio>] d. if <exp> then <instruccio> [else <instruccio>] end e. Ninguna de las anteriores. 5. ¿Cuál de los siguientes códigos es correcto en la práctica? a. b. c. real notas(int a) int notas; real notas(int a) body body if a<5 then real notas() if a<5 then int notas; body int notas; else notas = 1; notas=1; endif endif; notas = 1; endbody endbody endbody d. real notas() body int notas; notas = 1; endbody e. Ninguna de las anteriores. 6. ¿Qué información guardamos en la T.S referente a las funciones en la práctica? a. El nombre, el número de parámetros, y el tipo de retorno. b. El nombre, el número y tipo de los parámetros ordenados. c. El nombre, el número y tipo de parámetros, el desplazamiento y tipo del valor de retorno y la posición. d. El nombre, el número y tipo de parámetros, el desplazamiento y tipo del valor de retorno y el nivel. e. Ninguna de las anteriores. 7. ¿Cuándo creamos y eliminamos ámbitos en la gramática de la práctica? a. Al declarar una función o un procedimiento. b. La opción a) y en los cuerpos de instrucciones de las instrucciones if/else y while. c. Al declarar una función y en el cuerpo de instrucciones del if/else y while. d. La opción b) y c) son correctas. e. Ninguna de las anteriores. 8. Si tenemos el siguiente programa ejemplo.txt: int main() body real[2] r; int i; r[0] = 2.3; r[1] = 2.0; r[2] = r[0]*r[1]; i=r; write (“Resultado: “,i); endbody ¿Cual será la salida si compilamos y ejecutamos el código de la práctica? a. b. c. d. Resultado: 4 Resultado: 4.6 Error: EXCEPTION_ACCESS_VIOLATION Error a la linea 8 del fitxer ejemplo.txt i=r; ^ Error de tipus de dades en = e. Ninguna de las anteriores. 9. Si tenemos el siguiente programa ejemplo1.txt: int i; int multiplica(int m) body return m*2; endbody int main() body i = 2; i = multiplica(i) + multiplica(i-1); endbody ¿Cual será el código en pseudosassembler correcto que podemos generar para la instrucción: i = multiplica(i) + multiplica(i-1); ? a. b. c. d. IAddSP -4 IPushBVar 4 -4 ICall multiplica IAddSP 4 IAddSP -4 IPushBVar 4 -4 IPushLit 4 1 ISubInt ICall multiplica IAddSP 4 IAddInt IPopBVar 4 -4 IAddSP -4 IPushGVar 4 i ICall multiplica IAddSP 4 IAddSP -4 IPushGVar 4 i IPushLit 4 1 ISubInt ICall multiplica IAddSP 4 IAddInt IPopGVar 4 i e. Ninguna de las anteriores. IPushGVar 4 -4 IAddSP -4 ICall multiplica IAddSP 4 IPushGVar 4 -4 IPushLit 4 1 ISubInt IAddSP -4 ICall multiplica IAddSP 4 IAddInt IPopGVar 4 -4 IAddSP -4 IPushBVar 4 -4 ICall multiplica IAddSP 8 IAddSP -4 IPushBVar 4 -4 IPushLit 4 1 ISubInt ICall multiplica IAddSP 8 IAddInt IPopBVar 4 -4 10. Si tenemos el siguiente programa ejemplo2.txt: real[30] lista; int notas(int pos) body read(lista [pos]); if lista [pos]>=5.0 then return 1; else endif return 0; endbody int main() body int result; notas(0); endbody ¿Cual será el código en pseudosassembler correcto que podemos generar para la instrucción: if lista[pos]>=5.0 then return 1; else endif? a. b. IPushAddressGVar lista IPushLit 4 0 IPushLit 4 8 IMultInt IAddInt IPushInd 8 IPushLit 8 5 IGreaterEqReal IJmpFalse L_Else IPushLit 4 1 IPopBVar 4 12 IUnlink IRet IJmp L_FiIf L_Else: L_FiIf: c. IPushAddressGVar lista IPushBVar 4 8 IPushLit 4 8 IMultInt IAddInt IPushInd 8 IPushLit 8 5 IGreaterEqReal IJmpFalse L_Else IPushLit 4 1 IPopBVar 4 12 IUnlink IRet IJmp L_FiIf L_Else: L_FiIf: e. Ninguna de las anteriores. IPushAddressGVar lista IPushBVar 4 8 IPushLit 4 8 IMultInt IAddInt IPushInd 8 IPushLit 8 5 IGreaterEqReal IJmpFalse L_Else IPushLit 4 1 IPopBVar 4 12 IJmp L_FiIf L_Else: L_FiIf: d. IPushAddressGVar lista IPushBVar 4 8 IPushLit 4 8 IMultInt IAddInt IPushInd 8 IPushLit 4 5 IIntToReal IGreaterEqReal IJmpFalse L_Else IPushLit 4 1 IPopBVar 4 12 IUnlink IRet L_Else: L_FiIf: