Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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.
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}.
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
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 - 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