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

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

Análise Léxica Primeira fase de um compilador

Apresentações semelhantes


Apresentação em tema: "Análise Léxica Primeira fase de um compilador"— Transcrição da apresentação:

1 Análise Léxica Primeira fase de um compilador
Objetivo: ler os caracteres de entrada e produzir como saida uma seqüência de tokens que o parser vai usar para análise sintática.

2 Analisador léxico Analisador léxico parser Programa fonte
token parser Programa fonte getNextToken tabela de símbolos

3 Construindo um analisador léxico
Especificar tokens e lexemas da linguagem Implementar (ou gerar através de ferramenta) o analisador a partir da especificação

4 Outras possíveis tarefas do analisador léxico
Tratamento de espaços em branco e comentários Tratamento de mensagens de erro (localização/impressão) Tratamento de macros

5 Organização Às vezes dividido em
scanning – remoção de comentários e espaços em branco duplicados Análise léxica propriamente dita – parte mais complexa, onde o scanner produz a sequencia de tokens

6 Analisador léxico x Parser
Design mais simples – misturar análise léxica com sintática torna o parser bem mais complicado Eficiência – separação possibilita construir processadores léxicos e sintáticos mais eficientes. Portabilidade – variações de dispositivos podem ficar restritas ao analisador léxico.

7 Tokens, Padrões e Lexemas
Tokens: par com o nome do token e atributos opcionais. Padrão: descrição da forma dos lexemas que um token pode ter Lexema: sequencia de caracteres que casam com o padrão de um token. Uma instância de um token.

8 Tokens, padrões e lexemas
Existem conjuntos de strings na entrada que geram o mesmo token. Elas são descritas por padrões associados ao token O padrão casa cada string do conjunto Um lexema é uma seqüência de caracteres do programa fonte que casa com um padrão de um token. Tokens são símbolos terminais da linguagem.

9 Tokens, padrões e lexemas
Tokens normalmente são Palavras-chave, operadores, identificadores, constantes, strings literais e símbolos de pontuação, como parenteses e vírgulas. Padrões normalmente são especificados por expressões regulares. Variações de expressões regulares são usadas em vários outros contextos: Linguagens de programação: sed, awk, perl Shells de sistemas operacionais: sh, csh, command

10 Tokens, padrões e lexemas
exemplo descrição if Caracteres i, f else Caracteres e, l, s, e comp <,<=,=,<>,> < ou <= ou … id pi, count, D2 Letra seguida de letras e/ou dígitos num 3.1416, 0, 6.02E23 Constante numérica literal “core dumped” Quaisquer caracteres entre “” exceto “ e ”

11 Dificuldades na implementação de um analisador léxico
Linguagens que requerem determinados construtores em posições (colunas) específicas da linha de entrada (e.g. Fortran). Tratamento de espaços em branco. Ausência de palavras reservadas.

12 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;

13 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 símbolos para guardar informações auxiliares sobre tokens.

14 Atributos de um token - Exemplo
E = M * C ** 2 <id, apontador p/posição de E na tabela de símbolos> <assign_op,> <id, apontador p/posição de M na tabela de símbolos> <mult_op,> <id, apontador p/posição de C na tabela de símbolos> <exp_op,> <num, valor 2>

15 Erros de análise léxica
Relativamente raros. Geralmente o analisador tenta recuperar do erro, ignorando caracteres.

16 Opções de Implementação de um analisador léxico
Uso de um gerador de analisadores léxicos, como lex ou flex, que produzem um analisador léxico a partir de uma especificação em expressões regulares. Escrever o analisador em uma linguagem de programação convencional, usando as facilidades de E/S da linguagem para ler a entrada. Escrever o analisador léxico em assembler, gerenciando explicitamente a leitura. Uso de bufferização da entrada é importante para a eficiência de um analisador léxico!

17 Especificação de Tokens
Baseado em Teoria de Linguagens: Alfabetos, strings e linguagens Operações sobre linguagens Exemplo: seja L o conjunto (de letras) {A,B,…,Z,a,b,…,z} e D o conjunto (de dígitos) {0,1,…,9}.

18 Operações sobre linguagens - Exemplo
L  D conjunto composto de letras e dígitos LD conjunto de strings compostas de letras seguidas de dígitos L conjunto de todas as strings com 4 letras L* conjunto de todas as strings de letras, inclusive a string vazia  D conjunto de strings de um ou mais dígitos. L(L  D)* L* fecho de Kleene de L; L+ fecho positivo de L

19 Operadores sobre linguagens
Operação Definição União de L e M L  M L  M = {s | s  L ou s  M } Concatenação de L e M, LM { st | s  L e t  M } Fechamento de Kleene de L, L* L* = i=0,Li Fechamento positivo de L, L+ L+ = i=1,Li

20 Expressões regulares Permitem a definição de linguagens a partir de definições de expressões regulares mais simples. Exemplos: Identificadores em pascal: letter (letter | digit) * a | b (a | b) (a | b) a* (a|b)* a | a*b

21 Propriedades algébricas
| é comutativa e associativa Concatenação é associativa Concatenação distribui sobre |  é o elemento identidade da concatenação * é idempotente (r** = r*)

22 Exemplo - Pascal letter gA | B | … | Z | a | b | …| z digit g0 | 1 | … | 9 id gletter (letter | digit)* digits gdigit digit* opt_fraction g. digits |  opt_exponent g(E (+|-|) digits) |  num gdigits opt_fraction opt_exponent

23 Abreviações + uma ou mais instâncias. ? Zero ou uma instância
[ ] classes de caracteres, ex: [A-Za-z][A-Za-z0-9]*

24 Reconhecimento de Tokens
Gerar diagramas de transição e depois implementar uma máquina de estados. Implentar autômatos finitos determinísticos e não-determinísticos.

25 Lex Linguagem (e compilador) para especificar analisadores léxicos.

26 Organização Programa fonte lex.l Compilador lex (lex ou flex) Lex.yy.c
C compiler lex.yy.c a.out a.out Entrada Sequencia de tokens

27 Programas Lex - estrutura
Declarações – variáveis, constantes, defs.regulares %% regras de tradução – expr.regulares e ações em C Padrão { Ação } %% procedimentos auxiliares

28 Lex - exemplo %{ /* definição 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}+)? %%

29 Lex – exemplo (cont.) … {ws} {/* no action and no return */}
if {return(IF);} then {return(THEN);} else {return(ELSE);} {id} {yylval=install_id();return(ID);} {number} {yylval=install_num(); return(NUMBER);} “<“ {yylval = LT; return(RELOP);} “<=“ {yylval = LE; return(RELOP);} %%

30 Lex – exemplo (cont.) … int install_id() {
Copia lexema para a tabela de símbolos. Primeiro caracter do lexema é apontado pela variável yytext e o comprimento é definido pela variável yyleng. } Int install_num() { … } Até seção 3.5, página 146;

31 Lex - implementação Transforma o programa de entrada em um programa em C que implementa um Autômato Finito NFA – Nodeterministic Finite Automata DFA – Deterministic Finite Automata Reconhecem a mesma linguagem, linguagens regulares, expressas por expressões regulares Até seção 3.5, página 146;


Carregar ppt "Análise Léxica Primeira fase de um compilador"

Apresentações semelhantes


Anúncios Google