Você está na página 1de 25

Análise Léxica

Raphael de Souza – raphael@ic.ufmt.br


Análise Léxica

2
2/25
Análise Léxica

3
3/25
Analisador Léxico
 Lê o código-fonte

 Identifica os lexemas

 Remove comentários e o espaço em branco

 Correlaciona o erro gerado com o programa fonte


 Guarda as quebras de linha para apresentar o
erro

4/25
4
Analisador Léxico
 Token: um par consistindo em um nome e
valor de atributo opcional

 Padrão: descrição da forma que os lexemas de


um token podem assumir

 Lexema: é uma sequência de caracteres que


casa com o padrão para o token

5/25
5
Analisador Léxico
 printf(“Total = %d\n”, score);

 printf e score são lexemas do padrão id

 “Total = %d\n” é um lexema com padrão


literal

6/25
6
Analisador Léxico

7/25
7
Analisador Léxico
 Lê caracteres da entrada e os agrupa em
tokens

 Remove espaços em branco e comentários

8/25
8
Analisador Léxico
 Pode precisar ler alguns caracteres adiante
antes de poder decidir sobre o token

 Exemplo: para C e Java se o analisador


encontrar o caracter ‘>’ precisará ler o
próximo

 Pode-ser guardar um buffer de entrada para a


manipulação

9/25
9
Analisador Léxico
 A ideia é que se o analisador ver o caracteres
‘1’ ele leia mais um para ver se não é um
número maior, ‘10’

10/25
10
Analisador Léxico
 Constantes 31+28+59
⟨num ,31⟩ ⟨+⟩ ⟨num , 28⟩ ⟨+⟩ ⟨num ,59⟩

11/25
11
Analisador Léxico
 Palavras-chaves e identificadores

count =count +increment ;

⟨id , count ⟩ ⟨=⟩ ⟨id , count ⟩ ⟨+⟩ ⟨id ,increment ⟩ ⟨;⟩

12/25
12
Analisador Léxico
 Palavras-chaves e identificadores
 Usamos o Hashtable ou o HashMap do Java
para mapear as chaves e valores
 Hashtable words = new Hashtable();

13/25
13
Analisador Léxico
 Função scan

14/25
14
Analisador Léxico
 Classes

15/25
15
Analisador Léxico
 Classes
package lexer;
public class Token {
public final int tag;
public Token(int t) { tag = t; }
}

package lexer;
public class Tag {
public final static int
NUM = 256, ID = 257, TRUE = 258, FALSE = 259;
}

16/25
16
Analisador Léxico
package lexer;
public class Num extends Token {
public final int value;
public Num(int v) { super(Tag.NUM); value = v; }
}

package lexer;
public class Word extends Token {
public final String lexeme;
public Word(int t, String s) {
super(t); lexeme = new String(s);
}
}

17/25
17
Analisador Léxico
package lexer;
import java.io.*; import java.util.*;
public class Lexer {
public int line = 1;
private char peek = ' ';
private Hashtable words = new Hashtable();
void reserve(Word t) { words.put(t.lexeme, t); }
public Lexer() {
reserve(new Word(Tag.TRUE, "true"));
reserve(new Word(Tag.FALSE, "false"));
}
public Token scan() throws IOException {
for (;; peek = (char) System.in.read()) {
if (peek == ' ' || peek == '\t') continue;
else if (peek == '\n') line = line + 1;
else break;
}
18/25
18
Analisador Léxico
if (Character.isDigit(peek)) {
int v = 0;
do {
v = 10 * v + Character.digit(peek, 10);
peek = (char) System.in.read();
} while (Character.isDigit(peek));
return new Num(v);
}
if (Character.isLetter(peek)) {
StringBuffer b = new StringBuffer();
do {
b.append(peek);
peek = (char) System.in.read();
} while (Character.isLetterOrDigit(peek));
String s = b.toString();
Word w = (Word) words.get(s); Token t = new Token(peek);
if (w != null) return w; peek = ' ';
w = new Word(Tag.ID, s); return t;
words.put(s, w); }
return w; }
}
19/25
19
Analisador Léxico
 Como um passo na construção do analisador
léxico criamos os diagramas de transição

20/25
20
Analisador Léxico
 Para id’s e palavras-chaves

21/25
21
Analisador Léxico
 Números sem sinal

22/25
22
Analisador Léxico
 “Espaços em branco” (‘ ’,\n,\t)

23/25
23
Analisador Léxico
 Implementação do diagrama do relop
TOKEN getRelop() {
TOKEN retToken = new RELOP();
while(1) { /* repete o processamento de caractere até que ocorra um retorno ou
uma falha */
switch(state) {
case 0: c = nextChar();
if ( c == '<' ) state = 1;
else if ( c == '=' ) state = 5;
else if ( c == '>' ) state = 6;
else fail(); /* lexema não é um relop */
break;
case 1: ...
...
case 8: retract();
retToken.attribute = GT;
return(retToken);
}
}
} 24
24/25
Referências Bibliográficas
 Livro:
 Compiladores: Princípios, técnicas e
ferramentas. Alfred V. Aho, et al

25/25
25

Você também pode gostar