Projeto de Compilador - Análise Lexical

A análise lexical é a primeira fase de um compilador. Ele obtém o código-fonte modificado de pré-processadores de linguagem que são escritos na forma de frases. O analisador léxico divide essas sintaxes em uma série de tokens, removendo qualquer espaço em branco ou comentários no código-fonte.

Se o analisador léxico encontrar um token inválido, ele gerará um erro. O analisador léxico trabalha em estreita colaboração com o analisador de sintaxe. 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.

Tokens

Os lexemes são considerados uma sequência de caracteres (alfanuméricos) em um token. Existem algumas regras predefinidas para que cada lexema seja identificado como um token válido. Essas regras são definidas por regras gramaticais, por meio de um padrão. Um padrão explica o que pode ser um token, e esses padrões são definidos por meio de expressões regulares.

Em linguagem de programação, palavras-chave, constantes, identificadores, strings, números, operadores e símbolos de pontuação podem ser considerados tokens.

Por exemplo, na linguagem C, a linha de declaração da variável

int value = 100;

contém os tokens:

int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).

Especificações de tokens

Vamos entender como a teoria da linguagem assume os seguintes termos:

Alfabetos

Qualquer conjunto finito de símbolos {0,1} é um conjunto de alfabetos binários, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} é um conjunto de alfabetos hexadecimais, {az, AZ} é um conjunto de alfabetos do idioma inglês.

Cordas

Qualquer sequência finita de alfabetos é chamada de string. O comprimento da string é o número total de ocorrências de alfabetos, por exemplo, o comprimento do string tutorialspoint é 14 e é denotado por | tutorialspoint | = 14. Uma string sem alfabetos, ou seja, uma string de comprimento zero é conhecida como string vazia e é denotada por ε (épsilon).

Símbolos Especiais

Uma linguagem típica de alto nível contém os seguintes símbolos: -

Símbolos Aritméticos Adição (+), Subtração (-), Módulo (%), Multiplicação (*), Divisão (/)
Pontuação Vírgula (,), Ponto e vírgula (;), Ponto (.), Seta (->)
Tarefa =
Seguimento especial + =, / =, * =, - =
Comparação ==,! =, <, <=,>,> =
Pré-processador #
Especificador de localização E
Lógico &, &&, |, ||,!
Operador de turno >>, >>>, <<, <<<

Língua

Uma linguagem é considerada um conjunto finito de strings sobre um conjunto finito de alfabetos. As linguagens de computador são consideradas conjuntos finitos e operações com conjuntos matemáticos podem ser realizadas nelas. Linguagens finitas podem ser descritas por meio de expressões regulares.

Regra de correspondência mais longa

Quando o analisador léxico lê o código-fonte, ele verifica o código letra por letra; e quando encontra um espaço em branco, símbolo de operador ou símbolos especiais, decide que uma palavra está completa.

For example:

int intvalue;

Durante a varredura de ambos os lexemas até 'int', o analisador léxico não pode determinar se é uma palavra-chave int ou as iniciais do valor int do identificador.

A regra de correspondência mais longa afirma que o lexema verificado deve ser determinado com base na correspondência mais longa entre todos os tokens disponíveis.

O analisador léxico também segue rule priorityonde uma palavra reservada, por exemplo, uma palavra-chave, de um idioma tem prioridade sobre a entrada do usuário. Ou seja, se o analisador léxico encontrar um lexema que corresponda a qualquer palavra reservada existente, ele deve gerar um erro.