43
Analisador Léxico

Analisador Léxico

  • Upload
    dusan

  • View
    42

  • Download
    1

Embed Size (px)

DESCRIPTION

Analisador Léxico. Analisador Léxico. Fabiano Rodrigues Farley J. R. Oliveira 051.649-1 Michel Sato Vitor Lins Vieira 052.696-7. Analisador Léxico. - PowerPoint PPT Presentation

Citation preview

Page 1: Analisador Léxico

Analisador Léxico

Page 2: Analisador Léxico

Analisador Léxico

Fabiano Rodrigues Farley J. R. Oliveira 051.649-1 Michel Sato Vitor Lins Vieira 052.696-7

Page 3: Analisador Léxico

Analisador Léxico

• A análise léxica é a primeira fase do compilador. A função do analisador léxico, também denominado scanner, é ler o código fonte, caracter a caracter, buscando a separação e identificação dos elementos componentes do programa fonte, denominados símbolos léxicos ou tokens.

Page 4: Analisador Léxico

Analisador Léxico

• É também de responsabilidade desta fase a eliminação de elementos "decorativos" do programa, tais como espaços em branco, marcas de formatação de texto e comentários.

Page 5: Analisador Léxico

Tokens

• A criação dos símbolos (tokens) é importante, pois torna a próxima etapa de um compilador (análise sintática, ou parsing) mais simples.

Page 6: Analisador Léxico

Etapas

• Na análise léxica podemos destacar três etapas:– Extração e classificação dos tokens– Eliminação de delimitadores e comentários– Recuperação de erros

Page 7: Analisador Léxico

Tokens

• O objetivo principal da análise léxica é identificar sequências de caracteres que constituem unidades léxicas ("tokens"). O analisador léxico lê, caractere a caractere, o texto fonte, verificando se os caracteres lidos pertencem ao alfabeto da linguagem, identificando tokens, e desprezando comentários e brancos desnecessários.

Page 8: Analisador Léxico

Tokens

• Tokens são símbolos tais como palavras reservadas, delimitadores, identificadores, etc.

• Os tokens (símbolos léxicos) são unidades básicas de texto do programa. Eles são representados internamente por três informações: classe do token, valor do token e posição do token.

Page 9: Analisador Léxico

Recuperação de Erros

• Ações possíveis:• Remoção de sucessivos caracteres até o

reconhecimento de um token válido (modalidade Pânico).

• Inserção de um caractere ausente.• Substituição de um caractere incorreto por

outro correto.• Transposição de caracteres adjacentes.

Page 10: Analisador Léxico

Exemplo

Exemplo: sum=3+2; token type

sum IDENT= ASSIGN_OP3 NUMBER+ ADD_OP2 NUMBER; SEMICOLON

Page 11: Analisador Léxico

Exemplo de comando

•Comando em Java:

if (i== j)

z = 0; /* No work needed */

else

z= 1;

•Como o analisador léxico vê os comandos:

\tif(i== j)\n\t\tz = 0; /* No work needed */\n\telse\n\t\tz= 1;

Page 12: Analisador Léxico

Formação de Tokens & Expressões Regulares

• Analisador efetua sucessivas verificações de caracteres até

encontrar um caracter de “estado morto”, como espaço,

parênteses, ponto-e-vírgula

• Retorna à ultima análise válida para extrair um lexeme

• Um lexeme classificado se torna um token

• O reconhecimento de um token é feito através de expressões

regulares

Page 13: Analisador Léxico

Scanner

• Após a definição dos tokens, o scanner, uma função do analisador léxico, converte isto:

\tif(i== j)\n\t\tz = 0; /* No work needed */\n\telse\n\t\tz= 1;

• Nisto:IF, LPAR, ID("i"), EQUALS, ID("j"), RPAR, ID("z"), ASSIGN,INTLIT(""), SEMI, ELSE, ID("z"), ASSIGN, INTLIT(""), SEMI

que é a “expressão” a ser enviada ao analisador sintático

Page 14: Analisador Léxico

Classe de Scanner

• Exemplo de classe para um scanner em Java

class Token {enum SyntacticCategory {

IF, LPAR, ID, EQUALS, RPAR, ASSIGN, ... };

SyntacticCategory syntax;Object value;Location sourcePosition;...

}

Page 15: Analisador Léxico

