Baixe o app para aproveitar ainda mais
Prévia do material em texto
ANTLR4 Tree Walking Preparação ● Abram o ANTLRWorks (ferramenta da aula passada) ● Façam download do arquivo "antlr-tree-visit" na página da disciplina. ○ Importem o projeto contido no arquivo para o Eclipse Geração de código ● O ANTLR suporta dois mecanismos de tree- walking: visitors e listeners ● Listeners são mais simples ○ Basta implementar os callbacks que o ANTLR irá chamá-los durante a exploração da árvore ○ No entanto, são menos versáteis do que visitors ● Vamos nos focar no uso de Visitors na aula de hoje Visitors Labels ● O ANTLR gera métodos no visitor de acordo com as regras de produção da gramática. ● Por padrão, não são criados métodos para as alternativas de cada regra. ● Podemos "etiquetar" com uma label as alternativas das regras que desejamos que seja gerado um método no visitor Labels stat : ((attrStmt | expr) ';')+ # Expressions ; attrStmt: ID '=' expr # Assign ; expr : expr op=('*'|'/') expr # MultDiv | expr op=('+'|'-') expr # AddSub | INT # Int | ID # Identifier | '(' expr ')' # Paren ; Labels (resultado) public interface TestVisitor<T> extends ParseTreeVisitor<T>{ T visitAssign(TestParser.AssignContext ctx); T visitExpressions(TestParser.ExpressionsContext ctx); T visitAddSub(TestParser.AddSubContext ctx); T visitIdentifier(TestParser.IdentifierContext ctx); T visitInt(TestParser.IntContext ctx); T visitParen(TestParser.ParenContext ctx); T visitMultDiv(TestParser.MultDivContext ctx); } Outras dicas ● O ANTLR cria campos e métodos auxiliares para os tokens. ○ Deixá-los explícitos pode facilitar bastante expr : expr op=('*'|'/') expr # MultDiv | expr op=('+'|'-') expr # AddSub MUL : '*'; DIV : '/'; ADD : '+'; SUB : '-'; Geração de código ● No menu, selecione Run - Generate Recognizer ● Tela 1: ○ Especifique o diretório de saída ● Tela 2: ○ Selecione a opção "Generate visitor" ○ Desmarque "Generate listener" ○ Especifique o pacote das classes que serão geradas ● Tela 3: ○ Clique em finish Arquivos gerados ● FooLexer: Analisador léxico ● FooParser: Analisador sintático ● FooVisitor: Interface do visitor ● FooBaseVisitor: Implementação padrão do visitor ● Foo.tokens: Tokens usados no parser Demonstração prática Exercícios ● Crie um visitor que imprima a expressão visitada em notação polonesa reversa (link). Ex: ○ x = (3 - 4) * 5; ==>> x 3 4 - 5 * =; Exercícios ● Crie um visitor que computa o resultado das expressões definidas na gramática do exercício da aula passada ○ x = (3 - 4) * 5; //entrada > x = -5 //saída ○ x = (3 - 4) * 5; //entrada (linha 1) y = x + 10; //entrada (linha 2) > x = -5, y = 5 //saída Exercícios ● Crie um novo visitor para detectar variáveis não definidas nas expressões. ○ x = (3 - 4) * 5; //entrada (linha 1) y = z + 10; //entrada (linha 2) > error: undefined variable 'z' at line 2, col 4 //saída Exercícios ● Crie um interpretador de expressões aritiméticas. ○ O programa deverá ler as expressões da entrada padrão e imprimir o resultado na tela. ○ O estado deve ser mantido após cada expressão. ○ Em caso de erro, o programa deve imprimir a causa do erro e aguardar pela entrada do usuário. O estado das variáveis não deve ser modificado nesse caso. Exercícios (entrega) ● Enviem um email para mab@cin ○ assunto = "[if688] atividade da aula prática 2" ○ até a próxima terça (04/07) ● O anexo deve conter o projeto do eclipse com: ○ gramática utilizada na geração do visitor/parser/lexer ○ um arquivo README na raiz contendo uma breve explicação do que foi feito e como rodar o projeto ● Grupos de até 3 pessoas Dicas ● Prestem atenção no código de exemplo ● Adicionem o código do ANTLR na build path do projeto ○ Facilita bastante na hora de depurar algo ● A documentação da wiki é bastante escassa - leiam o livro escrito pelo autor do projeto: http://pragprog.com/book/tpantlr2/the- definitive-antlr-4-reference
Compartilhar