schnorr / comp

Disciplina de Compiladores (INF01147) - INF/UFRGS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[E3] Dúvida sobre tipos na AST

D-to-the-K opened this issue · comments

A especificação da etapa 3 tem a seguinte passagem:

"É importante notar que normalmente as declarações de tipos e variáveis podem ser omitidas da AST, pois estas construções linguísticas não geram código, salvo nas situações onde as variáveis declaradas devem ser inicializadas."

Se entendi corretamente, isso significa que as seguintes simplificações são válidas na AST:
• Ignorar declarações de tipos de usuário
• Ignorar declarações de variáveis globais
• Ignorar declarações de variáveis locais não-inicializadas
• Transformar declarações de variáveis locais inicializadas em atribuições
• Ignorar modificadores como static em declarações de funções
• Ignorar tipos de funções em declarações de funções
• Ignorar listas de parâmetros em declarações de funções

Pelo que vejo, o único ponto de atenção seria quanto à compilabilidade da saída da função descompila(), tendo em vista os testes automáticos. Ignorando-se os tipos das funções, seria necessário imprimir um tipo dummy, como int, nas declarações de funções.

Este entendimento é correto? Se não, o quanto podemos simplificar/omitir da AST? E o quanto a saída da descompila() precisa se assemelhar ao código original?

Devemos evitar simplificações demasiadamente drásticas na AST. Em um cenário ideal, o que é gerado no segundo passo de descompilação deve se assemelhar o máximo possível do código original. Ou seja, devemos guardar a mesma semântica. A remoção de static, ou da lista de funções/parâmetros, e inicialização de variáveis, por exemplo, podem levar a alteração da semântica de um programa.

A remoção de static, ou da lista de funções/parâmetros, e inicialização de variáveis, por exemplo, podem levar a alteração da semântica de um programa.

O ideal é manter essas construções na AST então? Como seria a árvore de uma construção que possui o static, por exemplo, ela deve guardar um nodo com a palavra reservada static?

E a declaração de tipos e variáveis pode (ou deve) ser omitida? Pela passagem da especificação citada acima, e com essa resposta, entendo que não é necessário vide que não alteraria a semântica do programa.

Meu entendimento é que essas coisas como static e tipos ficarão na tabela de símbolos, de modo que é desnecessário perder tempo adicionando essas informações como nodos da AST. Estou errado?

Pela falta de resposta, vou supor que meu entendimento estava errado e que o programa impresso na saída padrão deve conter todos os tipos, todos os modificadores de static e const, que a inicialização não pode ser substituída por atribuição, e que a lista de argumentos de função, com consts opcionais, não pode ser omitida.

@apcomello Assumindo uma declaração de variável local, a presença ou não de static na árvore influencia a semântica. Caso estiver presente, a variável tem alocação estática no segmento de dados. Caso contrário, sua alocação será automática na pilha. Como não temos ainda outra forma de manter essas informações, a única solução é registrar na AST. A solução sugerida por @D-to-the-K envolve a tabela de símbolos, mas nós ainda não temos tal tabela (ela aparece somente na E4).

Aproveito esta oportunidade para deixar o feeedback de que essa toy language do trabalho está excessivamente complexa. O trabalho da disciplina não precisa ser tão grande para nos ensinar como um compilador funciona com flex e bison.