1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva [email protected] .

17
1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva [email protected] www.dsi.ufs.br

Transcript of 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva [email protected] .

Page 1: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

1

Gerador de Analisadores Léxicos

Prof. André Luis Meneses Silva

[email protected]

www.dsi.ufs.br

Page 2: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

http://cup-lex-eclipse.sourceforge.net/update

Page 3: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

JFLEXEspecificação

LéxicaAnalisador Léxico

(Yylex.java)

CompiladorJava

(javac)Analisador Léxico

(Yylex.class)

Page 4: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

4

Especificações JFlex1. 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

Page 5: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

5

Exemplo// Código do usuáriopackage exemplo.lex;import exemplo.token.*;

%%

//Diretivas do Jflex%function proximoToken%type Token

Page 6: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

Page 7: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

7

Exemplo

//definições regulares auxiliaresdelim=[\ \t\n\r]ws={delim}+letra=[a-zA-Z]digito=[0-9]id={letra}({letra}|{digito})*numero={digito}+ (\.{digito}+)? (E[+\-]? {digito}+)?

Page 8: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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");}

Page 9: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

9

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}

2. É executada a ação associada.

Page 10: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

Page 11: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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.

Page 12: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

~eCasa 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)

Page 13: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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> { “@param" {.... } ...}

<YYINITIAL> { if {return new Token...} {id} {return new Token ... } "/*" {yybegin(COMMENT);} "/**" {yybegin( DOC-COMMENT);} ...}

Page 14: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

14

Exercício Atividade 2 Valendo ponto para o projeto. Como poderia especificar comentários

aninhados usando estados?

Page 15: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

15

O operador de lookaheade / 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)

Page 16: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

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

Page 17: 1 Gerador de Analisadores Léxicos Prof. André Luis Meneses Silva alms@ufs.br .

17

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