Análise Lexical (Analisador) no Projeto de Compilador com Exemplo

⚡ Resumo Inteligente

A análise léxica é a primeira fase do projeto de um compilador, onde um analisador léxico converte um fluxo de caracteres de origem em tokens significativos. Ele remove espaços em branco e comentários, registra os tokens na tabela de símbolos e reporta erros léxicos ao analisador sintático.

  • 🔤 Primeira fase do compilador: A análise lexical lê os caracteres de origem e os converte em uma sequência de tokens.
  • 🧩 Termos chave: Um lexema é uma sequência de caracteres correspondentes, um token é a sua categoria e um padrão define a regra.
  • ???? Como Funciona: O analisador sintático solicita "obter o próximo token" e o scanner retorna os tokens sob demanda.
  • 🧹 Função de limpeza: O analisador léxico remove espaços em branco e comentários, expande macros e preenche a tabela de símbolos.
  • ⚠️ Erros lexicais: Caracteres ilegais ou identificadores com erros ortográficos geram erros, que são tratados por técnicas de recuperação como exclusão ou transposição.
  • 🔀 Analisador léxico vs. analisador sintático: O analisador léxico identifica os tokens; o analisador sintático constrói uma árvore sintática durante a análise sintática.

Análise Lexical

O que é análise lexical?

Análise Lexical é a primeira fase no projeto do compilador. Um Lexer pega o código-fonte modificado que é escrito na forma de frases. Em outras palavras, ajuda a converter uma sequência de caracteres em uma sequência de tokens. O analisador léxico divide essa sintaxe em uma série de tokens. Remove qualquer espaço extra ou comentário escrito no código-fonte.

Os programas que realizam análise lexical no projeto do compilador são chamados de analisadores lexicais ou lexers. Um lexer contém tokenizer ou scanner. Se o analisador léxico detectar que o token é inválido, ele gerará um erro. A função do Analisador Lexical no projeto do compilador é ler fluxos de caracteres do código-fonte, verificar tokens legais e passar os dados para o analisador de sintaxe quando necessário.

Exemplo

How Pleasant Is The Weather?

Veja este exemplo de Análise Lexical; Aqui, podemos facilmente reconhecer que existem cinco palavras Quão Agradável, O, Clima, É. Isso é muito natural para nós, pois podemos reconhecer os separadores, os espaços em branco e o símbolo de pontuação.

 HowPl easantIs Th ewe ather?

Agora, veja este exemplo, também podemos ler isto. No entanto, isso levará algum tempo porque os separadores são colocados nos lugares ímpares. Não é algo que chega até você imediatamente.

Terminologias básicas

O que é um lexema?

Um lexema é uma sequência de caracteres incluídos no programa de origem de acordo com o padrão correspondente de um token. Não passa de uma instância de um token.

O que é um token?

Tokens no design do compilador são a sequência de caracteres que representa uma unidade de informação no programa fonte.

O que é padrão?

Um padrão é uma descrição usada pelo token. No caso de uma palavra-chave usada como token, o padrão é uma sequência de caracteres.

Analisador Lexical Archiarquitetura: como os tokens são reconhecidos

A principal tarefa da análise lexical é ler os caracteres de entrada no código e produzir tokens.

O analisador léxico verifica todo o código-fonte do programa. Ele identifica cada token um por um. Os scanners geralmente são implementados para produzir tokens somente quando solicitados por um analisador. Veja como funciona o reconhecimento de tokens no design do compilador-

Analisador Lexical Archiarquitetura
Analisador Lexical Archiarquitetura
  1. “Obter próximo token” é um comando que é enviado do analisador para o analisador léxico.
  2. Ao receber este comando, o analisador léxico verifica a entrada até encontrar o próximo token.
  3. Ele retorna o token ao analisador.

O Lexical Analyzer ignora espaços em branco e comentários ao criar esses tokens. Se houver algum erro, o analisador Lexical correlacionará esse erro com o arquivo de origem e o número da linha.

Funções do analisador lexical

O analisador léxico executa as tarefas abaixo:

  • Ajuda a identificar o token na tabela de símbolos
  • Remove espaços em branco e comentários do programa fonte
  • Correlaciona mensagens de erro com o programa de origem
  • Ajuda você a expandir as macros se for encontrado no programa de origem
  • Leia os caracteres de entrada do programa de origem

Exemplo de análise lexical, tokens, não tokens

