Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grupo 09 - Mudanças no Interpreter para adicionar suporte a Ponteiros e Records #156

Open
wants to merge 10 commits into
base: master
Choose a base branch
from

Conversation

MaxwellOliveira01
Copy link

Maxwell Oliveira dos Reis - 221002100
Luiz Eduardo Pereira dos Reis - 221017088
João Gilberto de Oliveira Teixeira - 211036070

O tipo Location foi dividido em "BaseLocation" e "NullLocation", o motivo ficará mais claro a seguir.

Ponteiros:

  • Quando um ponteiro é declarado, ele ainda não tem um espaço reservado na memória. Assim, no mapa "globals", nós adicionamos à este ponteiro uma NullLocation, para representar isto.
  • Ao dar o comando "NEW(a)", o ponteiro "a" passará a ter um espaço na memória. Isso é, deixará de ter uma NullLocation e terá uma entrada no mapa locations.
  • O assignment para ponteiros também foi implementado.
  • Uma coleção de testes para ponteiros também foi adicionada.

Segue um exemplo do quê agora é possível fazer com os ponteiros. Note que, neste caso, tanto "a" e "b" apontarão para um endereço com valor "10.5"
image

Records:

  • Ao declarar um ponteiro para uma record "a" que possui os campos "field_1" e "field_2", o programa irá criar as variáveis "a.field_1" e "a.field_2" normalmente, como se fossem variáveis comums.
  • Sempre que precisamos consultar o valor de um campo, por exemplo da record "a" e do "field_1", nós procuramos pela variavel "a.field_1" e a retornamos.
  • Também foram adicionados testes para as records.

Segue um exemplo do quê agora é possível fazer com as records.
image

Problemas encontrado:
Atualmente a AST não permite algo do tipo "a^^ := 5" em ponteiros. Isso limita a criação de ponteiros de vários níveis, como um "ponteiro de ... de ponteiro", pois só permite que um nível do ponteiro seja utilizado no programa Oberon. Para auxiliar um possível grupo que passe por este problema no futuro, nós deixamos alguns trechos de código que serão úteis:

  • Adicionamos o campo "indirections" no PointerAssignment para representar quantos "^" o ponteiro está utilizando.
  • Adicionamos uma função "dfs" cuja função é "andar" no grafo gerado pelos ponteiros (que, na prática, é andar pelo mapa locations). Note que, para que esta função seja realmente útil, o "indirections" deve ser passado corretamente. Para indirections = 1, o código está testado e funciona perfeitamente.
  • Criamos de forma manual Módulo em Oberon para um teste específico, ele está presente no final do InterpreterTest.scala. Este teste utiliza o "indirections" citado acima.

@MaxwellOliveira01 MaxwellOliveira01 changed the title Mudanças no Interpreter para adicionar suporte a Ponteiros e Records Grupo 09 - Mudanças no Interpreter para adicionar suporte a Ponteiros e Records Dec 20, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant