Yo me he tragado este truño sin patatas y ahora vosotros tambien.
!!! 3 Horitas con el ejercicio ¡¡¡¡
PRACTICA COMPILACIÓN
Propósito: Entender de una manera práctica como actua un compilador en su fase de análisis.
Gramática aceptada por nuestro compilador:
Entero íd | id, id
Leer (id)
Id =ent | expression
EXPRESION = id | ent | id * id | id + ent | id - ent
EXPRESION = EXPRESION + EXPRESION
Si (EXPRESION
Cadena = ‘str’
Mientras (EXPRESION < EXPRESION)
Fin Mientras
hacer EXPRESION
hacer EXPRESION
Fin si
Código Ejemplo:
0. Entero A,B
1. Entero C
2. leer (A)
3. leer (B)
4. C = (A * B) + 2
5. Si (C>0)
6. Imprimir (C,’es positivo’)
7. Si no
8. Imprimir (C,’es negativo’)
9. Fin si
Análisis Léxico
Entero id1,id2
Entero id3
Leer id1
Leer id2
Id3 = (id1 * id2) + 2
Si (id3 >0)
Imprimir (id3,’es positivo’)
Si no
Imprimir (id3,’es negativo’)
Fin si
Análisis Sintáctico y Semántico
Entero id1,id2
Entero id3
Ent = leer id1 Válido
Ent = leer id2 Válido
Id3 = expresion
Expresion = expresion + expresion
Expresion = id1 * id2 + expresion
Expresion = id1 * id2 + ent Válido
Si (Expresion < Expresion)
id3 = Ent < Expresion = ent Válido
(Además se comprueba la concordancia de tipos con la tabla de simbolos ent
Expresion= ent. Válido
Si no Válido
Imprimir (Expresion, cadena)
Expresion= ent. Válido
Fin si.
Ejercicio 1
Con la gramática definida anteriormente y siguiendo el ejemplo, describir la fase de análisis para el código dado (análisis léxico, sintáctico y semántico) dibujando su correspondiente tabla de símbolos.
Pon tres ejemplos de error lexico, sintactico y semantico
Entero W,X
Entero Y,Z
Entero N
N=0
Leer (W)
Leer (X)
Leer (Y)
Z= W * X + Y * 5
Mientras (W < Z)
hacer Z=Z-1
hacer N=N+1
Fin Mientras
Imprimir ( N, ‘Unidades de diferencia entre W y Z=(W* X + Y *5)’)
Lexico:
Entero id1,id2
Entero id3,id4
Entero id5
Id5=ent
Leer id1
Leer id2
Leer id3
Id4=(id1*id2+id3*ent)
Mientras (id1
Hacer id5=id6+ent
Fin mientras
Imprimir (id5, ‘unidades de diferencia entre id1 y id4 = (id1*id2+id3+ent’)
Fin si
Sintactico semantico
Entero id1,id2
Entero id3,id4
Entero id5
Id5= ent
Leer id1Valido
Leer id2Valido
Leer id3Valido
Id4=exp
expresión= expresión + expresion
mientras (id1 < id4)
hacer id4 = expresion
hacer id4=id4-ent
hacer id5=expresión
fin mientras
Imprimir (exp,cadena)
Fin si
Ejercicio 2
Siguiendo el ejemplo pero esta vez a la inversa, define una gramatica de compilador válida para el siguiente código:
Entero A ,resultado
1. leer (A)
2. resultado = 1
3. mientras (A>1)
4. resultado = resultado * A
5. A = A – 1
6. fin mientras
7. imprimir (resultado)
gramatica
Entero íd , id
Leer (id)
Id =ent | exp
Mientras (expresión > expresion)
EXPRESION = id | ent | id * id | id - ent
Fin Mientras
Imprimir (id)
Fin si
la respuesta es la a)
Escrito por El Abuelo Cascarrabias a las Abril 16, 2004 04:27 PM