Gerador de Analisadores Léxicos

Slides:



Advertisements
Apresentações semelhantes
Classes e Funções.
Advertisements

TADs Vector, Lista e Sequência
Recursividade Inhaúma Neves Ferraz
Tópicos em Compiladores
Compiladores Claudio Benossi
Compiladores I Cristiano Damiani Vasconcellos
Orientação a Objetos: Modificador Final para Métodos e Classes
Herança, sobrecarga e ligação dinâmica zHerança zReferência super zSobrecarga de métodos zSobreposição zLigação dinâmica de métodos zfinal.
2003 Prentice Hall, Inc. All rights reserved. 1 Ambientes de Programação C++ Tópicos 1.1 Introdução 1.2 Compiladores C++ 1.3IDEs C++ 1.4Editores de código.
Ronaldo Celso Messias Correia
Wagner Santos C. de Jesus
Capítulo 13 Pacotes. 2 Capítulo 13 – Pacotes Pacotes Pacote Cláusula package Cláusula import Executando uma classe de pacote Modificadores de acesso.
Orientação a Objetos Classes
Implementando um Montador com LEX e YACC
Construção de Compiladores
Grupo Paralelismo – Unesp RC
Utilização do montador Daedalus
Teste Estrutural de Software
1 Tradução Dirigida à Sintaxe Prof. Ricardo Santos.
CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica.
5.6 – Complementos de Yacc – Usando Yacc com gramáticas ambíguas
CES-41 COMPILADORES Aulas Práticas
CES-41 COMPILADORES Aulas Práticas Capítulo III Análise Semântica no Yacc.
CES-41 COMPILADORES Aulas Práticas Capítulo III Análise Semântica no Yacc.
Business Process Management e Workflow - jBPM Aluno: Filipe Ferraz Salgado Orientador: Francisco Reverbel Novembro 2006.
Prof. Giovanny Lucero Introdução Prof. Giovanny Lucero
Linguagens Formais e Tradutores Análise Sintática - 1
Prof. André Luis Meneses Silva
Linguagens Formais e Tradutores Linguagens Regulares (Revisão)
André Luis Meneses Silva
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Métodos Programação II 1 Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre Elementos de Classe, class wrappers.
Lex Linguagem (e compilador) para especificar analisadores léxicos.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
Ferramentas para a Construção de Compiladores: Lex & Yacc
Interfaces.
Ferramenta para Linhas de Produtos - FLiP Vilmar Nepomuceno – Andréa Menezes –
Análise Sintática – Parte 1
Scala Bruno Barros e Rebeka Gomes
Mayerber Carvalho Neto
Cursor Professor Esp. Diego André Sant’Ana
Orientação a Objetos e Java Graduação em Ciência da Computação
Java Generics Adeline de Sousa Silva.
ArrayList e Genéricos Profs. PROG2 - UNISINOS.
Vladimir Oliveira Di Iorio
POO - I Prof.: Jean Carlo Mendes
Wagner Santos C. de Jesus
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Analisador Léxico Prof. Alexandre Monteiro
Compiladores Análise Léxica
Prof.: Bruno Rafael de Oliveira Rodrigues. Construtor é bloco declarado que é chamado no momento em que o Objeto é criado (instanciado). Todas as classes.
Implementação Orientada a Objetos – Aula 05 Construtores e sobrecarga de métodos Prof. Danielle Martin Universidade de Mogi das Cruzes
Análise Léxica Prof. Alexandre Monteiro
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota (com material da Qualiti Software Process)
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
Vendo o código como um bolo... com várias camadas! Interface com o usuário (GUI) Comunicação Negócio Dados.
Herança e Arquitetura em camadas
Aula Prática 5 05/05/2010. //Estrutura do método public int subtrair (int a, int b){ //Calcule a operação desejada. int resultado = a – b; //Retorne o.
CES-41 COMPILADORES Aulas Práticas
Geradores de analisadores léxicos
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Associação. 2 Desafio – Aula class Aluno { 2. private String nome; 3. private float nota; 4. public Aluno(String nome, float nota){ 5. this.nome.
Implementação Orientada a Objetos – Aula 04 Métodos, parâmetros e retorno Prof. Danielle Martin/Marcia Bissaco Universidade de Mogi das Cruzes
IDENTIFICAÇÃO DOS RELACIONAMENTOS Nesta atividade devem ser definidos os relacionamentos entre as classes Podem ser representados pela: – associação, –
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
CUP – Um Gerador de Parsers em Java
SableCC José Francisco Pereira Equipe de Monitores
Compiladores – AnáLise léxica
Transcrição da apresentação:

Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br www.dsi.ufs.br

Antes de Começar Instalar a JDK Instalar o Eclipse IDE (JDT) Instalar o JFLEX e o CUP Instalar o JFLEX e CUP Plugin http://cup-lex-eclipse.sourceforge.net/update

JFlex: Um gerador de Analisadores Léxicos Permite especificar analisadores léxicos Gera um analisador léxico, escrito em Java Versão moderna do Lex e versão eficiente de JLex Especificação Léxica JFLEX Analisador Léxico (Yylex.java) Compilador Java (javac) Analisador Léxico (Yylex.class)

Especificações JFlex 1. código do usuário %% 2. diretivas do JFlex e definições regulares 3. regras Código do Usuário package e imports Definição de classes utilitárias Diretivas Customização da classe parser gerada. Definições regulares auxiliares Regra: expressão regular com um código java associado

Exemplo // Código do usuário package exemplo.lex; import exemplo.token.*; %% //Diretivas do Jflex %function proximoToken %type Token

Exemplo //Código incluído a classe do parser. %{private TabelaSimbolos tabela; public Yylex(tabelaSimbolos tabela) { this.tabela = tabela; private int instalarId(String id) {...} //inst na tabela %}

Exemplo //definições regulares auxiliares delim=[\ \t\n\r] ws={delim}+ letra=[a-zA-Z] digito=[0-9] id={letra}({letra}|{digito})* numero={digito}+ (\.{digito}+)? (E[+\-]? {digito}+)?

Exemplo //Regras %% {ws} {} if {return new Token(sym.IF);} {id} {int i = instalarId(yytext()); return new Token(sym.ID,new Integer(i));} {numero} {return new Token(sym.NUM, new Double(yytext()));} "<" {return new Token(sym.LT);} "<=" {return new Token(sym.LE);} ... ... . {system.out.println("caract. desconhecido");}

Como é feito o casamento É escolhido o token de maior tamanho possível. Se há mais de dois, o primeiro na listagem é escolhido Ex.: palavras reservadas deverão ser listadas primeiro para não serem “ocultas” por {id} É executada a ação associada.

Expressões Regulares no JFlex Metacaracteres ? * + | ( ) ^ $ / ; . = < > [ ] { } " \ ! ~ precisam ser escapados com aspas ou \ Expresões regulares e f, e | f, e*, e+, e? e (e) significado normal \b, \n, \t, \f, \r, \udddd, \., \\, \$, .... $ fim de linha . tudo menos \n "...." string sem escape, exceto para " e \ {nome} macro [bde\n], [a-zA-Z], [a-z0-9] [^a-z] // Tudo com exceção de a-z classes de caracteres

Exemplo: Comentários "/*" [^]* "*/" { /*não faça nada */} Funciona? Outro tentativa: "/*" [^*]* "*" ([^/] [^*]* "*")* "/“ Atividade 1 valendo ponto para projeto: Resolver esse problema para a próxima aula. Exp. Regulares são declarativas. Autômatos, operacionais. 1ra tentativa não funciona: Pela regra de casar o token mais longo, qualquer “/*” será casado com o último “*/” que aparecer no programa (e não necessariamente com o respectivo). 2da tentativa, também não. Ex /*jaja**/ não casa. O terceiro * se corresponde com o padrão [^/]

Outros operadores do JFlex A negação de uma exp. reg. !e Casa com todas as cadeias que não casam e O operador upto ~e Casa tudo até a primeira ocorrência de e (incluindo) ~e equivale com !([^]* e [^]* | "") e Exemplo dos comentários "/*" ~"*/" Cuidado: negação e upto são muito ineficientes (na geração) Ineficientes na geração do AFD. (exponencial).

Estados Mistura de Exp. Reg. com estados (autômatos) Especificações mais operacionais No entanto, as vezes mais adequadas. <COMMENT> { "*/" {yybegin( YYINITIAL) ; } [^] { /*nada*/ } } <DOC-COMMENT> { “@param" {.... } ... <YYINITIAL> { if {return new Token...} {id} {return new Token ... } "/*" {yybegin(COMMENT);} "/**" {yybegin( DOC-COMMENT);} ... } Veja que não há problema com a regra do token mais longo.

Exercício Atividade 2 Valendo ponto para o projeto. Como poderia especificar comentários aninhados usando estados?

O operador de lookahead e / f Casa um e (onde e é uma expressão regular) seguido de um f. O texto relativo ao f não é consumido e $ Casa com e seguido de (operador de fim de linha). Operador ineficiente (na execução)

Outras ferramenta alternativas Lex Primeira ferramenta neste estilo. Gera C e C++ JAVACC Gerador de Analisador Léxico e Sintático (2 em 1). “Oficial” da Sun. Sintaxe das exp. regulares diferente. Poder de expressão equiparável. SableCC 2 em 1

Tarefa Atividade 3 (valendo ponto para o projeto). Definir para a linguagem da última aula o analisador léxico. Tokens: if, identificadores, liteirais numéricos, operadores e delimitadores. Ver slide lexico.ppt Entrega das 3 atividades (08/set).