Você está na página 1de 17

Gerador de Analisadores Léxicos

Prof. André Luis Meneses Silva

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

Especificação

Léxica

JFLEX
JFLEX
  • Analisador Léxico (Yylex.java)

 

Compilador

Java

(javac)

JFlex: Um gerador de Analisadores Léxicos Permite especificar analisadores léxicos Gera um analisador léxico, escrito em
JFlex: Um gerador de Analisadores Léxicos Permite especificar analisadores léxicos Gera um analisador léxico, escrito em

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:

4

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

  • 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}

  • 1. É 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

"/*" [^]* "*/"

Funciona?

{ /*não faça nada */}

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.

<YYINITIAL> { {return new Token

if

...

}

{id}

{return new Token

}

"/*"

{yybegin(COMMENT);}

"/**"

{yybegin(

DOC-COMMENT);}

 

...

}

<COMMENT> { "*/" [^] {yybegin( YYINITIAL) ; } { /*nada*/ } } <DOC-COMMENT> { “@param" {
<COMMENT> {
"*/"
[^]
{yybegin(
YYINITIAL) ; }
{ /*nada*/ }
}
<DOC-COMMENT> {
“@param" { .... }
...
}

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

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