En este laboratorio debemos anotar el AST con los offsets correspondientes para cada variable global, cada variable local y para los parámetros de una función.
Para ello los pasos a seguir son:
- Crear un nuevo visitor llamado
OffsetVisitor
dentro de un nuevo paquetees.uniovi.dlp.visitor.codegeneration
y añadirlo a nuestra claseCompiler
para que se ejecute después de la comprobación de tipos. - A cada tipo de nuestro AST, crear una función
getNumberOfBytes(): int
que nos devuelva cuánto ocupa dicho tipo. - Crear una propiedad
offset
enRecordField
yVarDefinition
, y anotarla con el valor adecuado.
Comprobar el AST con el programa de ejemplo:
bin\xana.bat examples/codegeneration/offsets/simple.xana --introspector
Para tener como referencia de cómo deben ser los offsets, el siguiente programa:
i :: char
j :: int
def suma(a :: int, b :: double) :: double do
real :: double
letra :: char
return a + b
end
def main() do
suma(1, 2.0)
end
Debe tener una representación similar (no entraremos todavía en detalles) en memoria cuando suma
es invocada:
------+----------------------+ <-- Inicio de memoria (variables globales)
0000 | i |
------+----------------------+
0001 | j |
0002 | |
------+----------------------+
| ... |
------+----------------------+ <-- SP: Límite superior de la pila
1005 | letra |
------+----------------------+
1006 | real |
1007 | |
1008 | |
1009 | |
------+----------------------+ <-- BP
1010 | Previous BP |
1011 | (1020) |
------+----------------------+
1012 | Return address |
1013 | to main |
------+----------------------+
1014 | |
1015 | 2.0 |
1016 | (b) |
1017 | |
------+----------------------+
1018 | 1 |
1019 | (a) |
------+----------------------+
1020 | Previous BP |
1021 | (1024) |
------+----------------------+
1022 | Return address |
1023 | |
------+----------------------+ <-- Límite inferior de la pila