Upload
internet
View
105
Download
1
Embed Size (px)
Citation preview
1
Gerador de Analisadores Léxicos
Prof. André Luis Meneses Silva
www.dsi.ufs.br
2
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
3
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
JFLEXEspecificação
LéxicaAnalisador Léxico
(Yylex.java)
CompiladorJava
(javac)Analisador Léxico
(Yylex.class)
4
Especificações JFlex1. 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
5
Exemplo// Código do usuáriopackage exemplo.lex;import exemplo.token.*;
%%
//Diretivas do Jflex%function proximoToken%type Token
6
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%}
7
Exemplo
//definições regulares auxiliaresdelim=[\ \t\n\r]ws={delim}+letra=[a-zA-Z]digito=[0-9]id={letra}({letra}|{digito})*numero={digito}+ (\.{digito}+)? (E[+\-]? {digito}+)?
8
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");}
9
Como é feito o casamento
1. É 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}
2. É executada a ação associada.
10
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
11
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.
12
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
~eCasa 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)
13
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);} ...}
14
Exercício Atividade 2 Valendo ponto para o projeto. Como poderia especificar comentários
aninhados usando estados?
15
O operador de lookaheade / 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)
16
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
17
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