A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica."— Transcrição da apresentação:

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

2 Capítulo IV – Complementos de Análise Léxica 4.1 – Interface entre programa-fonte e compilador 4.2 – Bufferização do programa 4.3 – Observação de átomos seguintes 4.4 – Lex para observar átomos seguintes

3 4.1 – Interface entre Programa-Fonte e Compilador Os principais conceitos sobre análise léxica foram introduzidos no capítulo anterior: Os principais conceitos sobre análise léxica foram introduzidos no capítulo anterior: – Formação e classificação de átomos – Diagrama de transições léxicas – Ferramenta do analisador sintático

4 Sendo a interface entre programa-fonte e compilador, pode executar algumas tarefas secundárias: Pular comentários, espaços em branco, tabulações, new- lines, etc (vistos em diagramas de transições e em Flex) Pular comentários, espaços em branco, tabulações, new- lines, etc (vistos em diagramas de transições e em Flex) Contar o número de linhas lidas, possibilitando a inclusão do número da linha em mensagens de erro Contar o número de linhas lidas, possibilitando a inclusão do número da linha em mensagens de erro Gerenciar o controle das linhas e sua continuação, nos programas escritos em linguagens em que a divisão em linhas é relevante (Fortran, Cobol) Gerenciar o controle das linhas e sua continuação, nos programas escritos em linguagens em que a divisão em linhas é relevante (Fortran, Cobol)

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

6 Exemplo: uma linha de programa em Fortran Caractere na coluna 6: a linha é continuação da anterior Caractere na coluna 6: a linha é continuação da anterior

7 4.2 – Bufferização do Programa A complexidade do analisador léxico é bem menor, conceitualmente falando, do que a dos outros componentes de um compilador A complexidade do analisador léxico é bem menor, conceitualmente falando, do que a dos outros componentes de um compilador No entanto, é nele que o front-end de um compilador consome a maior porção de seu tempo No entanto, é nele que o front-end de um compilador consome a maior porção de seu tempo É o componente que lê caractere por caractere do arquivo do programa É o componente que lê caractere por caractere do arquivo do programa

8 A velocidade do analisador léxico é crucial no projeto de um compilador A velocidade do analisador léxico é crucial no projeto de um compilador Os caracteres podem ser lidos em blocos (1 ou 4 Kbytes), evitando-se a taxa de um acesso ao disco por caractere lido Os caracteres podem ser lidos em blocos (1 ou 4 Kbytes), evitando-se a taxa de um acesso ao disco por caractere lido Tais blocos podem ser armazenados um por vez num buffer (string) e a análise de cada caractere pode ser feita nele Tais blocos podem ser armazenados um por vez num buffer (string) e a análise de cada caractere pode ser feita nele Essa bufferização pode ficar encapsulada numa função; no caso do Mini-Pascal, isso poderia acontecer na função NovoCarac Essa bufferização pode ficar encapsulada numa função; no caso do Mini-Pascal, isso poderia acontecer na função NovoCarac

9 4.3 – Observação de Átomos Seguintes Algumas linguagens requerem, para a formação e classificação de um átomo, a observação de átomos que o seguem, dentro do programa Algumas linguagens requerem, para a formação e classificação de um átomo, a observação de átomos que o seguem, dentro do programa Em Fortran, espaços em branco são eliminados durante o pré-processamento, dificultando a classificação dos átomos Em Fortran, espaços em branco são eliminados durante o pré-processamento, dificultando a classificação dos átomos

10 Exemplo: Em Fortran, os comandos Os átomos de cada comando são: 1º) DO5I=1.25: (ID, DO5I), (ATRIB), (CTREAL, 1.25) 2º) DO5I=1,25: (DO), (ROTULO, 5), (ID, I), (ATRIB), (CTINT, 1), (VIRG), (CTINT, 25) (CTINT, 1), (VIRG), (CTINT, 25) Nos dois comandos, até antes da virgula ou do ponto, nada se pode decidir sobre a formação e classificação de todos esses átomos Nos dois comandos, até antes da virgula ou do ponto, nada se pode decidir sobre a formação e classificação de todos esses átomos DO 5 I = 1.25 DO 5 I = 1,25 DO5I=1.25DO5I=1,25 são transformados em

11 1º) DO5I=1.25: (ID, DO5I), (ATRIB), (CTREAL, 1.25) 2º) DO5I=1,25: (DO), (ROTULO, 5), (ID, I), (ATRIB), (CTINT, 1), (VIRG), (CTINT, 25) (CTINT, 1), (VIRG), (CTINT, 25) Os átomos formados na tentativa de definição de outro deles podem ser colocados numa fila pelo analisador léxico e entregues um por um, quando solicitados pelo analisador sintático Os átomos formados na tentativa de definição de outro deles podem ser colocados numa fila pelo analisador léxico e entregues um por um, quando solicitados pelo analisador sintático A função NovoAtomo do Mini-Pascal só deve procurar novos caracteres, quando a fila de átomos estiver vazia A função NovoAtomo do Mini-Pascal só deve procurar novos caracteres, quando a fila de átomos estiver vazia

12 4.4 – Lex para Observar Átomos Seguintes A linguagem Lex admite uma expressão regular do tipo A linguagem Lex admite uma expressão regular do tipo r1 /r2 onde r1 e r2 são expressões regulares Significado: uma cadeia se enquadra em r1 somente se for seguida de outra cadeia que se enquadre em r2 Significado: uma cadeia se enquadra em r1 somente se for seguida de outra cadeia que se enquadre em r2

13 Exemplo: Em Fortran, para o caso dos comandos DO5I=1.25 e DO5I=1,25 A palavra reservada do pode ser reconhecida pela expressão: A palavra reservada do pode ser reconhecida pela expressão:do/({letra}|{digito})*=({letra}|{digito})*, Seja o programa em Lex a seguir: Seja o programa em Lex a seguir:

14 %{ #define DOLAR 0 #defineID1 #defineNUM2 #defineDO3 #defineVIRG4 #definePONTO5 #defineEQ6 union { char *cadeia; int valor;} yylval;%} delim[ \t\n] ws{delim}+ dig[0-9] letr[A-Za-z] num{dig}+ id{letr}({letr}|{dig})*

15 % {ws}{ ;} do/(({letr}|{dig})*=({letr}|{dig})*,)|{ws} {return DO;} {id}{yylval.cadeia = yytext; return ID;} {num}{yylval.valor = atoi (yytext); return NUM;} return NUM;} "="{return EQ;} ","{return VIRG;} "."{return PONTO;} "$"{return DOLAR;} %

16 main () { int i; while (i = yylex ()) { printf ("tipo = %d; atributo = ", i); printf ("tipo = %d; atributo = ", i); switch (i) { switch (i) { case EQ: case PONTO: case VIRG: case DO: printf ("%s\n", yytext); break; case ID: printf ("%s\n", yylval.cadeia); break; case NUM: printf ("%d\n", yylval.valor); break; }}}

17 Rodando para a seguinte entrada: xxx do 123 do5i=1,25 do5i=1.25 $ Resultados: Obs.: o programa não reconhece constantes reais

18 Observações finais: Fortran é uma linguagem de difícil análise léxica, devido ao controle das linhas e das colunas dos programas e outras coisas mais Fortran é uma linguagem de difícil análise léxica, devido ao controle das linhas e das colunas dos programas e outras coisas mais É mais fácil fazer um analisador manual do que usar um gerador automático É mais fácil fazer um analisador manual do que usar um gerador automático


Carregar ppt "CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica."

Apresentações semelhantes


Anúncios Google