ces-41 compiladores capítulo iv complementos de análise léxica

18
CES-41 CES-41 COMPILADORES COMPILADORES Capítulo IV Capítulo IV Complementos de Análise Complementos de Análise Léxica Léxica

Upload: internet

Post on 17-Apr-2015

107 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

CES-41 CES-41 COMPILADORESCOMPILADORES

Capítulo IVCapítulo IV

Complementos de Análise Complementos de Análise LéxicaLéxica

Page 2: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Capítulo IV – Capítulo IV – Complementos de Análise Complementos de Análise

LéxicaLéxica

4.1 – Interface entre programa-fonte e 4.1 – Interface entre programa-fonte e compiladorcompilador

4.2 – Bufferização4.2 – Bufferização do programado programa

4.3 – Observação de átomos seguintes4.3 – Observação de átomos seguintes

4.4 – Lex para observar átomos 4.4 – Lex para observar átomos seguintesseguintes

Page 3: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

4.1 – Interface entre 4.1 – Interface entre Programa-Fonte e Programa-Fonte e

CompiladorCompilador Os principais conceitos sobre Os principais conceitos sobre análise léxicaanálise léxica

foram introduzidos no foram introduzidos no capítulo anteriorcapítulo anterior::

– Formação e classificação de átomos Formação e classificação de átomos

– Diagrama de transições léxicasDiagrama de transições léxicas

– Ferramenta do analisador sintáticoFerramenta do analisador sintático

Page 4: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Sendo a Sendo a interfaceinterface entre programa-fonte e entre programa-fonte e compilador, pode executar algumas compilador, pode executar algumas tarefas tarefas secundáriassecundárias::

Pular Pular comentárioscomentários, , espaçosespaços em branco, em branco, tabulaçõestabulações, , new-linesnew-lines, etc (vistos em , etc (vistos em diagramas de transições e em diagramas de transições e em FlexFlex))

Contar o Contar o número de linhas lidasnúmero de linhas lidas, , possibilitando a inclusão do número da linha possibilitando a inclusão do número da linha em em mensagens de erromensagens de erro

Gerenciar o controle das linhas e sua Gerenciar o controle das linhas e sua continuaçãocontinuação, nos programas escritos em , nos programas escritos em linguagens em que a linguagens em que a divisão em linhasdivisão em linhas é é relevante (Fortran, Cobol)relevante (Fortran, Cobol)

Page 5: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Exemplo:Exemplo: contagem de linhas no diagrama de contagem de linhas no diagrama de transições léxicas – para a análise sintáticatransições léxicas – para a análise sintática

Page 6: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Exemplo:Exemplo: uma uma linhalinha de programa em de programa em FortranFortran

Caractere na Caractere na coluna 6coluna 6: a linha é : a linha é continuaçãocontinuação da anterior da anterior

Page 7: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

4.2 – Bufferização do 4.2 – Bufferização do ProgramaPrograma

A A complexidadecomplexidade do analisador léxico é do analisador léxico é bem bem menormenor, conceitualmente falando, do que a dos , conceitualmente falando, do que a dos outros componentes de um compiladoroutros componentes de um compilador

No entanto, é nele que o No entanto, é nele que o front-end front-end de um de um compilador consome a compilador consome a maior porçãomaior porção de seu de seu tempotempo

É o componente que lê É o componente que lê caractere por caractere por caracterecaractere do do arquivoarquivo do programa do programa

Page 8: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

A A velocidadevelocidade do analisador léxico é do analisador léxico é crucialcrucial no no projeto de um compiladorprojeto de um compilador

Os Os caracterescaracteres podem ser podem ser lidos em blocoslidos em blocos (1 (1 ou 4 Kbytes), evitando-se a taxa de ou 4 Kbytes), evitando-se a taxa de um acessoum acesso ao disco ao disco por caracterepor caractere lido lido

Tais Tais blocosblocos podem ser podem ser armazenadosarmazenados um por um por vez num vez num bufferbuffer (string) e a análise de cada (string) e a análise de cada caractere pode ser feita nelecaractere pode ser feita nele

Essa Essa bufferizaçãobufferização pode ficar pode ficar encapsuladaencapsulada numa função; no caso do numa função; no caso do Mini-Pascal,Mini-Pascal, isso isso poderia acontecer na função poderia acontecer na função NovoCaracNovoCarac

Page 9: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

4.3 – Observação de Átomos 4.3 – Observação de Átomos SeguintesSeguintes

Algumas linguagens requerem, para a Algumas linguagens requerem, para a formaçãoformação e e classificaçãoclassificação de um átomo, a de um átomo, a observação de observação de átomos que o seguemátomos que o seguem, dentro , dentro do programado programa

Em Em FortranFortran, espaços em branco são , espaços em branco são eliminadoseliminados durante o pré-processamento, durante o pré-processamento, dificultandodificultando a classificação dos átomos a classificação dos átomos

Page 10: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Exemplo:Exemplo: Em Em FortranFortran, os comandos, os comandos

Os átomos de cada comando são:Os átomos de cada comando são:

1º) 1º) DO5I=1.25DO5I=1.25: (ID, DO5I), (ATRIB), (CTREAL, : (ID, DO5I), (ATRIB), (CTREAL, 1.25)1.25)

2º) 2º) DO5I=1,25DO5I=1,25: (DO), (ROTULO, 5), (ID, I), : (DO), (ROTULO, 5), (ID, I), (ATRIB), (ATRIB),

