Análise lexical em projeto de compilador com exemplo

Índice:

Anonim

O que é análise lexical?

ANÁLISE LÉXICA é a primeira fase do 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. Ele remove qualquer espaço extra ou comentário escrito no código-fonte.

Os programas que realizam análises lexicais são chamados de analisadores lexicais ou lexers. Um lexer contém um tokenizer ou scanner. Se o analisador léxico detectar que o token é inválido, ele gerará um erro. Ele lê os fluxos de caracteres do código-fonte, verifica os tokens legais e passa os dados para o analisador de sintaxe quando necessário.

Exemplo

How Pleasant Is The Weather?

Veja este exemplo; Aqui, podemos reconhecer facilmente que existem cinco palavras How Pleasant, The, Weather, Is. Isso é muito natural para nós, pois podemos reconhecer os separadores, espaços em branco e o símbolo de pontuação.

 HowPl easantIs Th ewe ather?

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

Neste tutorial, você aprenderá

  • Terminologias básicas:
  • Arquitetura do Lexical Analyzer: Como os tokens são reconhecidos
  • Funções do analisador lexical
  • Erros Lexicais
  • Recuperação de erros no Lexical Analyzer
  • Lexical Analyzer vs. Parser
  • Por que separar Lexical e Parser?
  • Vantagens da análise lexical
  • Desvantagem da análise lexical

Terminologias Básicas

O que é um lexema?

Um lexema é uma sequência de caracteres incluída no programa de origem de acordo com o padrão de correspondência de um token. Não é nada além de uma instância de um token.

O que é um token?

O token é uma sequência de caracteres que representa uma unidade de informação no programa de origem.

O que é padrão?

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

Arquitetura do Lexical Analyzer: 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 varre todo o código-fonte do programa. Ele identifica cada token um por um. Scanners são geralmente implementados para produzir tokens apenas quando solicitados por um analisador. É assim que funciona-

  1. "Obter o próximo token" é um comando enviado do analisador para o analisador léxico.
  2. Ao receber este comando, o analisador léxico varre a entrada até encontrar o próximo token.
  3. Ele retorna o token para o 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 seguintes tarefas:

  • Ajuda a identificar o token na tabela de símbolos
  • Remove espaços em branco e comentários do programa de origem
  • Correlaciona mensagens de erro com o programa de origem
  • Ajuda a expandir as macros se for encontrado no programa fonte
  • 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 para o Lexical Analyzer

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Exemplos de tokens criados

Lexeme Símbolo
int Palavra-chave
máximo Identificador
( Operador
int Palavra-chave
x Identificador
, Operador
int Palavra-chave
Y Identificador
) Operador
{ Operador
Se Palavra-chave

Exemplos de Nontokens

Modelo Exemplos
Comente // Isso vai comparar 2 números
Directiva do pré-processador #include
Directiva do pré-processador # define NUMS 8,9
Macro NUMS
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 léxico:

  • Erros léxicos 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 erro mais comuns:

  • Remove um caractere da entrada restante
  • No modo de 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 personagem por outro
  • Transpor dois caracteres seriais

Lexical Analyzer vs. Parser

Analisador Lexical Parser
Programa de entrada de digitalização Realizar análise de sintaxe
Identificar Tokens Crie uma representação abstrata do código
Inserir tokens na tabela de símbolos Atualizar entradas da tabela de símbolos
Ele 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 a análise 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 requer 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 binário executável compilado
  • É usado por navegadores da web para formatar e exibir uma página da web com a ajuda de dados analisados ​​de JavsScript, HTML, CSS
  • Um analisador léxico separado ajuda você 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 de origem 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
  • É necessário mais esforço para desenvolver e depurar o lexer e suas descrições de token
  • Sobrecarga adicional de tempo de execução é necessária para gerar as tabelas lexer e construir os tokens

Resumo

  • A análise léxica é a primeira fase no projeto do compilador
  • Um lexema é uma sequência de caracteres que são 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 qualquer token válido é um erro léxico
  • Remove um caractere da entrada restante é um método de recuperação de erro útil
  • O Lexical Analyzer verifica o programa de entrada enquanto o analisador realiza a análise de sintaxe
  • Facilita o processo de análise lexical e a análise 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 de tempo de execução adicional para gerar as tabelas lexer e construir os tokens