Você está na página 1de 26

Compiladores

Analise léxica
Fases de um Compilador

23/11/2023 2
Analise léxica
Definição

Analisar o código fonte e dividir seu fluxo de caracteres em unidades
significativas chamadas de tokens.

Estes são elementos atômicos da linguagem de programação, como
palavras-chave, identificadores, operadores e literais.
Objetivos

Encontrar padrões no código fonte e categoriza os diferentes
elementos identificados.

Geralmente ignora espaços em branco e comentários, concentrando-se
apenas nos elementos essenciais do código.

23/11/2023 3
Analise léxica
Processo
Scanner (Analisador Léxico)

Percorre o código fonte caracter por caracter.
Reconhecimento de Padrões

Ao encontrar padrões que correspondem a tokens (definidos pelas regras
léxicas da linguagem), o scanner identifica e classifica esses tokens.
Construção da Tabela de Símbolos

O analisador léxico constrói uma tabela de símbolos, associando informações
relevantes a cada identificador encontrado.

23/11/2023 4
Analise léxica
Exemplo

Código em C
int main() {
printf("Hello, World!");
return 0;
}

O analisador léxico identificaria tokens como ‘int’, ‘main’, ‘(‘, ‘)’, ‘{‘,
‘printf’, ‘"Hello, World!"’, ‘;’, ‘}’, ‘return’, ‘0’, e ‘;’.

23/11/2023 5
Analise léxica
Importância

Facilita a identificação de erros como palavras-chave mal escritas ou
símbolos desconhecidos.

Fornece uma base para as fases subsequentes do processo de
compilação, como a análise sintática.

Dividir o código fonte em unidades significativas, representadas por
tokens, preparando-o para a análise sintática e as fases subsequentes
do compilador.

23/11/2023 6
Fase de Análise
Divisão do Programa

Dividir o programa em unidades significativas, identificando a estrutura
gramatical e as relações entre os elementos do código fonte.
Detecção de Erros

Caso haja algum erro no código fonte, a análise deve fornecer
mensagens de erro claras e esclarecedoras para auxiliar os
programadores na correção de seus programas.

23/11/2023 7
Fase de Síntese
Construção do Programa Objeto

Construir o programa objeto a partir da representação intermediária
gerada durante a análise.

Código que serve como uma etapa intermediária entre o código fonte e
o código de máquina.
Otimização

Envolve a aplicação de técnicas para melhorar a eficiência do código
gerado, sem alterar o comportamento do programa.

23/11/2023 8
Representação Intermediária
Definição

Forma abstrata do código que é utilizada entre as fases de análise e
síntese. Pode ser uma árvore sintática, código de três endereços, ou
outra estrutura que simplifica a tradução do código fonte para o código
objeto.

Facilitação da Síntese

Fornece uma forma estruturada e simplificada do código, tornando
mais eficiente a geração do código final.

23/11/2023 9
Importância do Processo

A divisão em análise e síntese permite uma abordagem modular
no design de compiladores.

Mensagens claras de erro na análise facilitam a correção de
problemas no código fonte.

A representação intermediária suaviza a transição entre as
diferentes fases do compilador.

23/11/2023 10
Etapa de Atribuição e Geração de Resultado
Após Análise Léxica

Compreender o processo de atribuição em linguagens de
programação.

Entender a relação entre a análise léxica e a etapa de atribuição.

Analisar um exemplo prático de atribuição e sua representação
após a análise léxica.

23/11/2023 11
Introdução

A etapa de atribuição desempenha um papel fundamental na
execução de programas, permitindo que valores sejam
armazenados em variáveis.

Vamos explorar como essa etapa se integra com a análise léxica
e como podemos interpretar os resultados obtidos.
Atribuição em Linguagens de Programação

A atribuição é uma operação essencial que associa um valor a uma
variável.

Em muitas linguagens, o operador de atribuição é representado por =.

23/11/2023 12
Atribuição
Significado dos Símbolos Abstratos

Os identificadores, como id, 1i, id, 2i, e id, 3i, representam variáveis
específicas no programa.

Os operadores (=, +, *) indicam as operações a serem realizadas.

Os resultados obtidos após a análise léxica são interpretados e
associados a variáveis durante a etapa de atribuição.

23/11/2023 13
Análise Sintática

O analisador sintático utiliza os primeiros componentes dos
tokens, como nomes e valores de atributo, para criar uma
representação hierárquica da estrutura gramatical do código
fonte.

