Você está na página 1de 56

COMPILADORES

Análise Léxica – Parte IV


Prof. Kleber Vieira Cardoso

Versão adaptada dos slides da


Profa. Deborah S. A. Fernandes
2

Análise Léxica
• O papel do Analisador léxico no compilador
• Definições (token/lexema/padrão)
• Implementação do analisador léxico
3

ANÁLISE LÉXICA
O Papel do analisador léxico
4

Análise Léxica
• Também chamado de Scanner
• Interface entre o programa fonte e o compilador
• Interage com a tabela de símbolos inserindo
informações
5
6

Análise Léxica

Arquitetura de um compilador

Em relação à implementação do compilador - É uma sub-


rotina do analisador sintático invocada durante a fase de
análise.

Analisador
Sintático

Back-end

Analisador
Léxico
7

Análise Léxica
Atividade:
• Lê o fonte caractere a caractere juntando-os em
unidades atômicas chamadas itens léxicos
(palavras válidas na linguagem lida) .
• Reconhece padrões de palavras e os classifica.
8

Análise Léxica
Porque realizar análise léxica?
 Realização da classificação funcional das palavras
de uma linguagem.
9

Análise Léxica
Classes de palavras
 Em língua portuguesa
- Verbo
- Adjetivo
- Advérbio
- Substantivo
- ...
10

Análise Léxica
Classes de palavras
 Em Compiladores
- Identificador - ID
- Constante Literal
- Constante numérico
§ Inteiro
§ Real
- Palavra reservada
- Operador relacional
- Operador aritmético
- Operador lógico
- Outros
11

Análise Léxica
Característica das Linguagens computacionais
para compilação
• Ausência de ambiguidade
– Permite o processamento eficaz
• A interpretação é sempre a mesma seja qual for o
compilador, a arquitetura ou o processador utilizado
12

ANÁLISE LÉXICA
Definições
13

Análise Léxica
Definição

Lexema = palavra = cadeia de


caracteres válida em uma linguagem.

Exemplos:
soma, aux, 12, 'a', “comentario”, if, while
14

Análise Léxica
Definição

Token = Símbolo que representa a unidade


léxica, a classe gramatical a qual um lexema
pertence.

Exemplos:
• soma, aux, => IDENTIFICADOR ou id
• +,-,*,/ => operadores aritméticos
• if, while, repeat => palavras reservadas

Na implementação o token pode vir acompanhado de vários


atributos.
15

Análise Léxica
Definições

Padrão – Descreve a regra de formação para que um


lexema pertença a uma classe de token.

Reconhecedores - Máquinas ou programas utilizados


para verificar se um lexema obedece ao padrão de
formação de uma classe de token.
 Implementação de máquinas de estado = autômatos
finitos.
16

Análise Léxica
Exemplos
Token Lexema Padrão Descrição

id Aux, idade, M, Começa com Nomes de


