Análise Léxica Prof. Alexandre Monteiro

Slides:



Advertisements
Apresentações semelhantes
Laboratório de Programação
Advertisements

Programação em Java Prof. Maurício Braga
Java Básico Orientação a Objeto Marco Antonio Software Architect Fev/2008.
II – Análise léxica DEI Papel do analisador léxico.
II – Análise léxica DEI lex: linguagem de especificação para analisadores léxicos Implementação de simuladores de autómatos finitos Bibliografia aconselhada:
III – Análise sintáctica Geradores de parsers Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.9 LFA 1999/ Jorge Morais.
Encontro Linguagem HTML; 13. Hospedagem na WWW.
YACC.
Lex e Yacc.
Construção de Compiladores
Documentando con Javadoc
Introdução a Programação JAVA
Estrutura de Dados em Java
EL e JSTL Prof. Danton Cavalcanti Franco Junior
C# Documentando código em XML Sharp Shooters.NET Universidade Federal de Pernambuco Centro de Informática Recife, 10/10/2002 Autor: Marden Menezes Costa.
Hibernate com JPA Prática
JAVA: Conceitos Iniciais
Unidade I: “Dê um mergulho rápido”
Lex Linguagem (e compilador) para especificar analisadores léxicos.
Aula PHPdoc Prof. Naércio Filho Técnico em Informática
JAVA Linguagem Ambiente de Desenvolvimento
Ferramentas para a Construção de Compiladores: Lex & Yacc
Programação I Aula 2 (Métodos)
Linguagem de Programação JAVA
Introdução a aplicativos Java
Prof. Daniel Aula 03.  Criar Projeto  Criar Pacote  Criando classes  Meu primeiro programa  Compilar  Comentários  Variáveis.
Flora-2 Aula de Laboratório Arquivo do Exemplo  Baixar os arquivos “safari.flr” de ~apln/aulamci em um diretório acessível pelo unix (subpasta no diretório.
Análise Léxica Primeira fase de um compilador
Mayerber Carvalho Neto
Prof. Alexandre Monteiro Recife
1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.
Geração de Código Intermediário
Esquemas de Tradução Prof. Alexandre Monteiro
Análise Léxica.
Analise sintática aula-07-analise-sintática.pdf.
LPII Professora Lucélia. Pacotes Um pacote em Java é um diretório onde ficam armazenadas uma ou mais classes. Geralmente as classes com a mesma afinidade.
Programação I Laboratório I
Prof. Guilherme Alexandre Monteiro Reinaldo Recife
Análise Sintática LR Prof. Alexandre Monteiro
Paradigmas da Programação – Semestre 1 – Aula 9 Professor: Eduardo Mantovani )
Arquitetura de Desenvolvimento Web MVC vs. Three Tiers
Análise Léxica Prof. Alexandre Monteiro
1 JAVA I/O (Entrada e Saída em JAVA) Prof. Alexandre Monteiro Recife.
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Analisador Léxico Prof. Alexandre Monteiro
Implementação Orientada a Objetos – Aula 03
Laboratório I Mateus Raeder Material baseado nos originais da Profa. Denise Bandeira.
Compiladores Análise Léxica
Programação I Aula 3 (Entrada de Dados) Prof. Gilberto Irajá Müller Última atualização 11/3/2009.
Análise Sintática Prof. Alexandre Monteiro
+ Java Básico Aula 1 por Flávio Juvenal. + Histórico Green Project (1991) Desenvolver plataforma para eletrodomésticos inteligentes Tentaram usar C++
Monitoria IP ~if669 Garbage Collection e pacotes.
1 Características do Projeto Web Prof. Alexandre Monteiro Recife.
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
Hibernate Mapeamento Objeto-Relacional Aula Prática I
7 - Criação de Páginas Web
Analisador Léxico.
Capítulo 9 Arquivos JAR.
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Revisão Compiladores – AP2
CES-41 COMPILADORES Aulas Práticas
Análise Sintática de Descida Recursiva
1 Trabalho Extra SIG Prof. Guilherme Alexandre Monteiro Reinaldo Recife.
COMPILADORES 04 Prof. Marcos.
Geradores de analisadores léxicos
Programação Distribuída em Java Aula 09 - JSP. Na aula passada vimos: Aspectos gerais de segurança em Java policytool Instalação de políticas de segurança.
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
PLP – JavaCC Java Compiler Compiler
Array e ArrayList LPOO – 01/09/14.
PROGRAMAÇÃO ORIENTADA A OBJETOS Carlos Marques
Transcrição da apresentação:

Análise Léxica Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Contatos Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/gtalk: alexandrecordel@gmail.com greinaldo@fbv.edu.br Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878

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 http://jflex.de/ 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

JFlex Gerador automático de analisadores léxicos na linguagem Java JFlex Especificação Classe do Lexer

Especificando um Lexer

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

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; %% ...

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

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...

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

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

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)

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.

Parte 2.2 – Macros Definem nomes para expressões regulares particulares ... %% %class Lexer ALPHA=[A-Za-z_] DIGIT=[0-9]

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}

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”);}

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!

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()

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 */ }

Gerando o Lexer

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”

Gerando o Lexer Baixe o JFlex no site Descompacte o arquivo http://jflex.de/ 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

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>

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

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

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! 19 + 10 * myVar; //imprime o resultado!

Referências (Java) Site do JFlex Manual do JFlex http://jflex.de http://jflex.de/manual.html