Análise Léxica Renato Ferreira Sumário Definição informal de Análise Léxica Identifica tokens numa string de entrada Alguns detalhes Lookahead Ambiguidade Especificação de Analisadores Léxicos Expressões Regulares Exemplos 1
O que queremos fazer: Análise Léxica Lembrando que internamente: if (i == j) z = 0; else z = 1; \tif (i == j)\n\t\tz = 0;\n\telse\n\t\tz = 1;\n Particionar o string em substrings substrings são tokens Definição de Token Uma categoria sintática Em português: Adjetivo, substantivo, verbo, Em linguagem de programação: Identificador, Literal, Palavra reservada, 2
Tokens Correspondem a conjuntos de strings Identificadores: strings com letras e algarismos, iniciado com letra Literais: inteiros: um string não vazio de algarismos, que pode ser iniciado com algarismo ou + ou float: 6.02E 23 Palavras reservadas: while, if, begin Para que servem os tokens Classificam os substrings de acordo com o papel dele na sentença A saída da análise léxica é uma sequencia de tokens que é a entrada para o analisador sintático O analisador sintático utiliza as distinções Um identificador é tratado diferentemente de uma palavra reservada 3
Projetando um Analisador Léxico: Passo 1 Definir um conjunto finito de tokens Tokens descrevem todos os itens de interesse A escolha dos tokens depende da linguagem e do projeto do analisador sintático Lembrando que: Exemplo \tif (i == j)\n\t\tz = 0;\n\telse\n\t\tz = 1;\n Tokens úteis para a expressão acima seriam: Inteiro, Palavra Reservada (keywork), Identificador ( ) = == ; Espaço em branco (whitespace) 4
Projetando um Analisador Léxico: Passo 2 Descrever as strings que pertencem a cada token Lembrando: Identificador: strings de letras e algarismos começando com letras Inteiro: uma sequência não vazia de algarismos que pode se iniciar com + ou com. Keyword: else, if, begin A implementação A implementação precisa realizar duas tarefas 1. Reconhecer os substrings correspondentes a cada token 2. Retornar o valor ou o lexema do token o lexema é o substring encontrado na entrada 5
Exemplo \tif (i == j)\n\t\tz = 0;\n\telse\n\t\tz = 1;\n if ( id == id ) id = int ; else id = int ; i j z 0 z 1 Descarta caracteres desinteressantes Separadores, comentários Sem função para o analisador sintático É tão fácil assim? Alguns aspectos Não exatamente A história nos mostra 6
Análise Léxica em FORTRAN Em fortran, separadores são não significativos Por exemplo: VAR1 éo mesmo que VA R1 Considere: DO 5 I = 1,25 DO 5 I = 1.25 A motivação é pela imprecisão da tecnologia cartões perfurados Lookahead Objetivo é ler os caracteres da entrada, reconhecendo os tokens na medida que aparecem Frequentemente é preciso ler o próximo caracter pra saber onde um token termina e o próximo começa i versus if = versus == 7
Análise Léxica em PL/I Em PL/I, os comandos da linguagem não são palavras reservadas IF ELSE THEN THEN = ELSE; ELSE ELSE = THEN Declarações DECLARE (ARG1,, ARGN) Não há como saber se o DECLARE éum comando, ou uma variável do tipo array até depois do ). Lookahead arbitrário Mais idiosincrasias históricas ao longo do curso Análise Léxica em C++ Sim, os problemas continuam Sintaxe de templates Foo<Bar> Sintaxe de stream cin >> var; Aninhamento de templates: Foo<Bar<Bazz>> 8
Resumindo O objetivo do analisador léxico é: Particionar o string de entrada emlexemas Identificar o token de cada lexema Leitura direta Esquerda para a direita lookahead pode ser necessário Ainda precisamos de: O que falta? Um mecanismo para descrever os lexemas de cada token Um mecanismo de resolver ambiguidades Estamos falando if ou de duas variáveis i e f? == ou = e = 9
Linguagens Regulares Existem vários formalismos para especificar tokens Linguagens regulares é a mais popular Teoria simples e útil Fácil compreensão Implementação eficiente Definição Linguagens Seja S um conjunto de caracteres. Uma linguagem sobre S éum conjunto de strings formados a partir de S 10
Exemplos Considerando o alfabeto como sendo o alfabeto de português Linguagem: Português Considerando o alfabeto o conjunto ASCII Linguagem: C Nem todas as sequencias de letras formam sentenças em português Perceba que ASCII é diferente do conjunto de letras da lingua portuguesa Notação Linguagens são conjuntos de strings Precisamos de alguma notação para definir os strings do conjunto que queremos A notação padrão para especificar linguagens regulares são expressões regulares 11