nomeAluno letra e após a variávies,
primeira letra funções,
podem existir procedimentos,
letras ou dígitos parâmetros
repeat repeat Sequência de Palavra
end end símbolos reservada
<= <= <=,>=, >, < Operador
relacional
Int 23 Números Constante
numérica
[ [ [,], { , } Delimitadores
17

ANÁLISE LÉXICA
Funcionalidade
18

Análise Léxica
Então, qual a função do analisador léxico?

Reconhecedor tokens

Como?
 Realizando a leitura caracter a caracter do programa
fonte;
 Implementando a máquina reconhecedora de
padrões.
19

Análise Léxica
Pra quê?
• Verificar se as palavras utilizadas pertencem ou
não a linguagem analisada;
• Atender à chamada do analisador sintático que
solicita tokens sempre que precisar.
• Realizar detecção de erros:
- Caracteres inválidos
- Literais incompletas
- Identificadores fora do padrão
20

Análise Léxica

Solicita token
Analisador
Sintático

Analisador

Token
Léxico

leitura Fluxo de
caracteres

Texto fonte
21

Análise Léxica
Outras tarefas desempenhadas pelo Léxico

• Relacionar a linha do arquivo com o erro ocorrido;


• Eliminar comentários;
• Ignorar saltos de linha e tabulação;
• Elimina caracteres em branco.
22

Análise Léxica

Praticando:
Realize a separação dos lexemas do arquivo fonte
abaixo:

if (x==y)
z=1;
else z=2;
Código Fonte
23

Análise Léxica
Lexemas:

If | ( | x | == | y| )|z | = | 1 |
; | else | z |= | 2 | ; | EOF
24

Análise Léxica
Alguns tipos de tokens – geral (depende da definição da
linguagem)

• Identificador – cadeias de letras ou dígitos iniciada por letras;


• Numeral – cadeia de dígitos;
• Literal – cadeia de letras ou dígitos iniciada e finalizada por “;
• Espaço em branco – cadeia de brancos, quebra de linha
• Operador Aritmético: +, - *, /
• Operador Relacional: ==, !=, >, <, >=, <=
25

Análise Léxica
Alguns tipos tipos de tokens – geral (depende da definição
da linguagem)

• Operador Lógico: &&, ||


• Palavra reservada ou o próprio lexema: palavras reservadas
da linguagem.
• Tokens unitários, podem ser classificados como
• Delimitador ou pode ser usado oo próprio lexema ;
• Fim_de_arquivo: EOF
• Abre-Parênteses ou o prórprio lexema: (
• Fecha-Parênteses ou o próprio lexema: )
• Atribuição ou o próprio lexema: =
• Outros.
26

Análise Léxica
Praticando:
Para o código abaixo quantos tokens de cada
tipo temos?

if (x==y)
z=1;
else z=2;
Código Fonte
27

Análise Léxica
Para o código anterior quantos tokens de cada tipo temos?
 id
 Espaço
 num
 Delimitador
 op_relacional
 Fim_de_arquivo
 ab_parênteses
 fc_parênteses
 if
 else
 Outros
28

Análise Léxica
Analisador léxico separado do Sintático

• Projeto mais simples


• Torna o projeto da linguagem mais claro
• Melhora a eficiência do compilador
29

Análise Léxica

A análise léxica em linguagens modernas é bem


simples, entretanto, historicamente, não era!

Vejamos alguns exemplos:


30

Análise Léxica
Ambiguidade
Linguagem FORTRAN
- Espaços em branco dentro de um token são ignorados

AUX1 e AUX 1 são o mesmo token

DO5I=1,25 -- 7 tokens
“DO” “5” “I” “=” “1” “,” “25”

DO5I=1.25 – 3 tokens
“DO5I” “=” “1.25”
31

Análise Léxica

Ambiguidade
PL/I – Programming Language One
Palavras-chave da linguagem não são reservadas

IF ELSE THEN THEN = ELSE; ELSE ELSE = THEN;


32

Análise Léxica
Mais algumas considerações
• Tem contato com todo o texto da linguagem-fonte;
• Um dos módulos com maior utilização;
• Um dos fatores determinísticos para a velocidade
de compilação;
33

Análise Léxica
Erros Léxicos
• Todas as palavras FORA dos padrões especificados
para palavras pertencentes à linguagem são
detectados.
• O analisador sinaliza um erro e retorna a posição e a
linha do código da ocorrência.
34

ANÁLISE LÉXICA
Implementação do analisador
35

Análise Léxica
Implementando o analisador Léxico
• Um analisador léxico poderia ser implementado
através da formalização dos padrões de formação
das palavras possíveis da linguagem por
reconhecedores de linguagens livres de contexto
(LLC). Entretanto, as LLC são complexas demais
para um problema que pode ser resolvido através
do uso de formalismos mais simples, por isso a
adoção das linguagens regulares para a
implementação da análise léxica.
36

Análise Léxica
Implementando o analisador Léxico
• O analisador léxico separado do sintático permite
que o projeto de compilador seja mais simples
aproveitando características de linguagens e
ganho de velocidade de processamento para a
compilação.
37

Análise Léxica
Implementando o analisador Léxico
Universo das linguagens – Noam Chomsky

Irrestritas
(Tipo 0)
complexidade
Sensíveis ao Contexto
(Tipo 1)

Livres de Contexto
(Tipo 2)

Regulares
(tipo 3)
38

Análise Léxica
Implementando o analisador Léxico
• Para o analisador léxico, o programa fonte é uma
sequência de palavras de uma linguagem regular.
• O conjunto de tokens de uma linguagem de programação é
uma linguagem regular.
• Então, escreve-se os padrões das palavras possíveis da
linguagem computacional utilizando os formalismos para
linguagens regulares.
39

Análise Léxica
Implementando o analisador Léxico
As linguagens regulares ou do Tipo 3 são
representadas através dos formalismos:

1. Expressões regulares
2. Autômatos finitos
3. Gramáticas regulares

* Buscar conteúdos vistos na disciplina de LFA para relembrar conceitos que


serão utilizados em Compiladores.
40

Análise Léxica
Implementando o analisador Léxico
Transformações – Linguagens Regulares (LFA)

EXPRESSÕES AUTÔMATO FINITO NÃO


Thompson
REGULARES DETERMINÍSTICO

Kleene
Subconjuntos
AUTÔMATO FINITO
DETERMINÍSTICO

Hopcroft

AUTÔMATO FINITO GRAMÁTICA


DETERMINÍSTICO MINIMIZADO REGULAR
41

Análise Léxica
Implementando o analisador Léxico
A análise léxica é um processo que pode ser
formalmente descrita através de expressões
regulares, produzindo uma rotina que realiza essa
análise. Essa rotina modela um autômato finito
determinístico derivado matematicamente das
expressões regulares especificadas.
- Geradores de analisadores léxicos.
42

Análise Léxica
Geradores de analisadores léxicos
• Ferramentas de automação do processo de criação do
autômato finito e reconhecimento de sentenças regulares a
partir de ER;
• Conhecidas como “Lex”;
• Trabalhoso dependendo dos padrões da linguagem
43

Análise Léxica
Geradores de analisadores léxicos
• Recebem como entrada uma especificação, conjunto de ER;
• Gera automaticamente um autômato determinístico que
reconhece as palavras da linguagem definida pela ER;
• Gera um algoritmo que lê caracteres de um arquivo
especificado;
• Verifica o casamento das sentenças com os padrões definidos
na especificação.
44

Análise Léxica
Alguns geradores de analisadores léxicos

FERRAMENTA

TurboPascal Lex/Yacc http://www.musikwissenschaft.uni-mainz.de/~ag/tply/

JFlex Escrito em Java


http://jflex.de/download.html
CSLex Escrito em #C, derivado do Jflex
http://www.cybercom.net/~zbrad/DotNet/Lex

Flex Para C
http://flex.sourceforge.net/
Flex++ Para C++
45

ANÁLISE LÉXICA
Implementação – MÃO NA MASSA
46

Análise Léxica
Implementação - Mão na massa

Para tratarmos da construção de um analisador léxico


do tipo “mão na massa”, vamos definir uma
linguagem de computador hipotética que será
denominada Wipy.
47

Análise Léxica
Implementação
Definição da linguagem exemplo Wipy:
- Σ = {a, b,...,z, =,@,$ }
- Definição regular: L = a | b | c | ... | z
- Palavras reservadas: início, fim, escreva, leia
- Identificadores: @L+
- Atibuição: =
- Fim de arquivo: $
- Erro – Quaisquer símbolos que não estejam presentes
no alfabeto.
48

Análise Léxica
Implementação

Primeiro passo: Construir um autômato finito


determinístico que reconheça as palavras da
linguagem.
49

Análise Léxica
Implementação - Funcionamento do analisador
Autômato Finito Determinístico
id
L
1 4 L

@ Tabela de Transição
Espaço em @ L = $ Espaço ≠Σ
branco ou \n
ou \n = 2 Atribuição
0 1 5 2 3 0 6
0
1 4
$
2
≠Σ
L 3 EOF 3
4 4
3
6 3
5 5 5
L Provável palavra
ERRO reservada 6
50

Análise Léxica
Implementação - Funcionamento do analisador

PALAVRAS RESERVADAS
- As palavras reservadas inicialmente são armazenadas
na tabela de símbolos.
• Elas podem ser identificadas pelo autômato como
identificadores, porém ao verificar que já se encontram na
tabela de símbolos, o analisador léxico retornará o que está
na armazenado na tabela de símbolos.
51

Análise Léxica
Implementação - Funcionamento do analisador

PALAVRAS RESERVADAS
- Palavras reservadas recebem como token o mesmo
nome do lexema.
• Nas demais análises é importante saber de qual palavra
reservada se trata para que verificações sintáticas e
semânticas sejam realizadas.
52

Análise Léxica

Implementação - Funcionamento do analisador

Tabela de Transição Tabela de símbolos Código Fonte

@ L = $ Espaço ≠Σ token lexema início


ou \n início início leia @a
leia @b
0 1 5 2 3 0 6 fim fim @a=@a+@b
1 4 leia leia escreva @a
2 escreva escreva escreva @b
3
3 fim
4 4
5 5
6
53

Análise Léxica
Implementação - Funcionamento do analisador
• O analisador léxico é um módulo controlado pelo analisador
sintático que decidirá quando o scanner entrará em ação.
• A cada chamada ao léxico, este realizará a escação da entrada
(código fonte) com caminhamento pelo autômato. Ao reconhecer
um token,

se for id
então se consultar a tabela de símbolos = V
então retornar a entrada da tabela referente ao token
senão inserir nova entrada na tabela para o id encontrado
senão retornar o token e seus atributos
54

Análise Léxica
Tabela de Transição
@ L = $ Espaço ≠Σ
ou \n
0 1 5 2 3 0 6 A saída do analisador
1 4
2
Código Fonte Saída do Léxico
3
início início, início
4 4 leia @a leia, leia
5 5 leia @b id, @a
6 @b=@a leia, leia
escreva @a id, @b
Tabela de símbolos escreva @b id, @b
3 atribuição ,=
token lexema id, @a
fim
início início escreva, escreva
fim fim id, @a
escreva, escreva
leia leia id, @b
escreva escreva ERRO, 3 – Caractere inválido
na linguagem, linha 7, coluna 1
id @a fim ,fim
id @b
55

Análise Léxica
Implementando o analisador
Tabela de símbolos Saídas do Léxico
token lexema
início, início
início início
fim fim leia, leia
leia leia
escreva escreva id, @a
Código Fonte … …
leia, leia
início
leia @a


id, @b
leia @b
@a=@a+@b
Escreva @a
Escreva @b Analisador Léxico
3
fim
56

Análise Léxica
Para estudar
LIVRO DO DRAGÃO
 Capítulo 3
- Itens:
 3.1 – tokens /lexemas/padrões
 3.3 – explica sobre expressões e definições regulares
 3.4 – reconhecendo tokens → implementação
 3.6 – autômatos finitos determinísticos (AFD) e não determinísticos
(AFND)
 3.7 – transformação de AFND em AFD e geração de autômatos a partir
de expressões regulares
 3.9 – otimização de autômatos, por exemplo, minimização de estados

Você também pode gostar