Aula 14: Projeto de Linguagens e AST
Objetivos
- Entender o padrão Visitor.
- Estruturar a AST para suportar múltiplas passadas.
Conteúdo
A Árvore Sintática Abstrata (AST) é a peça central de qualquer compilador moderno. Uma vez que o parser valida a sintaxe, ele constrói a AST e sai de cena. Todo o resto do trabalho (semântica, otimização, codegen) acontece passeando por essa árvore.
Por que AST e não Parse Tree?
- Parse Tree (Árvore Concreta): Contém cada detalhe da gramática (“Termo”, “Fator”, parênteses, ponto-e-vírgula). É ruidosa e difícil de navegar.
- AST: Contém apenas a essência lógica. Um nó
Somatem apenas dois filhos (Esq, Dir). Parênteses viram a estrutura da árvore em si.
O Padrão Visitor
O maior desafio da AST é a extensibilidade. Queremos adiconar novas operações (Checar Tipos, Gerar Código, Printar) sem ter que modificar as dezenas de classes da AST (IfNode, WhileNode, AddNode, etc).
O Design Pattern Visitor resolve isso: 1. As classes da AST têm apenas um método: accept(Visitor v). 2. A lógica fica em classes externas que implementam a interface Visitor. - TypeCheckVisitor - CodeGenerationVisitor - PrettyPrintVisitor
Isso permite modularizar o compilador perfeitamente.
Referências
- Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
- Cooper, K., & Torczon, L. (2011). Engineering a Compiler.