Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Análise Léxica Prof. Alexandre Monteiro
Baseado em material cedido pelo Prof. Euclides Arcoverde Recife
2
Contatos Prof. Guilherme Alexandre Monteiro Reinaldo
Apelido: Alexandre Cordel /gtalk: Site: Celular: (81)
3
JFlex É um gerador de analisadores léxicos escrito em Java, baseado no flex para C Também é uma melhoria do Jlex Pode ser encontrado em Constrói o analisador léxico a partir de um arquivo de especificação dado como entrada Processo visto nos slides da aula anterior Recebe arquivo de entrada normalmente com extensão .lex ou .flex A partir desse arquivo vai ser gerado um analisador léxico capaz de reconhecer os caracteres de determinada linguagem Gera uma classe que faz a análise léxica
4
JFlex Gerador automático de analisadores léxicos na linguagem Java JFlex Especificação Classe do Lexer
5
Especificando um Lexer
6
Especificando um Lexer
A especificação é dividida em 3 partes que são separadas por “%%” Código do usuário %% Opções do JFlex + Declarações de Macros Regras léxicas
7
Parte 1 – Código do Usuário
É inserido diretamente no topo do arquivo gerado (não é inserido dentro da classe) package br.fbv.examples.jflex; import java.util.Hashtable; %% ...
8
Parte 1 – Código do Usuário
Por exemplo, pode ser usado para: Definir o pacote ao qual o lexer vai pertencer Definir imports Definir a classe Token ou qualquer outra classe, desde que não seja pública Não recomendo Comentários de documentação
9
Parte 2 – Diretivas e Macros
Situada entre o primeiro sinal “%%” e o segundo sinal “%%” Pode conter opções do JFlex ou macros de expressões regulares Podem vir alternadas e em qualquer ordem Veremos separadamente...
10
Parte 2.1 – Opções Nome da classe, atributos adicionais, etc.
Geralmente definem detalhes de como será a classe gerada (para funcionar como lexer) Nome da classe, atributos adicionais, etc. ... %% %class Lexer
11
Parte 2.1 – Algumas Opções %class <name> – define o nome da classe que vai ser gerada Se não definir a classe se chamará Yylex %{ e }% – delimitam código Java a ser inserido dentro da classe do lexer Ex: Atributos e métodos adicionais (ex.: main) %cup – torna o arquivo gerado compatível com o gerador de parsers CUP
12
Parte 2.1 – Algumas Opções %function <name> – define o nome da função que retorna o próximo token Se não for definida, será yylex() %type <class-name> – define qual classe (já existente) irá representar os tokens Ou seja, qual será o tipo de retorno da função acima %line– ativa o contador de linhas (no atributo yyline) %column – ativa o contador de colunas (yychar)
13
Parte 2.1 – Outras Opções Tratamento de exceção
Existem também opções para: Tratamento de exceção Criação de estados léxicos Tornar a classe pública etc.
14
Parte 2.2 – Macros Definem nomes para expressões regulares particulares ... %% %class Lexer ALPHA=[A-Za-z_] DIGIT=[0-9]
15
Parte 2.2 – Macros As macros são definições auxiliares, mas não representam tokens Podem ser usadas na definição deles, na parte 3 Para usar a definição de uma macro, deve-se delimitar seu nome por chaves Exemplo de uma macro definida a partir de outra ALPHA_NUMERIC={ALPHA}|{DIGIT}
16
Parte 3 – Regras <expressão regular> { <código Java> }
Seção após o segundo “%%” que especifica regras léxicas no formato <expressão regular> { <código Java> } ... %% [0-9] {System.out.println(“Digito encontrado”);}
17
Parte 3 – Regras As regras podem ser criadas com uma expressão regular pura ou usar macros A ação associada à expressão regular pode ser qualquer código Java Atenção: Esse código (assim como o da opção “%{“ na segunda parte) não é verificado pelo JFlex – ele é apenas copiado fielmente para a classe!
18
Parte 3 – Regras Para expressões que representam tokens, a regra deve ter um “return” passando o token Se for uma expressão que representa comentários ou espaço em branco, a ação não deve retornar valor Se for preciso recuperar o lexema (como um objeto String), basta chamar a função yytext()
19
Parte 3 – Regras Exemplo ... %% "+" { return new Symbol(sym.MAIS); }
[0-9]+ { return new Symbol(sym.NUMERO, yytext()); } "//"[^\n] { /* representa um comentário portanto, não faz nada */ }
20
Gerando o Lexer
21
Gerando o Lexer Primeiramente, deve-se salvar a especificação para um arquivo Não é necessário salvar com uma extensão específica, mas é comum usar “.flex”
22
Gerando o Lexer Baixe o JFlex no site Descompacte o arquivo
Arquivo de nome “jflex-<versão>.zip” Descompacte o arquivo Serão gerados vários subdiretórios, como \doc – tem o manual \examples – tem exemplos de uso do JFlex \lib – tem a versão compilada do JFlex \src – tem o código fonte do JFlex
23
Gerando o Lexer Basta usar a versão compilada do JFlex
Arquivo JFlex.jar na pasta \lib Para gerar o lexer a partir de um arquivo de especificação, use o comando Um arquivo “.java” será criado no diretório atual > java -jar JFlex.jar <nome-do-arquivo>
24
Gerando o Lexer Um arquivo “.java” será criado no diretório escolhido
Se usar o mesmo comando sem passar o arquivo, uma janela se abrirá Escolhe o arquivo de especificação (com extensão “.flex”) e o diretório de saída Um arquivo “.java” será criado no diretório escolhido > java –jar JFlex.jar
25
Gerando o Lexer Coloque o arquivo “.java” gerado no seu projeto (do Netbeans/Eclipse, por exemplo) e compile Erros de compilação podem acontecer na classe por conta de trechos de código errados colocados na especificação Ajuste a especificação, gere novamente a classe e compile-a novamente no seu projeto
26
Exemplo Há exemplos de uso no próprio JFlex.
Implementação dos tokens da linguagem XPR-1 Linguagem para expressões inteiras, como no exemplo: def myVar = (10 + 3) - 4; myVar * myVar; //imprime o resultado! * myVar; //imprime o resultado!
27
Referências (Java) Site do JFlex Manual do JFlex http://jflex.de
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.