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 como line e column para rastreamento de erro.
    • Expression (abstrata): Representa algo que avalia para um valor.
      • BinaryExpression: Guarda Expression left, Expression right, String operator.
      • UnaryExpression: Guarda Expression 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

  1. Código Fonte: Classes da AST e Tabela de Símbolos implementadas.
  2. Teste Simples: Uma classe MainAST que instancia manualmente uma pequena árvore (ex: x := 10 + 5) e imprime sua estrutura (sobrescreva o toString() 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);
Back to top