Etapa 1: Infraestrutura e AST
Objetivos
- Compreender o padrão de projeto Composite para representar hierarquias.
- Definir a representação interna do código fonte: a Árvore Sintática Abstrata (AST).
- Implementar a Tabela de Símbolos inicial.
Fundamentação Teórica
A AST (Abstract Syntax Tree) é a estrutura de dados central de um compilador. Ela descarta detalhes sintáticos irrelevantes (como parênteses e vírgulas) e mantém a estrutura lógica do programa.
Cada nó da árvore representa uma construção da linguagem (uma soma, um if, uma declaração). Em Java, isso tipicamente é implementado com uma classe base abstrata e várias subclasses.
Atividades Práticas
1. Hierarquia de Classes da AST
Crie um pacote br.com.compiler.ast. Sugerimos a seguinte hierarquia:
AstNode(abstrata): Classe base. Pode ter campos comolineecolumnpara rastreamento de erro.Expression(abstrata): Representa algo que avalia para um valor.BinaryExpression: GuardaExpression left,Expression right,String operator.UnaryExpression: GuardaExpression expr,String operator.Literal: Guarda o valor (String, Integer ou Boolean).Identifier: Guarda o nome da variável usada.
Command(abstrata): Representa uma ação.AssignmentCommand:Identifier id,Expression expr.IfCommand:Expression condition,Command thenBranch,Command elseBranch.WhileCommand:Expression condition,Command body.PrintCommand:Expression expression.BlockCommand:List<Command> commands.
Program: O nó raiz, contendo declarações e o corpo principal.
2. Tabela de Símbolos (Symbol Table)
A tabela de símbolos armazena informações sobre os identificadores (variáveis). Crie a classe SymbolTable: - Deve possuir um Map<String, Symbol>. - Métodos necessários: - add(String name, Symbol symbol): Tenta adicionar, erro se já existir. - get(String name): Busca um símbolo, retorna nulo se não existir.
O objeto Symbol deve guardar, por enquanto: - Nome. - Tipo (Integer, Boolean, String) - pode ser null nesta etapa. - Valor (opcional, para interpretadores).
3. Interface do Scanner (Preparação)
Defina uma interface simples para abstrair a leitura de tokens, que será implementada na Etapa 2.
public interface IScanner {
Token nextToken();
}E a classe Token:
public record Token(TokenType type, String text) {}O que entregar
- Código Fonte: Classes da AST e Tabela de Símbolos implementadas.
- Teste Simples: Uma classe
MainASTque instancia manualmente uma pequena árvore (ex:x := 10 + 5) e imprime sua estrutura (sobrescreva otoString()das classes).
Exemplo de teste manual:
// Representando: x := 10 + 5;
Expression dez = new Literal("10");
Expression cinco = new Literal("5");
Expression soma = new BinaryExpression(dez, cinco, "+");
Command atrib = new AssignmentCommand(new Identifier("x"), soma);
System.out.println(atrib);