A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Gerador de Analisadores Léxicos

Apresentações semelhantes


Apresentação em tema: "Gerador de Analisadores Léxicos"— Transcrição da apresentação:

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).


Carregar ppt "Gerador de Analisadores Léxicos"

Apresentações semelhantes


Anúncios Google