ii – análise léxica
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 PresentationTRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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