ii – análise léxica

12
II – Análise léxica • lex: linguagem de especificação para analisadores léxicos • Implementação de simuladores de autómatos finitos • Bibliografia aconselhada: – lex & yacc – Aho, Sethi e Ullman – secção 3.5 e 3.8 LFA 1999/2000 - 1 Jorge Morais

Upload: dex

Post on 05-Jan-2016

32 views

Category:

Documents


2 download

DESCRIPTION

II – Análise léxica. DEI. lex: linguagem de especificação para analisadores léxicos Implementação de simuladores de autómatos finitos Bibliografia aconselhada: lex & yacc Aho, Sethi e Ullman – secção 3.5 e 3.8. Jorge Morais. LFA 1999/2000 - 1. Linguagem lex. DEI. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: II – Análise léxica

II – Análise léxica

• lex: linguagem de especificação para analisadores léxicos

• Implementação de simuladores de autómatos finitos

• Bibliografia aconselhada:– lex & yacc– Aho, Sethi e Ullman – secção 3.5 e 3.8

LFA 1999/2000 - 1Jorge Morais

Page 2: II – Análise léxica

Linguagem lex

• Linguagem de especificação dum analisador usando expressões regulares estendidas

• As expressões regulares definem padrões para cada um dos tokens

• As acções são especificadas para cada token em linguagem C

LFA 1999/2000 - 2Jorge Morais

Page 3: II – Análise léxica

Compilador lex

• Programa em lex compilador lex lex.yy.c

• lex.yy.c compilador C a.out

• entrada a.out sequência de tokens

LFA 1999/2000 - 3Jorge Morais

Page 4: II – Análise léxica

Especificação em lex

Declarações (variáveis, definições de constantes e definições regulares)

%%

Regras de tradução (Padrão {Acção em C})

%%

Procedimentos auxiliares (em C, podendo ser compilados separadamente)

LFA 1999/2000 - 4Jorge Morais

Page 5: II – Análise léxica

Interface com o parser

• Quando activado pelo parser, lê o resto da entrada, à procura da sequência mais longa que corresponda a um dos padrões especificados, e executa a acção correspondente

• As acções acabam com o retorno ao parser (em algumas situações, como na procura de espaços em branco, pode continuar a procurar mais padrões)

LFA 1999/2000 - 5Jorge Morais

Page 6: II – Análise léxica

Interface com o parser (cont.)

• yylex é a função chamada pelo parser• O token é o valor retornado• Os atributos podem ser passados usando a

variável global yylval• O lexema é colocado na variável global

yytext• O tamanho do lexema é colocado na

variável global yyleng

LFA 1999/2000 - 6Jorge Morais

Page 7: II – Análise léxica

Cópia directa

• As definições de constantes (na parte das declarações) são escritas entre as sequências %{ e %} são copiadas directamente para o ficheiro lex.yy.c, não sendo usadas nas definições regulares ou nas regras de tradução

• Os procedimentos auxiliares também são copiados directamente

LFA 1999/2000 - 7Jorge Morais

Page 8: II – Análise léxica

Definições regulares

• Como já foi visto, permite definir alguns padrões mais usuais por nomes; esta definição é feita na parte das declarações

• Na parte das regras de tradução, as definições regulares estão entre { e } para distinguir de literais:– id significa a sequência de caracteres ‘i’ e ‘d’– {id} significa a definição regular id

LFA 1999/2000 - 8Jorge Morais

Page 9: II – Análise léxica

Meta-símbolos

• ‘-’ usado na definição de domínios (a-z)

• ‘\’ carácter de escape usado como na linguagem C (\n, \t, etc...) e também para usar caracteres que são meta-símbolos (\- significa o carácter ‘-’)

• “aspas” servem para delimitar caracteres

• / operador de procura à frente (lookahead)

LFA 1999/2000 - 9Jorge Morais

Page 10: II – Análise léxica

Implementação do simulador AF

• O lex usa um simulador dum autómato finito usando uma tabela de transições

• Especificação em lex compilador lex tabela de transições

• O simulador lê a entrada e, usando a tabela de transições, simula as transições dos autómatos

LFA 1999/2000 - 10Jorge Morais

Page 11: II – Análise léxica

Exemplo dum analisador léxico

• Vamos considerar o pequeno analisador léxico dado anteriormente com:– espaços em branco: ' ', tabulação e nova linha– operadores relacionais: <, <=, >, >=, ==, !=– identificadores: letra (letra | dígito)*

– números: dígito+ (. dígito+)? (E [+-]? dígito+)?

LFA 1999/2000 - 11Jorge Morais

Page 12: II – Análise léxica

Exemplo dum analisador léxico

• Código fonte:– ex1.lex

• Compilação:– lex ex1.lex (ou flex ex1.lex)

– gcc lex.yy.c -o ex1 –ll (ou gcc lex.yy.c –o ex1 –lfl)

• Comando:– ex1 – lê a partir do standard input

– ex1 fich

LFA 1999/2000 - 12Jorge Morais