Considere o seguinte código que é alimentado no Lexical Analyzer

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Exemplos de Tokens criados

Lexema Token
int Palavra-chave
máximo Identificar
( Operator
int Palavra-chave
x Identificar
, Operator
int Palavra-chave
Y Identificar
) Operator
{ Operator
If Palavra-chave

Exemplos de não-tokens

Formato Exemplos
Comentário // Isto irá comparar 2 números
Directiva do pré-processador #includes
Directiva do pré-processador #define NÚMEROS 8,9
Macro NÚMEROS
Espaço em branco /n /b /t

Erros Lexicais

Uma sequência de caracteres que não é possível digitalizar em nenhum token válido é um erro léxico. Fatos importantes sobre o erro lexical:

  • Erros lexicais não são muito comuns, mas devem ser gerenciados por um scanner
  • Erros ortográficos de identificadores, operadores e palavras-chave são considerados erros lexicais
  • Geralmente, um erro léxico é causado pelo aparecimento de algum caractere ilegal, principalmente no início de um token.

Recuperação de erros no Lexical Analyzer

Aqui estão algumas técnicas de recuperação de erros mais comuns:

  • Remove um caractere da entrada restante
  • No modo pânico, os caracteres sucessivos são sempre ignorados até chegarmos a um token bem formado
  • Inserindo o caractere ausente na entrada restante
  • Substitua um caractere por outro caractere
  • Transpor dois caracteres seriais

Analisador Lexical vs. Analisador

Analisador Lexical Analisador
Programa de entrada de digitalização Realizar análise de sintaxe
Identificar tokens Crie um abdômen definidotracrepresentação do código
Insira tokens na tabela de símbolos Atualizar entradas da tabela de símbolos
Gera erros lexicais Ele gera uma árvore de análise do código-fonte

Por que separar Lexical e Parser?

  • A simplicidade do design: facilita o processo de análise lexical e de sintaxe, eliminando tokens indesejados
  • Para melhorar a eficiência do compilador: Ajuda a melhorar a eficiência do compilador
  • Especialização: técnicas especializadas podem ser aplicadas para melhorar o processo de análise lexical
  • Portabilidade: apenas o scanner necessita para se comunicar com o mundo exterior
  • Maior portabilidade: peculiaridades específicas do dispositivo de entrada restritas ao lexer

Vantagens da análise lexical

  • O método do analisador léxico é usado por programas como compiladores que podem usar os dados analisados ​​​​do código de um programador para criar um código executável binário compilado
  • É usado por navegadores da web para formatar e exibir uma página da web com a ajuda de dados analisados ​​de JavaScript, HTML, CSS
  • Um analisador léxico separado ajuda a construir um processador especializado e potencialmente mais eficiente para a tarefa

Desvantagem da análise lexical

  • Você precisa gastar um tempo significativo lendo o programa fonte e particionando-o na forma de tokens
  • Algumas expressões regulares são bastante difíceis de entender em comparação com as regras PEG ou EBNF
  • Mais esforço é necessário para desenvolver e depurar o lexer e suas descrições de token
  • É necessária sobrecarga adicional de tempo de execução para gerar as tabelas lexer e construir os tokens

Perguntas Frequentes

Ferramentas populares incluem o Lex e sua versão de código aberto, o Flex. Você escreve padrões de tokens como expressões regulares, e a ferramenta gera automaticamente o código-fonte do analisador léxico, evitando que você precise codificar o analisador léxico manualmente.

Um analisador léxico define cada token como uma expressão regular e implementa a correspondência usando autômatos finitos. Ele examina os caracteres da esquerda para a direita e emite a correspondência válida mais longa como o próximo token.

Uma tabela de símbolos é uma estrutura de dados onde o analisador léxico armazena identificadores e seus atributos, como nome e tipo. Later as fases do compilador leem e atualizam para track variáveis ​​e funções.

A IA pode gerar expressões regulares de tokens a partir de exemplos, identificar ambiguidades ou sobreposições.ping padrões e explicar erros do analisador léxico. Isso acelera a criação e a depuração de um analisador léxico para uma nova linguagem ou DSL.

Não exatamente. Os compiladores usam regras fixas e autômatos finitos para tokenizar o código, enquanto os modelos de IA dividem o texto em tokens estatísticos de subpalavras. Os objetivos são diferentes: análise sintática precisa versus compreensão flexível da linguagem.

Resuma esta postagem com: