Etapa 6: Semântica - Tipos e Verificações

Objetivos

  • Implementar o sistema de tipos da linguagem.
  • Verificar consistência em operações (ex: não somar booleano com inteiro).
  • Validar expressões lógicas em estruturas de controle.

Fundamentação Teórica

Após garantir que as variáveis existem (Etapa 5), precisamos saber se estão sendo usadas corretamente. Se x é integer, x := "ola" deve ser um erro. A verificação de tipos geralmente ocorre Bottom-Up (das folhas para a raiz): 1. Descobre-se o tipo das folhas (literais e variáveis). 2. Propaga-se o tipo para os nós pais (uma soma de dois inteiros resulta num inteiro). 3. Verifica-se as regras nos nós de comando.

Atividades Práticas

1. Inferência de Tipos na AST

Adicione um campo Type type na classe abstrata Expression. No seu SemanticAnalyzer (ou num novo passe TypeChecker), implemente a lógica ao visitar os nós:

  • Literal:
    • 10 -> Type.INTEGER
    • "ola" -> Type.STRING
    • true -> Type.BOOLEAN
  • Identifier:
    • Consulta a Tabela de Símbolos. Se a variável x foi declarada como integer, o nó x tem tipo Type.INTEGER.
  • BinaryExpression:
    • Se operador é +, -, *, /: Verifica se Esq e Dir são INTEGER. Se sim, tipo do nó é INTEGER. Senão, Erro.
    • Se operador é >, <, =: Verifica se Esq e Dir são compatíveis. Tipo do nó é BOOLEAN.

2. Verificação de Comandos

  • Atribuição (var := expr):
    • Verifica se tipo(var) == tipo(expr).
  • If / While (cond):
    • Verifica se tipo(cond) == BOOLEAN.

3. Reportando Erros

Acumule os erros encontrados em uma lista. Não pare no primeiro erro, tente encontrar o máximo possível. Exemplos de mensagens: - “Erro Semântico na linha 10: Operação ‘+’ não suportada para tipos INTEGER e STRING.” - “Erro Semântico na linha 15: Condição do ‘if’ deve ser booleana.”

O que entregar

  • Código de verificação de tipos.
  • Casos de teste .pas:
    1. Atribuição inválida (int := string).
    2. Operação aritmética com booleanos (10 + true).
    3. Condição de if numérica (if 10 then ...).
    4. Programa complexo válido (fatorial, fibonacci) passando sem erros.
Back to top