Baixe o app para aproveitar ainda mais
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. * * * *
Compartilhar