O Papel do Analisador Lexico A analise lexica e a primeira fase de um compilador e tem por objetivo fazer a leitura do programa fonte, caracter a caracter, e traduzi-lo para uma sequencia de símbolos lexicos denominados tokens, os quais sao utilizados pelo analisador sintatico. Exemplos: de tokens sao os identiicadores, palavras reservadas, operadores da linguagem, etc. A interacao entre analise lexica e sintatica e normalmente implementada fazendo-se com que o analisador lexico seja uma subrotina ou co-rotina do parser. Ao receber do parser um comando do tipo \obter proximo token", o analisador lexico lê os caracteres de entrada ate que possa identiicar o proximo token. Um analisador lexico classico pode ser entendido como um sistema de estados initos e utiliza-se um automato inito para sua implementaçao. As principais características desse automato:alfabeto de entrada sao os caracteres pertencentes ao arquivo fonte ² Cada estado inal reconhece uma classe especíica de tokens da linguagem fonte e denominado erro lexico durante o processo de analise lexica) que impossibilite a interpretaçao de um token. Uma lista de tokens e o resultado do processo de analise lexica, caso nenhum erro lexico tenha sido encontrado. Porque efetuar analise lexica? Simpliicaçao de Projeto e mais simples implementar dois analisadores distintos para tarefas distintas do que um analisador sintatico que faça todo trabalho de forma uniicada; Melhor Eiciencia a analise lexica e potencialmente mais lenta que a sintatica (pois efetua leitura de caracteres em disco). Tecnicas de buferizaçao de leitura podem acelerar signiicativamente este processo; Portabilidade as peculiaridades do alfabeto de entrada de cada linguagem podem ser tratadas exclusivamente pelo scanner. Tokens, Padroes e Lexemas Um token e um símbolo terminal da gramatica da linguagem fonte sob analise. Existem diversas cadeias de caracteres para as quais o mesmo token e gerado. Essas cadeias respeitam um determinado padrao ou regra associada a esse token. Um lexema e um conjunto de caracteres que e reconhecido pelo padrao de um determinado token. Exemplo: const pi = 3.14159; a subcadeia pi e um lexema para o token \identiicador", pois respeita o padrao para os identiicadores (letra)(letra j digito). Atributos para os tokens Um token e comumente representado como um par [LEXEMA, CLASSE], onde a classe indica qual foi o padrao utilizado para reconhecer o lexema.
Outras informaçoes adicionais podem ser incorporadas µa descriçao do token, de acordo com as necessidades das fases subseqäuentes, como por exemplo, numero da linha e coluna onde o token foi reconhecido no arquivo fonte e numero de caracteres lidos ate o reconhecimento, seria exemplos de informaçoes adicionais uteis caso um erro lexico seja detectado. 3.2 Buferizaçao de Entrada Conforme ja visto, o processo de analise lexica e normalmente realizado efetuando-se uma leitura do arquivo fonte de entrada, caracter a caracter, o que resulta em um processo signiicativamente lento. Existem 3 alternativas de implementaçao de analisadores lexicos (listados em ordem crescente de complexidade de implementaçao): 1. Usar ferramentas de construçao de analisadores lexicos (como o Lex), atraves de expressoes regulares; 2. Escrever um programa numa linguagem de programaçao convencional, usando seus recursos de entrada e saída; 3. Escrever um programa numa linguagem de montagem e manipular explicitamente a entrada e a saída. Alguns aspectos a serem considerados no projeto de implementaçao de um scanner: Bu er Em muitas linguagens, existem momentos que o analisador lexico precisa examinar varios caracteres µa frente do lexema, antes que seja anunciado um reconhecimento. Os caracteres que foram lidos e nao foram \aproveitados" no lexema sob analise, sao entao, devolvidos ao uxo de entrada para que possam ser lidos novamente na analise de outro lexema posterior. Assim sendo, um bu er de entrada que acumula varios caracteres e criado, conforme a igura 3.2. O processo de analise lexica e realizado sobre este bu er. Os tokens que foram reconhecidos sao eliminados do bu er e novos caracteres sao adicionados a ele ate que todo o arquivo fonte seja lido e analisado. Especiicaçao e Reconhecimento de Tokens A especiicaçao de tokens e feita atraves de expressoes regulares e reconhecida atraves dos
reconhecedores de gramaticas regulares chamados de automatos initos. Esta gramatica e capaz de reconhecer numeros inteiros como 1, 100, 1234, etc. e tambem numeros reais expressos ou nao por notaçao exponencial como: 1.5, 10.34, 1.3e15, 1E+2; porem, e incapaz de reconhecer numeros como 1., sem a parte fracionaria. A igura 3.3 reconhece esta gramatica, enquanto que a igura 3.4 reconhece identiicadores simples. O reconhecimento de strings e apresentado na igura 3.5, onde \caracteres validos" representa o alfabeto valido para strings, geralmente letras, numeros, espaços e sinais ortograicos. Erros Lexicos 1. `Caracter Invalido' : uso de um caracter (simbolo) de entrada (arquivo fonte) que nao pertença ao alfabeto da linguagem. 2. `Delimitador Nao Balanceado': deiniçao de uma cadeia literal (ou constante caracter) sem o correto balanceamento das aspas. Exemplo: \Entrada de Dados 3. `Numero Real Invalido' : deiniçao incorreta ou incompleta de um numero real. Exemplos: 1., 1.0e3,.8, 1e+ Erros Lexicos 1. `Caracter Invalido' : uso de um caracter (simbolo) de entrada (arquivo fonte) que nao pertença ao alfabeto da linguagem. Exemplo: # ou % 2. `Delimitador Nao Balanceado': deiniçao de uma cadeia literal (ou constante caracter) sem o correto balanceamento das aspas. Exemplo: \Entrada de Dados 3. `Numero Real Invalido' : deiniçao incorreta ou incompleta de um numero real. Exemplos: 1., 1.0e3,.8, 1e+ Analise Sintatica Ascendente - BOTTOM UP A criaçao da arvore gramatical e realizada no sentido folhas! raiz, ou seja, geraçao de sentenças e feita atraves do processo de empilhar e reduzir. A ideia e \reduzir" a sentença original ate o axioma da gramatica atraves de sucessivas substituiçoes por nao-terminais. Exemplo: S! aabe A! Abc j b B! d Veriicar se a sentença abbcde pode ser reduzida pela gramatica: Analise Sintatica Descendente - TOP DOWN
A analise sintatica top-down pode ser vista como uma tentativa de se encontrar uma derivaçao mais µa esquerda para uma cadeia de entrada, ou ainda, como de se construir a arvore gramatical a partir da raiz em direçao µas folhas. O processo de analise pode ser feito de forma recursiva ou nao, onde a forma recursiva pode ser realizada com ou sem retrocesso (backtracking), dependendo das regras de produçao gramatica. Analise Sintatica Recursiva com Retrocesso A construçao da arvore e feita a partir da raiz, expandindo sempre o nao-terminal mais µa esquerda primeiro. Quando existe mais de uma regra de produçao para o nao-terminal a ser expandido, a opçao escolhida e funçao do símbolo corrente na ita de entrada (token sob analise). Se o token nao deine a produçao a ser usada, entao todas as alternativas vao ser tentadas ate que se obtenha sucesso.
Please download full document at www.docfoc.com Thanks