Aula 2 - Análise Léxica

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 32

UFRB-CETEC

Curso: Eng. De Computação


Disciplina: Compiladores
Semestre: 2021.1
FREDERICO JÚNIOR GOMES DA SILVEIRA
Análise léxica

 Roteiro de Apresentação
 Introdução
 História dos compiladores
 O que é um compilador?
 Fases da compilação
 Análise léxica
Introdução

 Surgimento:
 ligado à história das linguagens de programação,
 Que está ligada à história dos computadores modernos

“programas fixos” “programas armazenados”


1940
• PCs modernos;
• Programa implícito no HW; • Diferentes programas criados;
• Minoria reprogramada; • Linguagem de Máquina.
• Feito de maneira mecânica. • SSEM – Manchester Small-Scale
Experimental Machine / Manchester Baby.
Introdução

Figura 1. Manchester Baby

Figura 2. Manchester Baby sendo operado em 1948.


Introdução
 Linguagem de Máquina
 Linguagem do SSEM – primeira linguagem de programação;
 Associação entre Instrução em binário e efeito sobre HW;
 Entendida diretamente pelo CPU;
 Cada arquitetura >>> própria linguagem

 Exemplo de instrução:
 Somar o valor dos registradores 1 e 2, e guardar o resultado no registrador 3.

 Exemplo de código de máquina (fictício):

10111000 0001 0010 0011

adição reg. 1 reg. 2 reg. 3


Introdução

 Linguagem de Máquina – notação simbólica


 Representação dos Programas no papel;
 Símbolos para representar instruções;
 Exemplos: ADD (adição), LOAD (leitura), R1 (registrador 1), etc.
 Notação Simbólica = Linguagem Assembly/Linguagem de montagem;
 Exemplo de instrução em Assembly:
10111000 0001 0010 0011
ADD R1 R2 R3
adição reg. 1 reg. 2 reg. 3

 Tradução de texto em assembly p/ linguagem de Máquina: ASSEMBLER ou MONTADOR.


Introdução

 Surgimento de Novas Linguagens


 Desvantagens da Linguagem de Máquina;
 Pensar no algoritmo e no funcionamento do HW;
 Surgimento de Linguagens mais elaboradas: Fortran (1957), LISP (1959),
COBOL (1960), BASIC (1964), C (1972), etc.
 Notação mais intuitiva e distante dos detalhes do HW, por exemplo:

• Carrega operadores em registradores;


• Opera a adição, guarda o result. em um
temp = 2 + 3 registrador;
• Copia conteúdo do registrador de
resultado p/ memória.

 Surgimento das Linguagens de alto nível e baixo nível.


Introdução

LINGUAGENS DE ALTO NÍVEL LINGUAGENS DE BAIXO NÍVEL

• Independente de arquitetura; • Dependentes de arquitetura;


• Comandos mais intuitivos; • Instruções primitivas (operações
• Mais fácil de programar/ler códigos sobre HW);
prontos; • Programas Extensos e pouco legíveis;
• Restrição do HW p/ evitar bugs; • Mais controle sobre o HW.
• Controle de alocação de memória
em JAVA.
Introdução
 Exemplos de códigos:

Figura 3. Programa Hello World em assembly x86. Figura 4. Programa Hello World em C.
História dos Compiladores

 Compiladores
 lê código entrada, gera código de máquina;
 Arquivo gerado pode ser executado p/ produzir resultados.

código compilação código de execução


resultados
fonte máquina

 Interpretadores
 Lê código entrada e executa o que tá no código.

código interpretação
resultados
fonte
O que é um compilador?

 Compilador: lê programa fonte e traduz em programa objeto.

Programa Programa
Fonte COMPILADOR Objeto
(C, Pascal, Java, etc.) Ex.: Ling. de Máquina (assembler),
Ling. de Máquina Virtual (java), Qlqr
outra Linguagem (C).

 Tradução: duas tarefas executas pelo compilador


 ANÁLISE – texto de entrada examinado, verificado e compreendido; Se