Essa fase é crucial para garantir que o programa siga as regras
sintáticas da linguagem.

23/11/2023 14
Representação em Árvore de Sintaxe

Cada nó interior da árvore representa uma operação.

Os filhos dos nós representam os argumentos da operação.

A árvore de sintaxe é uma representação visual da estrutura
gramatical do programa.

23/11/2023 15
Árvore de Sintaxe
= ●
Considere a expressão
/\ a = b + c * d:

a + ●
A árvore reflete a estrutura
gramatical da expressão,
/\ onde a operação de adição é
b * priorizada sobre a
/\ multiplicação.
c d

23/11/2023 16
Análise Sintática e Estrutura de Árvore
Importância na Geração do Programa Fonte

A estrutura gramatical capturada pela análise sintática é essencial na
geração do programa fonte.

Garante que o código resultante siga a sintaxe da linguagem.

Importância na Geração do Programa Objeto



A estrutura gramatical continua a ser crucial nas fases posteriores,
incluindo a geração do programa objeto.

Influencia diretamente a tradução para código de máquina.

23/11/2023 17
Interação Léxico-Sintático

Em alguns casos, o analisador léxico precisa consultar a tabela
de símbolos para identificar o token adequado.

O analisador sintático geralmente chama o analisador léxico para
obter o próximo token relevante.

Essa comunicação é essencial para garantir uma interpretação
correta do código fonte.

23/11/2023 18
Função getNextToken

O analisador sintático chama a função getNextToken para obter o
próximo token do analisador léxico.

getNextToken lê os caracteres de entrada até identificar o próximo
lexema e, em seguida, produz o token correspondente.

23/11/2023 19
Questão 1
Qual é a principal função do analisador léxico em um compilador?
A) Identificar erros sintáticos no código fonte.
B) Gerar o código de máquina a partir do código fonte.
C) Transformar o código fonte em uma sequência de tokens.
D) Realizar otimizações no código intermediário.
E) Interpretar as instruções do programa durante a execução.

23/11/2023 20
Questão 2
O que é uma gramática ambígua na análise sintática?
A) Uma gramática que permite a formação de palavras-chave
ambíguas.
B) Uma gramática em que cada símbolo não terminal possui apenas
uma regra de produção.
C) Uma gramática que pode gerar mais de uma árvore de derivação
para uma mesma sentença.
D) Uma gramática que é facilmente compreendida por programadores.
E) Uma gramática que não permite recursividade.

23/11/2023 21
Questão 3
O que é um lexema em análise léxica?
A) Um símbolo abstrato que representa um tipo de unidade léxica.
B) Uma sequência de caracteres no programa fonte que casa com o
padrão para um token.
C) Uma tabela que mapeia identificadores para seus respectivos
valores.
D) Um elemento de uma árvore de derivação.
E) Uma expressão regular que define um padrão de token.

23/11/2023 22
Questão 4
O que representa um nó interior em uma árvore de sintaxe
gerada durante a análise sintática?
A) Um identificador de variável.
B) Uma operação.
C) Uma palavra-chave.
D) Um número.
E) Um operador lógico.

23/11/2023 23
Questão 2
O que é uma gramática ambígua na análise sintática?
A) Uma gramática que permite a formação de palavras-chave
ambíguas.
B) Uma gramática em que cada símbolo não terminal possui apenas
uma regra de produção.
C) Uma gramática que pode gerar mais de uma árvore de derivação
para uma mesma sentença.
D) Uma gramática que é facilmente compreendida por programadores.
E) Uma gramática que não permite recursividade.

23/11/2023 24
Questão 1
Qual é a principal função do analisador léxico em um compilador?
A) Identificar erros sintáticos no código fonte.
B) Gerar o código de máquina a partir do código fonte.
C) Transformar o código fonte em uma sequência de tokens.
D) Realizar otimizações no código intermediário.
E) Interpretar as instruções do programa durante a execução.

23/11/2023 25
Questão 1
Qual é a principal função do analisador léxico em um compilador?
A) Identificar erros sintáticos no código fonte.
B) Gerar o código de máquina a partir do código fonte.
C) Transformar o código fonte em uma sequência de tokens.
D) Realizar otimizações no código intermediário.
E) Interpretar as instruções do programa durante a execução.

23/11/2023 26

Você também pode gostar