Você está na página 1de 31

Anlise Lxica

Primeira fase de um compilador Objetivo: ler os caracteres de entrada e produzir como saida uma seqncia de tokens que o parser vai usar para anlise sinttica.

Analisador lxico
Programa fonte
token

Analisador lxico
getNextToken

parser

tabela de smbolos

Construindo um analisador lxico


Especificar tokens e lexemas da linguagem Implementar (ou gerar atravs de ferramenta) o analisador a partir da especificao

Outras possveis tarefas do analisador lxico


Tratamento de espaos em branco e comentrios Tratamento de mensagens de erro (localizao/impresso) Tratamento de macros

Organizao
s vezes dividido em
scanning remoo de comentrios e espaos em branco duplicados Anlise lxica propriamente dita parte mais complexa, onde o scanner produz a sequencia de tokens

Analisador lxico x Parser


Design mais simples misturar anlise lxica com sinttica torna o parser bem mais complicado Eficincia separao possibilita construir processadores lxicos e sintticos mais eficientes. Portabilidade variaes de dispositivos podem ficar restritas ao analisador lxico.

Tokens, Padres e Lexemas


Tokens: par com o nome do token e atributos opcionais. Padro: descrio da forma dos lexemas que um token pode ter Lexema: sequencia de caracteres que casam com o padro de um token. Uma instncia de um token.

Tokens, padres e lexemas


Existem conjuntos de strings na entrada que geram o mesmo token. Elas so descritas por padres associados ao token O padro casa cada string do conjunto Um lexema uma seqncia de caracteres do programa fonte que casa com um padro de um token. Tokens so smbolos terminais da linguagem.

Tokens, padres e lexemas


Tokens normalmente so Palavras-chave, operadores, identificadores, constantes, strings literais e smbolos de pontuao, como parenteses e vrgulas. Padres normalmente so especificados por expresses regulares. Variaes de expresses regulares so usadas em vrios outros contextos:
Linguagens de programao: sed, awk, perl Shells de sistemas operacionais: sh, csh, command

Tokens, padres e lexemas


token if else comp id num literal exemplo if else <,<=,=,<>,> pi, count, D2 3.1416, 0, 6.02E23 core dumped descrio Caracteres i, f Caracteres e, l, s, e < ou <= ou Letra seguida de letras e/ou dgitos Constante numrica Quaisquer caracteres entre exceto e

Dificuldades na implementao de um analisador lxico


Linguagens que requerem determinados construtores em posies (colunas) especficas da linha de entrada (e.g. Fortran). Tratamento de espaos em branco. Ausncia de palavras reservadas.

Dificuldades - Exemplos
Fortran: DO 5 I = 1.25 DO 5 I = 1,25 IF (I,J) = 3 PL/I: IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;

Atributos de um token
Ao reconhecer um token num relevante saber se seu valor zero ou um, por exemplo. Geralmente associado a um token existe um atributo. Uso da tabela de smbolos para guardar informaes auxiliares sobre tokens.

Atributos de um token - Exemplo


E = M * C ** 2 <id, apontador p/posio de E na tabela de smbolos> <assign_op,> <id, apontador p/posio de M na tabela de smbolos> <mult_op,> <id, apontador p/posio de C na tabela de smbolos> <exp_op,> <num, valor 2>

Erros de anlise lxica


Relativamente raros. Geralmente o analisador tenta recuperar do erro, ignorando caracteres.

Opes de Implementao de um analisador lxico


Uso de um gerador de analisadores lxicos, como lex ou flex, que produzem um analisador lxico a partir de uma especificao em expresses regulares. Escrever o analisador em uma linguagem de programao convencional, usando as facilidades de E/S da linguagem para ler a entrada. Escrever o analisador lxico em assembler, gerenciando explicitamente a leitura. Uso de bufferizao da entrada importante para a eficincia de um analisador lxico!

Especificao de Tokens
Baseado em Teoria de Linguagens: Alfabetos, strings e linguagens Operaes sobre linguagens Exemplo: seja L o conjunto (de letras) {A,B,,Z,a,b,,z} e D o conjunto (de dgitos) {0,1,,9}.

Operaes sobre linguagens Exemplo


LD LD conjunto composto de letras e dgitos conjunto de strings compostas de letras seguidas de dgitos L4 conjunto de todas as strings com 4 letras L* conjunto de todas as strings de letras, inclusive a string vazia I D+ conjunto de strings de um ou mais dgitos. L(L D)*

Operadores sobre linguagens


Operao Unio de L e M LM Concatenao de L e M, LM Fechamento de Kleene de L, L* Fechamento positivo de L, L+ Definio L M = {s | s L ou s M } { st | s L e t M } L* = i=0,gLi L+ = i=1,gLi

Expresses regulares
Permitem a definio de linguagens a partir de definies de expresses regulares mais simples. Exemplos:
Identificadores em pascal: letter (letter | digit) * a|b (a | b) (a | b) a* (a|b)* a | a*b

Propriedades algbricas
| comutativa e associativa Concatenao associativa Concatenao distribui sobre | I o elemento identidade da concatenao * idempotente (r** = r*)

Exemplo - Pascal
letter JA | B | | Z | a | b | | z digit J0 | 1 | | 9 id Jletter (letter | digit)* digits Jdigit digit* opt_fraction J. digits | I opt_exponent J(E (+|-|I) digits) | I num Jdigits opt_fraction opt_exponent

Abreviaes
+ ? [] uma ou mais instncias. Zero ou uma instncia classes de caracteres, ex: [A-Za-z][A-Za-z0-9]*

Reconhecimento de Tokens
Gerar diagramas de transio e depois implementar uma mquina de estados. Implentar autmatos finitos determinsticos e nodeterminsticos.

Lex
Linguagem (e compilador) para especificar analisadores lxicos.

Organizao
Programa fonte lex.l lex.yy.c Compilador lex (lex ou flex) C compiler Lex.yy.c

a.out

Entrada

a.out

Sequencia de tokens

Programas Lex - estrutura


Declaraes variveis, constantes, defs.regulares %% regras de traduo expr.regulares e aes em C Padro { Ao } %% procedimentos auxiliares

Lex - exemplo
%{ /* definio de constantes LT, LE, EQ, NE,*/ %} delim [ \t\n] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)? (E[+\-]?{digit}+)? %%

Lex exemplo (cont.)


{ws} if then else {id} {number} < <= %% {/* no action and no return */} {return(IF);} {return(THEN);} {return(ELSE);} {yylval=install_id();return(ID);} {yylval=install_num(); return(NUMBER);} {yylval = LT; return(RELOP);} {yylval = LE; return(RELOP);}

Lex exemplo (cont.)


int install_id() { Copia lexema para a tabela de smbolos. Primeiro caracter do lexema apontado pela varivel yytext e o comprimento definido pela varivel yyleng. } Int install_num() { }

Lex - implementao
Transforma o programa de entrada em um programa em C que implementa um Autmato Finito NFA Nodeterministic Finite Automata DFA Deterministic Finite Automata Reconhecem a mesma linguagem, linguagens regulares, expressas por expresses regulares

Você também pode gostar