Exercício: Construir as tabelas de sistema de tipos para todos os operadores utilizadosna gramática da linguagem P ASCAL jr .Operadores Aritméticos: +, -, *, /, **Operadores Relacionais: ==, !=, >, =,
sendo, essas tarefas são realizadas nas fases de análise sintática e/ou semântica, onde sereferencia à tabela, cada vez que um identificador for encontrado no programa.Os problemas enfrentados ao se projetar uma tabela de símbolos são:• a quantidade de símbolos armazenados na tabela, depende do programa fonte sobanálise, ou seja, é desejável uma estrutura dinâmica de alocação de memória paraa tabela. Se uma estrutura estática for construída, esta deve ter um tamanhosuficientemente grande para suportar qualquer programa (limitação de tamanho);• a quantidade de acesso à tabela (inclusões e consultas), pode ser bastante grande,dependendo do programa. Pode-se organizar os dados na tabela através de listaslineares, árvores binárias ou tabelas hash. O mecanismo linear, apesar de simples, éineficiente para programas grandes, já o hashing tem melhor desempenho mas exigemaior esforço de programação.• cada entrada na TS está associada a um nome de identificador. Estas entradaspodem não ser uniformes, ou seja, os atributos de um identificador de variávelnão são os mesmos de um identificador de função, por exemplo. O uso de registrosvariantes pode ser uma alternativa elegante para se organizar a estrutura que conterátais atributos.Enfim, ao se projetar uma tabela de símbolos deve se levar em conta: a quantidade dedados a serem armazenados, a natureza desses dados, o tempo de acesso e a facilidade demodificação da estrutura de armazenamento desses dados. Essas preocupações poderãoestar relacionadas à aplicação que se deseja desenvolver.5.2.1 Atributos dos Nomes dos IdentificadoresDe maneira geral, qualquer informações acerca dos identificadores definidos em um programafonte, podem (e devem) ser armazenados em uma tabela de símbolos. O conjuntode atributos é inerente às características da linguagem sendo reconhecida.Atributos como nome, tipo, uso no programa (isto é: variável, constante, procedimento,função, rótulo), tamanho de memória a ser alocada (em bytes), endereço (onde foialocada), escopo, etc.Para efeito da disciplina (implementação do protótipo) apenas os atributos: nome,tipo, endereço, natureza (var ou const).5.2.2 HashingA função de espalhamento é responsável por determinar qual endereço (na tabela Hash),uma determinada chave k deve ser inserida.Exemplo: int Hash(int Key){return Key%K T AM HASH; } onde, K TAM HASHindica o tamanho (n ◦ de posições) do vetor hash.A função hash acima gera valores entre 0 e K TAM HASH-1 em função do valor deKey (chave a ser inserida).Problema!: Caso exista duas chaves que possuam o mesmo valor de chave, a funçãohash irá gerar o mesmo endereço de vetor. Isto é chamado de colisão ou conflito deespalhamento.47