O objetivo deste exercício é criar um parser e adicionar ações semânticas para produzir sintaxe abstrata para a linguagem MiniJava.
- Use o projeto disponível neste repositório. Este projeto inclui classes Java representando os nós da AST de MiniJava, bem como interface para criação de visitors;
- Observe que já há classes Java utilizadas para representação da tabela de símbolos. Para este exercício especificamente, não iremos utilizar nada relacionado à tabela de símbolos, mas já deixei as classes disponíveis neste projeto, apenas para já irem se familiarizando. A explicação das mesmas seguirá no próximo exercício;
- Caso não esteja confortável ainda com o padrão Visitor, sugiro a leitura da Seção 4.3 do livro Modern Compiler Implementation in Java, de Andrew Appel, além dos links já indicados nas aulas correspondentes. É importante entender como os métodos
accept
evisit
interagem; - Em aula nós discutimos como especificar ações semânticas às regras de produção. Estas ações permitem escrever um interpretador, por exemplo. No entanto, escrever um interpretador diretamente no parser é difícil de implementar e manter, e não permite muitas das otimizações e melhorias esperadas por compiladores, como as discutidas em sala de aula. Desta forma, o papel do parser geralmente envolve a construção de uma representação intermediária, como por exemplo, uma AST. Crie ações semânticas no seu parser com ANTLR de forma que o parser gerado retorna um objeto contendo a AST do programa, ao completar de forma bem-sucedida a análise;
- Lembre de importar explicitamente as classes da AST no seu parser, se elas se localizarem em um pacote distinto;
- No pacote visitor há uma classe denominada
PrettyPrintVisitor
, que você pode utilizar para testar o seu parser e programa. Na classeMain
, ao invés de existir um programa hard-coded como é o caso atualmente, ao término do exercício, você deverá colocar a chamada ao parser gerado por ANTLR, armazenando o resultado em um objeto do tipoProgram
, com o nomeprog
. Uma vez feito o parsing do arquivo, em seguida chame o métodoaccept
passando oPrettyPrintVisitor
, como ilustrado abaixo:
//programa na forma de AST
Program prog; //obter objeto usando parser ANTLR definido
//chama o visitor de pretty print
prog.accept(new PrettyPrintVisitor());