Classe de Scanner

• Exemplo de classe para um scanner em Java

class Token {enum SyntacticCategory {

IF, LPAR, ID, EQUALS, RPAR, ASSIGN, ... };

SyntacticCategory syntax;Object value;Location sourcePosition;...

}

Page 16: Analisador Léxico

Geradores de Analisadores Lèxicos

• FLEX• OOLEX

Page 17: Analisador Léxico

LEX / FLEX

• LEX é uma ferramenta para a geração automática de analisadores léxicos

• Versão Free: FLEX (Fast LEX)• Desenvolvido em 1975 em conjunto com o

YACC (Yet another compiler-compiler), por Mike Lesk & Eric Schmidt. No Bell Laboratories

Page 18: Analisador Léxico

LEX / FLEX

• Free Software Foundation – GNU – FLEX: Implementação mais rápida do FLEX (e gratuita!!)

• O gcc (GNU C Compiler) foi desenvolvido com LEX & YACC.

• LEX: dividir as entradas em unidades coerentes (tokens)

• YACC: descobrir o relacionamento entre os tokens. (análise sintática)

Page 19: Analisador Léxico

LEX / FLEX

• Objetivos: desenvolvida para programadores de compiladores e interpretadores; porém podem ser usadas também em detecção de padrões em arquivos de dados, linguagem de comandos, etc..

• Vantagem: Rápido desenvolvimento de protótipos e manutenção simples do software.

Page 20: Analisador Léxico

LEX / FLEX

• Papel do LEX: toma um conjunto de descrições de possíveis tokens e produz uma rotina em C que irá identificar estes tokens

• Papel do Yacc: toma uma descrição concisa de uma gramática e produz uma rotina em C que irá executar a análise sintática ou parsing.

• NOTA: um analisador léxico desenvolvido usando Lex é quase sempre mais rápido do que um analisador léxico escrito diretamente em C.

Page 21: Analisador Léxico

LEX / FLEX

Page 22: Analisador Léxico

LEX / FLEX

• Encontra-se em qualquer sistema Unix e pode ser chamada usando os comandos lex ou flex;

• Transforma um arquivo contendo expressões regulares em um programa C que reconhece os padrões descritos no arquivo

• O Flex lê os arquivos de entrada (arquivo de definição), obtendo assim a descrição do scanner a ser gerado. Esse arquivo é definido usando a linguagem lex

Page 23: Analisador Léxico

LEX / FLEX

Page 24: Analisador Léxico

LEX / FLEX

• Um arquivo de descrição Flex é dividido em três seções separadas por %% :

• DEFINICOES%%: Contém declarações de variáveis, constantes e definições regulares;

• REGRAS%%: Contém definições de rotinas em C que são chamadas quando uma expressão é reconhecida

• CODIGOContém o main (início de procedure em C) e descreve como o analisador léxico deve ser utilizado

Page 25: Analisador Léxico

LEX / FLEX

• SEÇÃO DE DEFINIÇÕES:

• É opcional (pode ser vazia)

• Contém definições léxicas, e a declaração e inicialização de variáveis globais

• Uma definição léxica possui a forma NOME DEFINIÇÃO

• As definições são expressões regulares que reconhecem tokens do texto fonte.

• Seu conteúdo será copiado no início do arquivo C gerado na saída.

Page 26: Analisador Léxico

LEX / FLEX

• SEÇÃO DE DEFINIÇÕES:• LEX define por padrão as variaveis globais: yytext (lexema corrente) e yyleng (tamanho do lexema)• Definições de macros:digito [01]+ /* substituir {digito} por [01]+ ao processar as regras */

frac .[0-9]+ /* substituir {frac} por .[0-9]+ ao processar as reg

nl \n /* substituir {nl} por \n ao processar as regras */ras */

• A inclusão das linhas de comando em C devem ser delimitadas por <%{> e <%}>, como:

