Você está na página 1de 27

INF25 Compiladores

JFlex Um Gerador de Lexers em Java

JFlex

um gerador de analisadores lxicos escrito em Java, baseado no flex para C

Tambm uma melhoria do JLex

Constri o analisador lxico a partir de um arquivo de especificao dado como entrada

Processo visto nos slides da aula anterior

Gera uma classe que faz a anlise lxica


2

JFlex

Gerador automtico de analisadores lxicos na linguagem Java

Especificao

JFlex

Classe do Lexer

Especificando um Lexer

Especificando um Lexer

A especificao dividida em 3 partes que so separadas por %%


Cdigo do usurio %% Opes do JFlex + Declaraes de Macros %% Regras lxicas
5

Parte 1 Cdigo

inserido diretamente no topo do arquivo gerado (no inserido dentro da classe)

package br.fbv.examples.jflex; import java.util.Hashtable; %% ...

Parte 1 Cdigo

Por exemplo, pode ser usado para:

Definir o pacote ao qual o lexer vai pertencer Definir imports Definir a classe Token ou qualquer outra classe, desde que no seja pblica

No recomendo

Comentrios de documentao
7

Parte 2 Diretivas e Macros

Situada entre o primeiro sinal %% e o segundo sinal %%


Pode conter opes do JFlex ou macros de expresses regulares

Podem vir alternadas e em qualquer ordem

Veremos separadamente...
8

Parte 2.1 Opes

Geralmente definem detalhes de como ser a classe gerada (para funcionar como lexer)

Nome da classe, atributos adicionais, etc.

... %% %class Lexer %% ...


9

Parte 2.1 Algumas Opes

%class <name> define o nome da classe que vai ser gerada

Se no definir a classe se chamar Yylex

%{ e }% delimitam cdigo Java a ser inserido dentro da classe do lexer

Ex: Atributos e mtodos adicionais (ex.: main)

%cup torna o arquivo gerado compatvel com o gerador de parsers CUP


10

Parte 2.1 Algumas Opes

%function <name> define o nome da funo que retorna o prximo token

Se no for definida, ser yylex()

%type <class-name> define qual classe (j existente) ir representar os tokens

Ou seja, qual ser o tipo de retorno da funo acima

%line ativa o contador de linhas (no atributo yyline) %column ativa o contador de colunas (yychar)
11

Parte 2.1 Outras Opes

Existem tambm opes para:

Tratamento de exceo Criao de estados lxicos

Tornar a classe pblica


etc.
12

Parte 2.2 Macros

Definem nomes para expresses regulares particulares

... %% %class Lexer ALPHA=[A-Za-z_] DIGIT=[0-9] %% ...


13

Parte 2.2 Macros

As macros so definies auxiliares, mas no representam tokens

Podem ser usadas na definio deles, na parte 3

Para usar a definio de uma macro, deve-se delimitar seu nome por chaves

Exemplo de uma macro definida a partir de outra

ALPHA_NUMERIC={ALPHA}|{DIGIT}

14

Parte 3 Regras

Seo aps o segundo %% que especifica regras lxicas no formato

<expresso regular> { <cdigo Java> }

... %% ... %% [0-9] {System.out.println(Digito encontrado);}

15

Parte 3 Regras

As regras podem ser criadas com uma expresso regular pura ou usar macros A ao associada expresso regular pode ser qualquer cdigo Java

Ateno: Esse cdigo (assim como o da opo %{ na segunda parte) no verificado pelo JFlex ele apenas copiado fielmente para a classe!
16

Parte 3 Regras

Para expresses que representam tokens, a regra deve ter um return passando o token Se for uma expresso que representa comentrios ou espao em branco, a ao no deve retornar valor
Se for preciso recuperar o lexema (como um objeto String), basta chamar a funo yytext()
17

Parte 3 Regras

Exemplo

... %% "+" { return new Symbol(sym.MAIS); }

[0-9]+ { return new Symbol(sym.NUMERO, yytext()); } "//"[^\n] { /* representa um comentrio portanto, no faz nada */ }
18

Gerando o Lexer

Gerando o Lexer

Primeiramente, deve-se salvar a especificao para um arquivo No necessrio salvar com uma extenso especfica, mas comum usar .flex

20

Gerando o Lexer

Baixe o JFlex no site


http://jflex.de/ Arquivo de nome jflex-<verso>.zip

Descompacte o arquivo Sero gerados vrios subdiretrios, como


\doc tem o manual \examples tem exemplos de uso do JFlex \lib tem a verso compilada do JFlex \src tem o cdigo fonte do JFlex

21

Gerando o Lexer

Basta usar a verso compilada do JFlex

Arquivo JFlex.jar na pasta \lib

Para gerar o lexer a partir de um arquivo de especificao, use o comando


> java -jar JFlex.jar <nome-do-arquivo>

Um arquivo .java ser criado no diretrio atual


22

Gerando o Lexer

Se usar o mesmo comando sem passar o arquivo, uma janela se abrir


> java jar JFlex.jar

Escolhe o arquivo de especificao (com extenso .flex) e o diretrio de sada

Um arquivo .java ser criado no diretrio escolhido


23

Gerando o Lexer

Coloque o arquivo .java gerado no seu projeto (do Eclipse, por exemplo) e compile Erros de compilao podem acontecer na classe por conta de trechos de cdigo errados colocados na especificao

Ajuste a especificao, gere novamente a classe e compile-a novamente no seu projeto

24

Exemplo

Adicionarei no site um exemplo de uso do JFlex Implementao dos tokens da linguagem XPR-1

Linguagem para expresses inteiras, como no exemplo:

def myVar = (10 + 3) - 4; myVar * myVar; //imprime o resultado! 19 + 10 * myVar; //imprime o resultado!
25

Referncias (Java)

Site do JFlex

http://jflex.de

Manual do JFlex

http://jflex.de/manual.html

26

Referncias (C)

Site com o flex para Windows

http://sourceforge.net/projects/gnuwin32/

Manual do flex

http://flex.sourceforge.net/manual/

27

Você também pode gostar