Академический Документы
Профессиональный Документы
Культура Документы
Tema 2
Juan A. Bota Blaya
juanbot@um.es http://ants.dif.um.es/staff/juanbot/traductores/traductores.html
ndice
Introduccin al Anlisis Lxico (AL) Gramticas Expresiones Regulares (ER) Autmatas nitos deterministas y no deterministas Eciencia en el AL Denicin de los tokens Cuestiones de diseo en el AL
Anlisis lxico
Funcin principal: generar una lista ordenada de tokens, a partir de los caracteres de entrada. Esos tokens son usados por el AS para construr el rbol sintctico. El AL es un mdulo subordinado al correspondiente del AS
Programa Fuente Analizador Lxico Nuevo Token? Token Analizador Sintctico
Funciones adicionales del AL Eliminacin de caracteres espreos Asistencia en el informe de errores elaborado por el AS Cuenta de nmeros de linea con comentarios, macros Manejo de algunos errores En PASCAL el lexema 0.5 pertenecera al lenguaje y .5 no. Exceder el nmero de caracteres mximo para un identicador.
Gramticas
Necesidad de un mecanismo para para expresar lenguajes Un lenguaje L es un conjunto de cadenas Si el nmero de elementos de L es nito L = {c1 , c2 , . . . , cn } Si |L| es innito necesitamos una especicacin nita de innitas cadenas Denicin 1 Una gramtica es una 4-tupla G = (V N , VT , P, S) en donde 1. VN es un conjunto nito de smbolos no terminales (algunas veces denominadas variables sintcticas o categoras sintcticas) 2. VT es un conjunto nito de smbolos terminales, siendo V N VT = . 3. P es un subconjunto nito del conjunto (VN VT ) VN (VN VT ) (VN VT ) Adems, un elemento (, ) P se escribir y se denomina produccin. 4. S es un smbolo especial de VN y se denomina smbolo inicial de la gramtica.
Analisis Lexico p.4/42
Gramticas
Ejemplo 1 Un ejemplo de gramtica es G1 = ({A, S}, {0, 1}, P, S) en donde P contiene las siguientes producciones S 0A1 0A 00A1 A 2
Gramticas (II)
Concepto de forma sentencial Denicin 2 Una forma sentencial de una gramtica G = (VN , VT , P, S) se dene recursivamente como sigue: 1. S es una forma sentencial 2. Si es una forma sentencial y est en P entonces es tambin una forma sentencial. Una forma sentencial en G que slo contenga smbolos terminales se denomina sentencia generada por G. El lenguaje generado por una gramtica G, denotado por L(G), es el conjunto de sentencias generadas por G.
Expresiones Regulares
Gramtica de Tipo 3. Denicin 3 Las gramticas regulares, se clasican en los dos grupos siguientes: Lineales por la izquierda: aquellas cuyas reglas de produccin son del tipo A a, A V a S ; Lineales por la derecha: aquellas cuyas reglas de produccin son del tipo A a, A aV S , en donde a T y A N , S es el axioma de la gramtica y la palabra vaca. Teorema: un lenguaje L es regular si y slo si es un lenguaje lineal por la derecha (por la izquierda).
Expresiones Regulares
Ejemplo 2 La siguiente gramtica G = {{S, A, B, C}, {a, b}, P, S} con el conjunto de producciones siguiente: S aS|aB B bC C aC|a es de tipo tres, lineal por la derecha y genera sentencias del lenguaje L(G) = {an bam |n, m 1}
Expresiones regulares
ER (Kleene 1956) nacido como mecanismo para expresar, los lenguajes reconocidos por los auttamas nitos. Denicin 4 Dado un alfabeto , y los smbolos (conjunto vaco), (palabra vaca), + (unin), (concatenacin), (cierre), se dice que: 1. El smbolo es una ER. 2. El smbolo es una ER. 3. a , a es una ER. 4. Si y son dos ER, + y son ER.
5. Si es una ER,
=
i=0
i en donde i es igual a la
concatenacin de consigo misma i veces, siendo 0 = . 6. Slo son ER las que expresiones que se obtienen aplicando las reglas anteriores, un nmero nito de veces sobre los smbolos de , y . Adems : El operador tiene la mayor precedencia, asociativo por la izquierda. tiene la segunda mayor precedencia, y es asociativo por la izquierda. +, es el de menor precedencia y tambin es asociativo por la izquierda.
Analisis Lexico p.9/42
ER (II)
La precedencia se puede modicar usando parntesis. Algunos ejemplos a b representa al lenguaje {am bn |m 0, n 0}. (ab) representa al lenguaje {(ab)m |m 0}. (a + b) representa al lenguaje formado por las cadenas que contienen cero o ms casos de una a o b. Es equivalente a (a + b ) .
ER (II)
Lenguaje regular Denicin 5 A cada ER, , podemos asociarle un subconjunto de , L(), que se referir al lenguaje regular que describe , segn: Si = , L() = . Si = , L() = . Si = a, L() = {a}. Si y son dos ER, entonces L( + ) = L() Si es una ER, entonces L( ) = L() . Equivalencia de ERs Denicin 6 Dos expresiones regulares y son equivalentes (se escribe = ) si describen el mismo lenguaje, L() = L(). Limitaciones Cmo representar un palndromo?
Analisis Lexico p.11/42
L().
Ejemplo de AFD
Autmata que acepta cadenas con un nmero par de ceros y un nmero par de unos. AF D = ({S, A, B, C}, {0, 1}, , S, {S}), (S, 0) = B M se puede denir extensivamente como: (A, 0) = C (B, 0) = S (C, 0) = A Representacin grca
Inicio 1 S 1 0 1 B 1 C 0 A
Entradas Estado S A B C 0 B C S A 1 A S C B
Analisis Lexico p.13/42
Comenzamos con la denicin formal. Denicin 9 Un AFND es una 5-tupla {Q, , , q 0 , F } en donde: Q es un conjunto nito de estados posibles del autmata. es el alfabeto de entrada al autmata. q0 es el estado inicial. F Q es el conjunto de estados nales. : Q 2Q es la funcin de transicin del autmata. Cambia el codominio de la funcin que es el conjunto de las partes de Q. (q, a) = {p1 , p2 , . . . , pn } Cuando el AFND est en q y llega a T , la transicin va a uno de {p 1 , p2 , . . . , p3 }. Completamos la denicin de con : (q, At) =
p(q,A) n
({q1 , q2 , . . . , qn }, x) =
i=1
(qi , x)
Analisis Lexico p.14/42
Ejemplo
AFND que reconoce cadenas en {a, b, c} tales que el ltimo smbolo en la cadena de entrada apareca tambin anteriormente en la cadena. En este AFND, Sera F = ({q0 , q1 , q2 , q3 , q4 }, {a, b, c}, , q0 , {q4 })
Smbolos de Entrada Estado q0 q1 q2 q3 q4 a {q0 , q1 } {q1 , q4 } {q2 } {q3 } b {q0 , q2 } {q1 } {q2 , q4 } {q3 } c {q0 , q3 } {q1 } {q4 } {q3 , q4 }
Ejemplo
Inicio a a a,b,c q0 q1 a c b
q3
a,b,c
q2
q4
a,b,c
Sea la entrada aca, (q0 , a) (q0 , aca) (q0 , c) (q0 , ca) = = = = = = (q1 , ca) = {q0 , q1 } (q0 , ca) (q0 , a) {q0 , q1 } (q1 , ca) (q3 , a) {q3 } {q0 , q3 } y (q1 , c) = {q1 }
Ejemplo
Concluyendo,
(q0 , aca)
= =
{q0 , q1 , q3 }
{q1 , q4 }
Programando el auttama
Para obtener un reconocedor lxico podemos Obtener el AFD de la ER que describe los tokens y simularlo; Obtener el AFND y despus simularlo Obtener primero el AFND y tras l un equivalente AFD.
AFD
conversin
simulacin
b
ER
c
conversin
conversin
RECONOCEDOR
a
AFND
simulacin
La conversin de una ER en un AFND es menos costosa, que a un AFD Convertir un AFND en un AFD es ms rpido que simular el AFND
Ejemplo de implementacin de un AFD Podemos simularlo de dos formas Implementar directamente la funcin Simular las transiciones mediante sentencias if-then-else, case, . . . Implementaremos un analizador lxico capaz de reconocer comentarios denidos como: COMMENT ::= -- CHAR EOL CHAR ::= CUALQUIER CARACTER DISTINTO DE EOL EOL ::= NUEVA LINEA
El autmata
CHAR EOL 1 2 3 4
Implementacin
Un cdigo que implementa la tabla de transiciones
caracter_actual = getchar(); estado = estado_inicial; while (TRUE){ sif_estado = T[estado][caracter_actual]; if(sig_estado == ERROR) break; estado = sig_estado; caracter_actual = getchar(); if(caracter_actual == EOF) break; } if(es_estado_final(estado)) /*Devolver o procesar el token vlido*/ a else error_lexico(caracter_actual); caracter_actual = getchar(); if (caracter_actual == -){ caracter_actual = getchar(); if (caracter_actual == -){ do{ caracter_actual = getchar(); }while(caracter_actual != \n); }else{ ungetc(caracter_actual,stdin); error_lexico(caracter_actual); } }else error_lexico(caracter_actual);
d 5
ESTADOS 1 2 3 4 5 6
a 2
b 2
c 3
d 5
4 6 3
Mtodo
Almacenamos, numerados, los valores no nulos en un vector VALOR En otro vector COL el ndice de la columna correspondiente en Tenemos la tabla izquierda Adems, en la tabla derecha Una la para cada estado del autmata Nmero de la en izquierda donde comienzan las transiciones del estado Nmero de transiciones del estado
Indice 1 2 3 4 5 6 7
VALOR
COL
Estado 1 2 3 4 5 6
PRIFIL
NUM NO NULOS
2 5 2 3 4 6 3
1 4 2 3 1 5 4
1 3 5 6 7 0
2 2 1 1 1 0
Analisis Lexico p.24/42
Mtodo (II)
/*estado_actual es estado desde el que hacemos la transicin*/ o /*indice_caracter es el ndice correspondiente al carcter de entrada*/ a /*M es el estado al que hacemos la transicin. Si M=0, no hay transicin*/ o o int primer_estado, /*Es el estado desde el que se comienza a buscar el nuevo*/ numero_estados, /*Nmero posible de estados que pueden ser transicin*/ u o pivote; /*Nmero de estados chequeados hasta el momento*/ u boolean hallado; /*False si aun no se ha hallado el estado destino. True si se ha encontrado*/ numero_estados = NUMFIL[estado_actual]; if(numero_estados == 0) M = 0; else{ primer_estado = PRIFIL[estado_actual]; hallado = false; pivote = 0; } while(pivote < numero_estados && !hallado){ if(COL[primer_estado + pivote] == indice_caracter) hallado = true; else pivote++; if(hallado) M = VALOR[primer_estado + pivote]; else M = 0; } printf(El nuevo estado es %d\n,M);
Mtodo (III)
En una tabla de transiciones de 100 100 elementos, con nicamente 110 elementos no nulos. Con la representacin compacta tendramos
(2 n_estados) + (2 n_no_nulos) = 420
elementos en total. Con la representacin normal habramos necesitado 10.000 elementos en memoria.
Uso de buffers
Es necesario el manejo de buffers sobre los servicios E/S del S.O. Basado en un mecanismo de doble buffer, con N caracteres cada uno Usa punteros forward y lexeme beginning Punteros delimitan el lexema actual
Buffer 1 Buffer 2
N=8
lexeme_beginning
forward
Cdigo
if forward est al final de la primera mitad then a begin recargar segunta mitad; forward := forward + 1; end else if forward est al final de la segunda mitad then a begin recargar la primera mitad; pasar forward al principio de la primera mitad; end else forward := forward + 1;
Ejemplo
lexeme_beginning forward
Ejemplo
lexeme_beginning forward
Ejemplo
lexeme_beginning forward
Ejemplo
lexeme_beginning forward
Ejemplo
lexeme_beginning forward
Ejemplo 2
lexeme_beginning forward
Ejemplo 2
lexeme_beginning
forward
Ejemplo 2
lexeme_beginning
forward
Ejemplo 2
lexeme_beginning
forward
Ejemplo 2
lexeme_beginning
forward
Ejemplo 2
lexeme_beginning
forward
Ejemplo 2
lexeme_beginning
forward
N=8
lexeme_beginning
eof
forward
eof
Lexemas ejemplo const if <,,=,<>, pi, cuenta, D2 3.1416, 0, 6.02E23 vaciado de memoria
Patrn no formal const if < = <> letra seguida de letras y dgitos cualquier cte. numrica cualquier carcter entre y excepto
operadores, identicadores, constantes (reales, enteras y de tipo carcter), strings de caracteres y signos de puntuacin Regla: usar tokens sencillos y poco numerosos.
el compilador podra producir los siguientes mensajes de error: ERROR LXICO: carcter no reconocido (?) ERROR SEMNTICO: identicador no declarado (num) ERROR SINTCTICO: falta operador entre identicadores ERROR SEMNTICO: identicador no declarado (ero)
Cuestiones de Diseo
Metodologa Identicar los tokens del lenguaje Denirlos utilizando ER Obtener el AF correspondiente a las ERs que ha de reconocer el AL. Minimizar el nmero de estados del AF. Disear el interface entre la entrada estndar, de donde proviene el programa fuente, y el AL. Especicar qu tipo de manejo de errores va a seguir el AL.
Ejemplo de diseo
Vamos a disear el lxico de un lenguaje de programacin denominado MICRO Especicaciones bsicas Tipo de dato: entero. No se declaran variables. Los identicadores empiezan por letra y se componen de letras, dgitos y smbolos de subrayado. Solo hay constantes enteras. Los comentarios comienzan por y terminan con EOL. Sentencias: ID:=expresin; read ( lista de IDs); write ( lista de expresiones entre comas ); Palabras reservadas: begin, end, read, write. Las sentencias se separan con ";". El cuerpo del programa est delimitado por begin/end. Separadores de tokens: espacios en blanco, tabuladores y new-line.
Implementacin
La implementacin podra ser la que aparece en los archivos lexico.h y lexico.c.
lexico.h
typedef enum token_types { BEGIN, END, READ, WRITE, ID, INTLITERAL, LPAREN, RPAREN, SEMICOLON,COMMA, ASSIGNOP, PLUSOP, MINUSOP, SCANEOF } token; extern token scanner(void); extern char token_buffer[]
Implementacin lexico.c
#include "lexico.h" #include <stdio.h> #include <ctype.h> void buffer_char(char c); void clear_buffer(void); token check_reserved(void); void lexical_error(char c); char token_buffer[30]; token scanner(void) { int in_char,c; clear_buffer(); if (feof(stdin)) return SCANEOF; while ((in_char = getchar())!= EOF) { if (isspace(in_char)) continue; /*do nothing*/ else if (isalpha(in_char)) { /* * ID::= LETTER |ID LETTER * |ID DIGIT * |ID UNDERSCORE */ buffer_char(in_char); for(c=getchar();isalnum(c) || c===;c=getchar()) buffer_char(c); ungetc(c,stdin); return check_reserved(); } else if (isdigit(in_char)){ /* * INTLITERAL::= DIGIT | * INTLITERAL DIGIT */ buffer_char(in_char); }} for(c=getchar();isdigit(c);c=getchar()) buffer_char(c); ungetc(c,stdin); return INTLITERAL; } else if (in_char == () return LPAREN; else if (in_char == )) return RPAREN; else if (in_char == ;) return SEMICOLON; else if (in_char == ,) return COMMA; else if (in_char == +) return PLUSOP; else if (in_char == :) /*looking for ":="*/ c = getchar(); if ( c===) return ASSIGNOP; else { ungetc(c,stdin); lexical_error(in_char);} } else if (in_char == -) { /* is it --, comment start */ c= getchar(); if ( c == -) { do in_char = getchar(); while (in_char !=\n); } else { ungetc(c,stdin); return MINUSOP;} }else lexical_error(in_char);
Analisis Lexico p.42/42