(CTINT, 1), (VIRG), (CTINT, 25)(CTINT, 1), (VIRG), (CTINT, 25)

Nos dois comandos, até antes da Nos dois comandos, até antes da virgulavirgula ou do ou do pontoponto, nada se pode decidir sobre a , nada se pode decidir sobre a formaçãoformação e e classificaçãoclassificação de todos esses átomos de todos esses átomos

DO 5 I = 1.25DO 5 I = 1.25DO 5 I = 1,25DO 5 I = 1,25

DO5I=1.25 DO5I=1.25 DO5I=1,25DO5I=1,25

são transformados

em

Page 11: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

1º) 1º) DO5I=1.25DO5I=1.25: (ID, DO5I), (ATRIB), (CTREAL, : (ID, DO5I), (ATRIB), (CTREAL, 1.25)1.25)

2º) 2º) DO5I=1,25DO5I=1,25: (DO), (ROTULO, 5), (ID, I), : (DO), (ROTULO, 5), (ID, I), (ATRIB), (ATRIB),

(CTINT, 1), (VIRG), (CTINT, 25)(CTINT, 1), (VIRG), (CTINT, 25)

Os Os átomos formadosátomos formados na tentativa de definição na tentativa de definição de outro deles podem ser colocados numa de outro deles podem ser colocados numa filafila pelo analisador léxico e pelo analisador léxico e entregues um por umentregues um por um, , quando solicitados pelo analisador sintáticoquando solicitados pelo analisador sintático

A função A função NovoAtomoNovoAtomo do Mini-Pascal só deve do Mini-Pascal só deve procurar procurar novos caracteresnovos caracteres, quando a , quando a filafila de de átomos estiver átomos estiver vaziavazia

Page 12: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

4.4 – Lex4.4 – Lex para Observar para Observar Átomos SeguintesÁtomos Seguintes

A linguagem A linguagem LexLex admite uma admite uma expressão expressão regularregular do tipo do tipo

r1 /r2r1 /r2

onde onde r1r1 e e r2r2 são expressões regulares são expressões regulares

Significado:Significado: uma cadeia se uma cadeia se enquadraenquadra em em r1r1 somente se for somente se for seguida de outra cadeiaseguida de outra cadeia que que se enquadre em se enquadre em r2r2

Page 13: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Exemplo:Exemplo: Em Em FortranFortran, para o caso dos , para o caso dos comandoscomandos

DO5I=1.25DO5I=1.25 e e DO5I=1,25DO5I=1,25

A palavra reservada A palavra reservada dodo pode ser pode ser reconhecidareconhecida pela expressão:pela expressão:

do/({letra}|{digito})*=({letra}|{digito})*,do/({letra}|{digito})*=({letra}|{digito})*,

Seja o programa em Seja o programa em Lex Lex a seguir:a seguir:

Page 14: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

%{%{#define #define DOLAR DOLAR 00#define#define IDID 11#define#define NUMNUM 22#define#define DODO 33#define#define VIRGVIRG 44#define#define PONTOPONTO 55#define#define EQEQ 66union {union {char *cadeia; char *cadeia; int valor;} int valor;}

yylval;yylval;%}%}delimdelim [ \t\n][ \t\n]wsws {delim}+{delim}+digdig [0-9][0-9]letrletr [A-Za-z][A-Za-z]numnum {dig}+{dig}+idid {letr}({letr}|{dig})*{letr}({letr}|{dig})*

Page 15: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

%%%%

{ws}{ws} { ;}{ ;}

do/(({letr}|{dig})*=({letr}|{dig})*,)|{ws}do/(({letr}|{dig})*=({letr}|{dig})*,)|{ws}{return DO;}{return DO;}

{id}{id} {yylval.cadeia = yytext; return {yylval.cadeia = yytext; return ID;}ID;}

{num}{num} {yylval.valor = atoi (yytext); {yylval.valor = atoi (yytext);

return NUM;}return NUM;}

"=""=" {return EQ;}{return EQ;}

",""," {return VIRG;}{return VIRG;}

".""." {return PONTO;}{return PONTO;}

"$""$" {return DOLAR;}{return DOLAR;}

%%%%

Page 16: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

main () {main () {int i;int i;while (i = yylex ()) {while (i = yylex ()) {

printf ("tipo = %d; atributo = ", i);printf ("tipo = %d; atributo = ", i); switch (i) {switch (i) {

case EQ: case PONTO: case EQ: case PONTO: case VIRG: case DO:case VIRG: case DO:

printf ("%s\n", yytext); printf ("%s\n", yytext); break;break;

case ID:case ID:printf ("%s\n", printf ("%s\n",

yylval.cadeia); yylval.cadeia); break;break;case NUM:case NUM:

printf ("%d\n", yylval.valor);printf ("%d\n", yylval.valor);break;break;

}}}}

}}

Page 17: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Rodando para a seguinte entrada:Rodando para a seguinte entrada:

xxx do 123 do5i=1,25 do5i=1.25 $xxx do 123 do5i=1,25 do5i=1.25 $

Resultados:Resultados:

Obs.: o programa não reconhece constantes reais

Page 18: CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica

Observações finais:Observações finais:

FortranFortran é uma linguagem de é uma linguagem de difícil análise difícil análise léxicaléxica, devido ao , devido ao controlecontrole das das linhaslinhas e das e das colunascolunas dos programas e outras coisas mais dos programas e outras coisas mais

É É mais fácilmais fácil fazer um fazer um analisador manualanalisador manual do do que usar um gerador que usar um gerador automáticoautomático