Escolar Documentos
Profissional Documentos
Cultura Documentos
2
2/25
Análise Léxica
3
3/25
Analisador Léxico
Lê o código-fonte
Identifica os lexemas
4/25
4
Analisador Léxico
Token: um par consistindo em um nome e
valor de atributo opcional
5/25
5
Analisador Léxico
printf(“Total = %d\n”, score);
6/25
6
Analisador Léxico
7/25
7
Analisador Léxico
Lê caracteres da entrada e os agrupa em
tokens
8/25
8
Analisador Léxico
Pode precisar ler alguns caracteres adiante
antes de poder decidir sobre o token
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
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