Análise Léxica Correção exercícios aula passada Atualizar material aula passada Introdução É também conhecida como scanner ou leitura e é a primeira fase de um processo de compilação. Sua função é fazer a leitura do programa fonte caractere a caractere e traduzi-lo para uma sequencia de conhecida como símbolos léxicos ou sequencia de tokens. Os caracteres são agrupados em lexemas e produzem a sequencia de tokens A sequencia de tokens é enviada para a próxima fase da compilação a análise sintática. O analisador léxico deve interagir com a tabela de símbolos e inserir informações dos tokens, no caso os identificadores. Introdução Na implementação a análise léxica normalmente é uma sub-rotina da analise sintática. A implementação da análise léxica pode ser dividida em duas etapas: Escandimento: que varre o programa fonte removendo os comentários e compactando os espaços em branco. Analise léxica: produz a sequencia de tokens. Introdução Termos relacionados a análise léxica: Token: é uma par constituído de um nome e um valor. O nome de um token é um símbolo que representa uma unidade léxica. Ex: Palavras reservadas, identificadores, etc. Padrão: é a forma que os lexemas de um token podem assumir. Ex: Palavras reservadas é a sequência de caracteres da palavra reservada, no caso de identificadores são os caracteres que formam nomes das variáveis, funções. Lexema: é uma sequencia de caracteres reconhecidos por algum padrão de um token. Tabela exemplo de termos Token const Padrão Sequência das Lexema Descrição const Palavra reservada while, While, WHILE Palavra reservada If, IF, iF, If Palavra reservada palavras c, o, n, s, t. while Sequência das palavras w, h, i, l, e if Sequência das palavras i, f comparadores <, >, <=, >=, ==, != ==, != numero Dígitos numéricos 0.6, 18, 0.009 Constante numérica literal Caracteres entre “” “Olá Mundo” Constante literal id Nomes de variáveis, nomeCliente, descricaoProduto, Nome de variável, nome de funções, parâmetros de calcularPreco() função funções. atribuicao = = Comando de atribuição delimitador {, }, [, ] {, },[, ] Delimitadores de início e fim Identificação de termos printf(“Total = %d\n”, score) printf e score são lexemas que casão com o padrão id e id é um token. “Total = %d\n” é um lexema que casa com o padrão literal, e literal é um token. const PI = 3.1416 const é um token que casa com o padrão const e também é um lexema. PI é um lexema que casa com o padrão id e id é um token. = é um lexema que casa com o padrão do token atribuicao. 3.1416 é um lexema que casa com o padrão do token numero. Tokens Também conhecidos como símbolos léxicos, são unidade básicas do texto de um programa. Cada token é representado por ter unidade de informações básicas. Classe do token: é o tipo de token reconhecido. Ex: identificadores, constantes numéricas, cadeias de caracteres, palavras reservadas, operadores e separadores. Valor do token: depende da classe do token, Ex: caso seja uma constante inteira representa o valor inteiro, no caso de identificadores um apontador para a tabela de símbolos. Posição do token: Indica a linha e a coluna no texto onde ocorreu o token. É utilizado principalmente para indicar o local do erro. Tokens Os tokens são divididos em dois grupos. Tokens simples: São tokens que não tem valor associado pois a classe do token já a descreve. Ex: palavras reservadas, operadores, delimitadores. Tokens com argumento: são tokens que tem valor associado e corresponde a elementos da linguagem definidos pelo programador. Ex: identificadores, constantes numéricas. Tokens Estrutura de um token. <nome-token, valor-atributo> Nome do token: corresponde a classe do token. Valor atributo: corresponde a um valor qualquer a ser atribuído ao valor do token, Exemplo 01 – sequência de tokens Código while indice < 10 do indice:= total + índice; Sequência de tokens <while,><id,7> <<,><numero,10><do,><id,7><:=,><id,12><+,><id, 7><;,> Exemplo 02 – sequência de tokens Código position = initial + rate * 60 Sequência de tokens <id, 1> <=, > <id, 2> <+, > <id, 3> <*, > <numero, 4> Exemplo 03 – sequência de tokens Código a[index] = 4 + 2 Sequência de tokens <id, 1> <[,> <id, 2> <],> <=,> <numero, 3> <+,> <numero, 4> Exemplo 04 – decomposição Código total = entrada * saida() + 2 Sequência de tokens <id, 15> <=, > <id, 20> <*,> <id,30> <+, > <numero, 2> Exemplo 04 – decomposição Para o token temos: <id, 15> : apontador 15 da tabela de símbolos e token id. <=, > operador de atribuição, sem necessidade de um valor para o atributo. <id, 20> : apontador 20 da tabela de símbolos e token id. <*, > : operador de multiplicação, sem necessidade de um valor para o atributo. <id,30> : apontador 20 da tabela de símbolos e token id. <+, > : operador de soma, sem necessidade de um valor para o atributo. <numero, 2> : token numero, com valor para o atributo 2 indicado o valor do numero (constante numérica). Tabela de símbolos É uma estrutura de dados que gerada pelo compilador com o objetivo de armazenar informação sobre identificadores e outros nomes usado no programa fonte. Exemplo: Variáveis; parâmetros de funções; procedimentos. Informações: tipo de dados(inteiro, string); escopo de visibilidade; limite de parâmetros; tamanho da variável. A tabela de símbolos normalmente é uma estrutura de tabela hash, árvores binárias ou listas lineares. Nessa tabela pode ter informações sobre a posição(coluna, linha) do identificado no programa fonte. As informações são usadas em todo o processo de compilação. Erros léxicos A análise léxica é muito prematura para identificar erros de compilação, veja o exemplo abaixo. fi (a == “123”) ... O analisador léxico não conseguira identificar o erro da instrução listada acima. Isso só pode ser feita na analise sintática. Uma estratégia utilizada para a recuperação de erros léxicos e a modalidade pânico, que remove caracteres de entrada até encontrar um token bem formado (AHO, 2008). Remover caracteres estranhos. Inserir caracteres ausentes. Substituir caracteres corretos por incorretos. Exercícios e Prática