subdivide em análise léxica, análise sintática e análise semântica.
 SÍNTESE – texto de saída gerado p/ corresponder ao texto de entrada.
O que é um compilador?

comunicação
front-end back-end
(fase de análise) Representação intermediária (geração do código)
Depende Depende
exclusivamente exclusivamente

Linguagem Linguagem
fonte objeto
 Simplificação de várias LP p/ várias máquinas;
 01 front-end p/ cada Linguagem, 01 back-end p/ cada máquina;
 Implementar m linguagens em n máquinas:
 mfront-ends e nback-ends
 em vez de mn compiladores completos
Fases da Compilação

Figura 5. Fases da compilação.


Fases da Compilação

Figura 5. Fases da compilação.


Análise Léxica

 Também chamada de Scanner;


 Caracteres >>> Símbolos/Tokens
 Entrada = Fluxo de caracteres
 Saída = fluxo de símbolos id
id LPAR equals
if (n == 0) “n”
{
return 1; intLit
} “0” RPAR LCUR return
else
{
...
}
intLit
“1” comm RCUR else
Análise Léxica

 Símbolos:
 Palavras reservadas, identificadores de variáveis e procedimentos,
operadores, pontuação, etc
 Expressões regulares utilizadas
 Scanner >>> Método de elementos finitos
 Exemplo: position = initial + rate * 60

• O identificador position • O identificador rate


• O símbolo de atribuição = • O símbolo de multiplicação *
• O identificador initial • O número 60
• O símbolo de adição +

<id, 1> <=> <id, 2> <+> <id, 3> <*> <60>
Análise Léxica

 Papel do Analisador Léxico


 Primeira fase do Compilador
 Tarefa principal = ler caracteres e produzir sequencia de tokens p/ o
parser utilizar na análise sintática

Figura 6. Interação do Analisador Léxico com o parser


Análise Léxica

 Papel do Analisador Léxico


 Pode realizar tarefas secundárias ao nível interface com usuário:
1. Remover comentários e espaço em branco;
2. Correlacionar msgs de erro do compilador/programa fonte.

 Dividido em duas fases em cascata:


1. “Varredura” (scanning) >>> tarefas simples
2. “Análise léxica” >>> tarefas mais complexas
Análise Léxica

 Razões p/ divisão da Compilação em Análise Léxica e Análise


Gramatical (parsing):
1. Projeto mais simples;
2. Eficiência do compilador é melhorada;
3. Portabilidade do compilador é realçada.

 Ferramentas tem sido projetadas p/ construção de Analisadores


Léxicos
Tokens, Padrões, Lexemas

 Análise Léxica: usa-se “tokens”, “lexemas” e “padrões“, conforme a


figura a seguir:

 Conj. de cadeias entrada => mesmo token produzido como saída


 Padrão => reconhece cada cadeia
 Lexema => conj de caracteres que é reconhecido pelo token
Tokens, lexemas, padrões

const pi = 3.1416

 A subcadeia pi é um lexema para o token “identificador” (id);


 Tokens = símbolos terminais na gramática (nomes em negrito);
 Lexemas reconhecidos pelo token: cadeias de caracteres no
programa fonte
 Podem receber conjunto, como instâncias de uma mesma unidade
léxica (instâncias de identificadores, números, etc)
Tokens, lexemas, padrões

 Nas Ling de Prog, as seguintes constantes são tratadas como


tokens: palavras-chave, operadores, identificadores, constantes,
literais, cadeias e símbolos de pontuação, como parênteses,
vírgulas e ponto-e-vírgulas.

const pi = 3.1416

 Quando pi aparece, um token representando um identificador é


repassado ao parser;
 O repasse de um token é frequentemente implementado
