schnorr / comp

Disciplina de Compiladores (INF01147) - INF/UFRGS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Perguntas sobre Tamanhos e Tipos

AvatarHurden opened this issue · comments

Durante a implementação do trabalho, surgiram algumas dúvidas a respeito da especificação. Seguem:

  1. Como devemos definir o tamanho de uma variável de tipo string? É dito que

Um string ocupa 1 byte para cada caractere,

mas o valor de uma variável é dinâmico.

  1. Não consegui entender a utilidade das naturezas (pelo menos da maneira que foram especificadas). Em princípio, apenas identificadores são salvos na tabela de símbolos (seja para variáveis, funções ou nomes de tipos de usuário). Dessa forma, quando que as naturezas de literais são usadas?

Hey @AvatarHurden, de fato na nossa linguagem temos que o tipo string tem tamanho dinâmico, pelo fato de poder atribuir a cada comando um novo valor para variáveis desse tipo. Mudanças de tamanho de variáveis desse tipo são simples de resolver em tempo de execução, mas complicadas para o tempo compilação. Sendo assim, adotemos uma abordagem simples: o tamanho (máximo) de uma variável do tipo string é o da primeira atribuição (ou inicialização com o operador apropriado). Depois disso, verificamos no caso de atribuições se o valor a ser atribuído é capaz de ser contido pela variável. Nota que esse último procedimento não precisa necessariamente ser uma verificação semântica, pois diz respeito a geração de código.

Desculpa se estou perguntando coisas simples, mas então não entendo qual a razão de capturarmos informação de tamanho nessa etapa de análise semântica. Se esse valor vai acabar mudando durante o tempo de execução, não faria mais sentido fazer todo o cálculo de tamanho de variáveis naquele momento?

O único caso onde isso acontece é para o tipo string, que concordo contigo @AvatarHurden, ele é um pouco estranho em nossa linguagem pois é o único que tem tamanho dinâmico. Para os demais, esse problema inexiste pois os tamanhos não mudam. Isso em si não é um problema: a forma descrita acima, com um tamanho máximo imposto pela primeira atribuição ou inicialização resolve a questão.

O ponto 2 da dúvida inicial não foi respondida. Na Especificação da Etapa 4 temos, no item 1:

natureza (literal, variável, função, etc)
tipo (qual o tipo de dado deste símbolo)

A diferença entre esses dois campos é a seguinte.

  1. O campo natureza classifica uma entrada na tabela de símbolos como literais ou variável ou função (ou outro, a critério de grupo). Isso serve para facilitar a procura por funções ou variáveis, por exemplo. Embora o dúvida de @AvatarHurden leve a entender que apenas identificadores ficam na tabela de símbolos, as funções também deve se fazer presentes (mesmo o nome de uma função sendo um identificador pelo sintático) assim como os literais. Nenhum tipo de verificação/consulta é feita com os literais, mas sua presença na tabela pode ajudar nas próximas etapas na hora de decidir onde eles devem ficar (no segmento de dados do programa ou na pilha juntamente com os registros de ativação das funções) e o espaço que ocupam.
  2. O campo tipo indicar qual o tipo de dado do símbolo, ou seja, se é um float, int, char, bool, string, ou um tipo de usuário (neste último caso deve haver uma forma de identificador o tipo de usuário, cujo nome e estrutura deve ficar registrado em algum lugar). Este campo pode inclusive ser utilizado para indicar que se trata de um vetor de um determinado tipo.