Buscar

079_jflex

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

*
*
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
JFLEX
Especificação
Léxica
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.
*
*
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)
*
*
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);}
 ...
}
*
*
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
*
*
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).
Tarefa
*
*
*
*
*
*
*
*
*
*
*
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 [^/]
*
Ineficientes na geração do AFD. (exponencial).
*
Veja que não há problema com a regra do token mais longo.
*
*
*
*

Outros materiais