120 likes | 252 Views
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.
E N D
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 • 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 Jorge Morais LFA 1999/2000 - 2
Compilador lex DEI • Programa em lex compilador lex lex.yy.c • lex.yy.c compilador C a.out • entrada a.out sequência de tokens Jorge Morais LFA 1999/2000 - 3
Especificação em lex DEI 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) Jorge Morais LFA 1999/2000 - 4
Interface com o parser DEI • 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) Jorge Morais LFA 1999/2000 - 5
Interface com o parser (cont.) DEI • 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 Jorge Morais LFA 1999/2000 - 6
Cópia directa DEI • 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 Jorge Morais LFA 1999/2000 - 7
Definições regulares DEI • 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 Jorge Morais LFA 1999/2000 - 8
Meta-símbolos DEI • ‘-’ 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) Jorge Morais LFA 1999/2000 - 9
Implementação do simulador AF DEI • 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 Jorge Morais LFA 1999/2000 - 10
Exemplo dum analisador léxico DEI • 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+)? Jorge Morais LFA 1999/2000 - 11
Exemplo dum analisador léxico DEI • 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 Jorge Morais LFA 1999/2000 - 12