Análise Léxica
Correção exercícios aula passada
Atualizar material aula passada
Introdução

É também conhecida como scanner ou leitura e é a primeira fase de um processo
de compilação.

Sua função é fazer a leitura do programa fonte caractere a caractere e traduzi-lo
para uma sequencia de conhecida como símbolos léxicos ou sequencia de
tokens.

Os caracteres são agrupados em lexemas e produzem a sequencia de tokens

A sequencia de tokens é enviada para a próxima fase da compilação a análise
sintática.

O analisador léxico deve interagir com a tabela de símbolos e inserir informações
dos tokens, no caso os identificadores.
Introdução

Na implementação a análise léxica normalmente é uma sub-rotina da analise
sintática.

A implementação da análise léxica pode ser dividida em duas etapas:

Escandimento: que varre o programa fonte removendo os comentários e compactando
os espaços em branco.

Analise léxica: produz a sequencia de tokens.
Introdução

Termos relacionados a análise léxica:

Token: é uma par constituído de um nome e um valor. O nome de um token é um
símbolo que representa uma unidade léxica. Ex: Palavras reservadas, identificadores,
etc.

Padrão: é a forma que os lexemas de um token podem assumir. Ex: Palavras reservadas
é a sequência de caracteres da palavra reservada, no caso de identificadores são os
caracteres que formam nomes das variáveis, funções.

Lexema: é uma sequencia de caracteres reconhecidos por algum padrão de um token.
Tabela exemplo de termos
Token
const
Padrão
Sequência das
Lexema
Descrição
const
Palavra reservada
while, While, WHILE
Palavra reservada
If, IF, iF, If
Palavra reservada
palavras c, o, n, s, t.
while
Sequência das
palavras w, h, i, l, e
if
Sequência das
palavras i, f
comparadores
<, >, <=, >=, ==, !=
==, !=
numero
Dígitos numéricos
0.6, 18, 0.009
Constante numérica
literal
Caracteres entre “”
“Olá Mundo”
Constante literal
id
Nomes de variáveis,
nomeCliente, descricaoProduto,
Nome de variável, nome de
funções, parâmetros de calcularPreco()
função
funções.
atribuicao
=
=
Comando de atribuição
delimitador
{, }, [, ]
{, },[, ]
Delimitadores de início e fim
Identificação de termos
printf(“Total = %d\n”, score)
printf e score são lexemas que casão com o padrão id e id é
um token.
“Total = %d\n” é um lexema que casa com o
padrão literal, e literal é um token.
const PI = 3.1416
const é um token que casa com o padrão const e também é
um lexema. PI é um lexema que casa com o padrão id e id é
um token. = é um lexema que casa com o padrão do token
atribuicao. 3.1416 é um lexema que casa com o padrão do
token numero.
Tokens

Também conhecidos como símbolos léxicos, são unidade básicas do texto de um
programa.

Cada token é representado por ter unidade de informações básicas.

Classe do token: é o tipo de token reconhecido. Ex: identificadores, constantes
numéricas, cadeias de caracteres, palavras reservadas, operadores e separadores.

Valor do token: depende da classe do token, Ex: caso seja uma constante inteira
representa o valor inteiro, no caso de identificadores um apontador para a tabela de
símbolos.

Posição do token: Indica a linha e a coluna no texto onde ocorreu o token. É utilizado
principalmente para indicar o local do erro.
Tokens

Os tokens são divididos em dois grupos.

Tokens simples: São tokens que não tem valor associado pois a classe do token já a
descreve. Ex: palavras reservadas, operadores, delimitadores.

Tokens com argumento: são tokens que tem valor associado e corresponde a elementos
da linguagem definidos pelo programador. Ex: identificadores, constantes numéricas.
Tokens

Estrutura de um token.
<nome-token, valor-atributo>

Nome do token: corresponde a classe do token.

Valor atributo: corresponde a um valor qualquer a ser atribuído ao valor do token,
Exemplo 01 – sequência de tokens

Código
while indice < 10 do
indice:= total + índice;

Sequência de tokens
<while,><id,7> <<,><numero,10><do,><id,7><:=,><id,12><+,><id, 7><;,>
Exemplo 02 – sequência de tokens

Código
position = initial + rate * 60

Sequência de tokens
<id, 1> <=, > <id, 2> <+, > <id, 3> <*, > <numero, 4>
Exemplo 03 – sequência de tokens

Código
a[index] = 4 + 2

Sequência de tokens
<id, 1> <[,> <id, 2> <],> <=,> <numero, 3> <+,> <numero, 4>
Exemplo 04 – decomposição

Código
total = entrada * saida() + 2

Sequência de tokens
<id, 15> <=, > <id, 20> <*,> <id,30> <+, > <numero, 2>
Exemplo 04 – decomposição

Para o token temos:

<id, 15> : apontador 15 da tabela de símbolos e token id.

<=, > operador de atribuição, sem necessidade de um valor para o atributo.

<id, 20> : apontador 20 da tabela de símbolos e token id.

<*, > : operador de multiplicação, sem necessidade de um valor para o atributo.

<id,30> : apontador 20 da tabela de símbolos e token id.

<+, > : operador de soma, sem necessidade de um valor para o atributo.

<numero, 2> : token numero, com valor para o atributo 2 indicado o valor do numero
(constante numérica).
Tabela de símbolos

É uma estrutura de dados que gerada pelo compilador com o objetivo de
armazenar informação sobre identificadores e outros nomes usado no programa
fonte.

Exemplo: Variáveis; parâmetros de funções; procedimentos.

Informações: tipo de dados(inteiro, string); escopo de visibilidade; limite de
parâmetros; tamanho da variável.

A tabela de símbolos normalmente é uma estrutura de tabela hash, árvores
binárias ou listas lineares.

Nessa tabela pode ter informações sobre a posição(coluna, linha) do identificado
no programa fonte.

As informações são usadas em todo o processo de compilação.
Erros léxicos

A análise léxica é muito prematura para identificar erros de compilação, veja o
exemplo abaixo.
fi (a == “123”) ...

O analisador léxico não conseguira identificar o erro da instrução listada acima.
Isso só pode ser feita na analise sintática.

Uma estratégia utilizada para a recuperação de erros léxicos e a modalidade
pânico, que remove caracteres de entrada até encontrar um token bem formado
(AHO, 2008).

Remover caracteres estranhos.

Inserir caracteres ausentes.

Substituir caracteres corretos por incorretos.
Exercícios e Prática
Download

Slides - Compiladores