%{#include <y.tab.h>extern int yylval;%}

Page 27: Analisador Léxico

LEX / FLEX

• SEÇÃO DE REGRAS:

• Define a funcionalidade do analisador léxico. Cada regra compreende uma seqüência valida de caracteres (literais/expressões regulares) .

• Definido da seguinte forma: token {AÇÃO}

• A ação pode ser nula ‘{ }’ ou conter um ou mais comandos em linguagem C.

Page 28: Analisador Léxico

LEX / FLEX

• SEÇÃO DE REGRAS:

• Ao chamar a função yylex(), passando o token e seu tamanho, o analisador executará a AÇÃO associada àquela token;

• Retornará o próprio token caso seja reconhecido pelo analisador léxico;• Retornará brancos caso nenhuma ação seja tomada, ou caso seja

encontrados espaços em branco;

• ‘{ printf(“é isso ai\n”);} é a “ação” que consiste em imprimir uma mensagem na tela.

Page 29: Analisador Léxico

LEX / FLEX

• SEÇÃO DE CODIGOS / PROCEDIMENTOS ADICIONAIS:

• Opcional (pode ser vazia)

• Possui o código C definido pelo programador (função main() , que deve chamar a função yylex()

• Qualquer código C nessa seção será copiado diretamente no arquivo produzido pelo Lex.

• Pode definir código para as ações complexas usadas na seção anterior.

Page 30: Analisador Léxico

LEX / FLEX

• UTILIZAÇÃO DO COMPONENTE GERADO

• O LEX é acoplado ao YACC, que efetua a analise sintática. É uma ferramenta similar e complementar ao LEX.

• O LEX gera a função yylex() , que retorna o identificador de um item léxico reconhecido.

• O YACC funciona de forma a chamar o yylex() do LEX;

• O YACC gera a função yyparse() , que analisa os itens léxicos e decide se ele formam ou não uma sentença válida.

Page 31: Analisador Léxico

Analisador Léxico

OOLEX

Page 32: Analisador Léxico

OOLEX

• OOLEX (object-oriented lexer) é estritamente baseada no paradigma de orientação a objetos.

• Tese de doutorado de Bernd Kühl and Axel-Tobias Schreiner em Ciências da Computação na Universidade de Osnabrück, Alemanha

Page 33: Analisador Léxico

OOLEX

• OOLEX pode ser estendido sem acesso para o código fonte: símbolo recognizer pode ser obtido por herança e um scanner de execução pode ser reconfigurado para diferentes contextos.

• OOLEX não precisa ser baseado em um autômato finito e, portanto, ele pode reconhecer símbolos que sistemas como o flex não reconhece diretamente.

Page 34: Analisador Léxico

OOLEX

• OOLEX é usado para prototipagem rápida: a maioria dos identificadores existentes podem ser representados como expressões regulares para o JLex baseados em Java.

• OOLEX oferece muitas vantagens sobre Scanners de Expressões Regulares scanners

• OOLEX tem um desempenho pior justificado pela flexibilidade, um ciclo de desenvolvimento mais curtos e mais funcionalidades.

Page 35: Analisador Léxico

OOLEX

• OOLEX pode compilar uma expressão regular em uma árvore de objetos recognizers

• OOLEX é muito mais fácil de usar, porque já existe uma biblioteca de recognizers para os símbolos mais comuns

• OOLEX em sua própria classe quando se trata de análise léxica

Page 36: Analisador Léxico

LOLO

Analisador Léxico

Page 37: Analisador Léxico

LOLO

• LOLO (language-oriented lexer objects) é estritamente baseada no paradigma de orientação a objetos.

• Continuação da tese de doutorado de Bernd Kühl and Axel-Tobias Schreiner em Ciências da Computação na Universidade de Osnabrück, Alemanha

Page 38: Analisador Léxico

LOLO

• Não necessita de autômato finito– Modelagem de estados, transições e ações

• Reconhece diretamente símbolos que sistemas como FLEX não

Page 39: Analisador Léxico

LOLO

• Não necessita de autômato finito–Modelagem de estados, transições e ações

• Reconhece símbolos que sistemas como flex não conseguiriam diretamente

Page 40: Analisador Léxico

LOLO

• Baseia-se na competição de objetos

• Que buscam reconhecer um único símbolo

Page 41: Analisador Léxico

LOLO

• Um input entra numa "sala" repleta de objetos

• Caractere a caractere é verificado por cada objeto, que caso não reconheça é retirado da sala

• O último objeto a sair é o ganhador– Reconheceu a maior sequência de caracteres

Page 42: Analisador Léxico

LOLO

• Principal desvantagem é a performance

• Cerca de 3 vezes mais lento em comparação ao Flex

Page 43: Analisador Léxico

Analisador Léxico

FIM