Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Gerador de Analisadores Léxicos
Prof. André Luis Meneses Silva
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
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 Especificação Léxica JFLEX Analisador Léxico (Yylex.java) Compilador Java (javac) Analisador Léxico (Yylex.class)
4
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
5
Exemplo // Código do usuário package 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 auxiliares delim=[\ \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
É 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.
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. 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 [^/]
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 ~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).
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> { {.... } ... <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.
14
Exercício Atividade 2 Valendo ponto para o projeto.
Como poderia especificar comentários aninhados usando estados?
15
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)
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
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).
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.