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.STRINGtrue->Type.BOOLEAN
- Identifier:
- Consulta a Tabela de Símbolos. Se a variável
xfoi declarada comointeger, o nóxtem tipoType.INTEGER.
- Consulta a Tabela de Símbolos. Se a variável
- BinaryExpression:
- Se operador é
+,-,*,/: Verifica se Esq e Dir sãoINTEGER. Se sim, tipo do nó éINTEGER. Senão, Erro. - Se operador é
>,<,=: Verifica se Esq e Dir são compatíveis. Tipo do nó éBOOLEAN.
- Se operador é
2. Verificação de Comandos
- Atribuição (
var := expr):- Verifica se
tipo(var) == tipo(expr).
- Verifica se
- If / While (
cond):- Verifica se
tipo(cond) == BOOLEAN.
- Verifica se
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:- Atribuição inválida (
int := string). - Operação aritmética com booleanos (
10 + true). - Condição de if numérica (
if 10 then ...). - Programa complexo válido (fatorial, fibonacci) passando sem erros.
- Atribuição inválida (