transmitindo-se um inteiro associado ao token. É justamente esse
inteiro que é designado por “id” na figura a seguir
Tokens, lexemas, padrões
Tokens, lexemas, padrões

 PADRÕES
 regra que descreve o conjunto de lexemas que podem representar um
token
 padrão para o token “const” (da figura anterior) é exatamente a
cadeia singela const, que soletra a palavra-chave
 Para descrever precisamente os padrões para tokens mais complexos,
como “id” (identificador) e “num” (número), iremos usar a notação de
expressões regulares que veremos mais adiante.
Atributo para os Tokens

 lexema reconhecido por mais de um padrão: analisador léxico


providencia informações adicionais para as fases subsequentes do
compilador

 Ex.: o padrão “num” reconhece as duas cadeias 0 e 1, mas é essencial


para o gerenciador de código ser informado sobre que cadeia foi
efetivamente reconhecida.

 O analisador léxico coleta informações a respeito dos tokens em seus


atributos associados.

 Os tokens influenciam decisões na análise gramatical; os atributos


influenciam a tradução dos tokens.
Atributo para os Tokens

 Do ponto de vista prático, o token possui usualmente somente um


único atributo
 um apontador para a entrada da tabela de símbolos.
 O apontador se torna o atributo do token.
 Ex: Os tokens e os valores de atributos associados ao enunciado Fortran
E = M * C ** 2
 São escritos em uma seqüência de pares:
 <id, apontador p/ entrada da tabela de símbolos para E>
 <operador_de_transição,>
 <id, apontador p/ entrada da tabela de símbolos para M>
 <operador_de_multiplicação,>
 <id, apontador p/ entrada da tavela de símbolos para C>
 <operador_de_exponenciação,>
 <num, valor inteiro 2>
Erros Léxicos

 Poucos erros são distinguíveis somente no nível léxico


 Se a cadeia fi for encontrada pela primeira vez num programa C,
no contexto:
fi ( a == f(x) ) ...

 Um analisador léxico não poderá dizer se fi é a palavra-chave if


incorretamente grafada ou um identificador de função não
declarada.
 Como fi é um identificador válido, o analisador léxico precisa
retornar o token identificador e deixar alguma fase posterior do
compilador tratar o eventual erro.
Erros Léxicos

 E se o analisador léxico for incapaz de prosseguir? (“nenhum


padrão reconhece a entrada”)
 Talvez a estratégia mais simples de recuperação seja a da
“modalidade pânico”.
 Removemos sucessivos caracteres da entrada até que o analisador
léxico possa encontra um token bem-formado.
 Essa técnica de recuperação pode ocasionalmente confundir o parser
 Mas num ambiente interativo pode-se dizer que é adequada.

 Outras ações de recuperação de erros são: Remover um caractere


estranho; Inserir um caractere ausente; Substituir um caractere
incorreto por um correto; e Transpor dois caracteres adjacentes
Especificação dos Tokens

 CADEIAS E LINGUAGENS
 Cadeia: seqüência finita de símbolos do
alfabeto
 “Sentença e palavra” = cadeia
 Comprimento da cadeia s ( |s| ), é o número
de ocorrências de símbolos em s.
 Ex:
 banana é uma cadeia de comprimento seis.
 A cadeia vazia, denotada , é uma cadeia
especial de comprimento zero.
Especificação dos Tokens

 CADEIAS E LINGUAGENS
 Linguagem: qualquer conjunto de cadeias sobre algum alfabeto fixo
 Linguagens abstratas como Ø, o conjunto vazio, ou { }, o conjunto
contendo apenas somente a cadeia vazia, são linguagens sob essa
definição.
 Se x e y são cadeias, então a concatenação de x e y, escrita xy é a
cadeia formada atrelando-se y a x.
 Ex: se x = cão e y = casa, então xy = cãocasa.
 A cadeia vazia é o elemento identidade da concatenação.
 sE = Es = s
Especificação dos Tokens
Obrigado!
[email protected]

Você também pode gostar