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

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

Análise Léxica André Luis Meneses Silva 1 Núcleo de Sistemas de Informação Universidade Federal de Sergipe Linguagens Formais e Tradutores.

Apresentações semelhantes


Apresentação em tema: "Análise Léxica André Luis Meneses Silva 1 Núcleo de Sistemas de Informação Universidade Federal de Sergipe Linguagens Formais e Tradutores."— Transcrição da apresentação:

1 Análise Léxica André Luis Meneses Silva 1 Núcleo de Sistemas de Informação Universidade Federal de Sergipe Linguagens Formais e Tradutores

2 Análise Léxica Objetivos: Produzir tokens a partir de uma seqüência de caracteres Ignorar comentários e espaços em branco Correlacionar mensagens de erro com o programa fonte Sub-rotina ou co-rotina do analisador sintático (parser) 2 analisador lexico analisador lexico parser Tokens Programa fonte

3 Análise Léxica Alguns Conceitos Token: saída do an. léxico. (símbolo terminal do parser) Lexema: seqüência de caracteres Padrão: descrição dos possíveis lexemas de um token 3

4 x, taxa, i_0 235, 0 235E-23 if, := ( >= 4 TokenLexema Alguns Tokens possuem atributos:

5 Análise Léxica Vantagens Projeto de Linguagem mais simples O módulo do parser fica mais simples. (Ex. não lida mais com comentários, Trata palavras reservadas como símbolos terminais, etc.) Eficiência Métodos eficientes para análise léxica. Leitura de arquivo fonte, só aqui. Um caracte é lido só uma vez... Portabilidade Alfabeto de entrada é restrito ao analisador léxico (characters encodings, here) 5

6 Análise Léxica Dificuldades Alinhamento dos lexemas (Fortran antigo) Espaços não são significativos (Fortran - Algol 68) DO 5 I = 1.25 DO 5 I = 1,25 Palavras chaves não são reservadas (PL/I) if then then = else else else = then 6 DO: palavra chave ou parte de ID?

7 Erros Léxicos Poucos erros são detectados nesta etapa Como atuar? Desespero (Panic mode): pular até encontrar Apagar caractere estranho Substituir caractere incorreto Transpor dois caracteres 7

8 Especificação dos tokens Em geral, emprega-se expressões regulares: é uma e.r. que denota {} ε é uma e.r. que denota {ε} Se a Σ, a é uma e.r. Denota {a} Se r e s são e.r. que denotam R e S rs, r*, r|s são e.r. que denotam RS, R*, R S Precedência > concatenação > | Não Permitem Recursão 8

9 Definições regulares Açúcar sintático das e.r. d_1 r_1 d_2 r_2... d_n r_n onde os r_i são e.r. sobre Σ {d_1,..., d_n} e em r_k não aparece nenhum d_j com jk. Obs. Não é possível usar recursão 9

10 Exemplo letra A |... | Z | a |... | z digito 0 | 1 | 2 |... | 9 id letra( letra | digito )* digitos digito digito* fraçao_op. digitos | ε expoente_op E (+|-| ε )digitos | ε num digitos fraçao_op expoente_op Notação: r+ rr* r? r | ε Ex.: digitos digito+ fraçao_op (.digitos)? 10

11 Exemplo 11 letra A |... | Z | a |... | z digito 0 | 1 | 2 |... | 9 if id letra(letra|digito)* relop | >= | <> num digito+(.digito+)?(E(+|-)?digito+)? Lexemas podem estar separados por espaços em branco. delim branco | tab | nl ws delim+ tokens

12 Construindo um analisador léxico Construir um AFD (ou AFND) para cada token (e delimitadores) Combinar num único AFND Transformar para AFD (opcional) Implementar o autômato combinado 12

13 i f 1 2 letra digito < 4 = = 3 > 6 = 7 > d d. d d E E +,-+,- d d d 1 2 delim d=digito

14 i f 15 letra d < 19 = = 18 > 21 = 22 > d d. d d E E +,-+,- d d 0 d ε ε ε ε delim ε Autômato combinado IF ID LE LT EQ NE GTGE NUM

15 i f 3 letra- {i} letra d 4 6 < 7 = = 5 > 8 = 9 > d d. d d E E +,-+,- d d 0 d 29 delim AFD combinado (construído usando o aprendido em LFA) IF ID LE LT EQ NE GTGE NUM letra d ID letra- {f} d

16 Implementação Duas Opções AFD com uma matriz int[][] delta, tal que: delta[q][c] = p sse Diretamente no código switch(estado) case q: if (caracterCorrente==c) estado=p; return RespectivoToken // se q for final Qual mais eficiente? 16 qp c

17 Implementação Critério para escolha do token Reconhecer menor ou maior token? 17

18 Implementação Critério para escolha do token Reconhecer menor ou maior token? Como reconhecer o maior token possível? 18

19 Implementação Critério para escolha do token Reconhecer menor ou maior token? Como reconhecer o maior token possível? Analisar até chegar num estado sem possibilidade de sair Ir salvando o último Token reconhecido 19

20 Implementação Faz uso de Buffer. Armazena em memória um bloco de dados para posterior armazenamento. Bufferização deve ser eficiente Única fase a ler caractere por caractere Usa-se um sentinela para eof 20

21 Buffer Duas marcas no buffer para delimitar o lexema A Interface (assinatura) do Buffer: class Buffer { char proximo(); // devolve o c.c. e avança um marcarInicio(); marcarUltimo(); retrair(int); // retrai o apontador do c.c. retrairAoUltimo(); String lexema(); // seq. entre as marcas } 21

22 O tipo Token 22 classs Token { public final int codigo; public final int codigo; public Object valor; public Object valor; Token (int c, Obejct v) { Token (int c, Obejct v) { codigo=c; valor=v} codigo=c; valor=v} Token (int c) { Token (int c) { this(c, null) } this(c, null) }} class sym { public final static int IF = 0; public final static int IF = 0; public final static int ID = 1; public final static int ID = 1; public final static int GE = 8; public final static int GE = 8;}

23 23 class Lexer { Buffer buffer = new Buffer(....); Token proximoToken( ) { int estado = 0; int ultimoFinal=-1; buffer.marcarInicio( ); scan: while (true) { c=buffer.proximo(); switch (estado) { case 0: if delimitador(c) estado = 29; else if (c=='i') { ultimoFinal = estado = 1; buffer.marcarUltimo(); } else if (isLetra(c)) { ultimoFinal = estado = 3; buffer.marcarUltimo(); } else if... else throw Erro(); // ou ignorar break;

24 24 case 29: if (!delim(c)) { buffer.retrair(1); buffer.marcarInicio(); estado=0; } } //switch }//while scan case 1: if (c=='f') { ultimoFinal = estado = 2; buffer.marcarUltimo(); } else if (letra(c)||digito(c)) { ultimoFinal = estado=3; buffer.marcarUltimo(); } else break scan; break; case 2:......

25 25 switch (ultimoFinal) { case -1: throw new Erro(); case 1: buffer.retrairAoUltimo(); return ( new Token ( sym.ID, buffer.lexema( ) ); case 2: … } } // proximoToken

26 Atividades Codificar autômato dos slides. Codificar a classe Buffer. 26

27 Referências Capítulo 2 (Livro do Tigre) Capítulo 3 (Livro do Dragão). Slides de Aula Prof. Giovanny 27


Carregar ppt "Análise Léxica André Luis Meneses Silva 1 Núcleo de Sistemas de Informação Universidade Federal de Sergipe Linguagens Formais e Tradutores."

Apresentações semelhantes


Anúncios Google