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

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 uma representação abstrata 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

Resumo

  • A análise lexical é a primeira fase no projeto do compilador
  • Lexemes e Tokens são a sequência de caracteres incluídos no programa fonte de acordo com o padrão de correspondência de um token
  • O analisador léxico é implementado para escanear todo o código-fonte do programa
  • O analisador léxico ajuda a identificar o token na tabela de símbolos
  • Uma sequência de caracteres que não é possível digitalizar em nenhum token válido é um erro léxico
  • Remove um caractere da entrada restante é útil Método de recuperação de erros
  • O Lexical Analyzer verifica o programa de entrada enquanto o analisador executa a análise de sintaxe
  • Facilita o processo de análise lexical e de sintaxe, eliminando tokens indesejados
  • O analisador léxico é usado por navegadores da web para formatar e exibir uma página da web com a ajuda de dados analisados ​​​​de JavsScript, HTML, CSS
  • A maior desvantagem de usar o analisador Lexical é que ele precisa de sobrecarga adicional de tempo de execução para gerar as tabelas lexer e construir os tokens