generación de analizador léxico -...
TRANSCRIPT
Expresionesregulares“tipo grep”
Expresionessimples(un sólocarácter):
� carácter �
“ �” carácter �
. cualquiercarácter(exceptoseparadordelínea)[ � ��� - �] cualquiercarácterdel conjunto[ˆ � �� - �] cualquiercarácterfueradel conjunto
Generacion deanalizadorlexico– p.2
Expresionesregulares“tipo grep”
Operadoresparaexpresionescompuestas:? ó �
* ceroo másocurrenciasde+ unao másocurrenciasde
� � � concatenadacon �
� | � � ó �
( ) (necesarioparaagrupar)Nota: ?*+ tienenprecedenciasobrela concatenación,y éstasobre|
Generacion deanalizadorlexico– p.3
GramáticasEBNF “tipo lex”
Partesderechassonexpresionesregulares“tipogrep ”
Sin recursividad(ni indirectani directa)
Portanto,generasólolenguajesregulares
Podemosdesarrollarlaspartesderechas(detokens):Sustituimosno-terminalespor suspartesderechasSi esnecesario,insertamosparéntesisparalosoperadores*+?
Generacion deanalizadorlexico– p.4
Ejemplo
letra � [a-zA-Z]
digito � [0-9]
subr � _
letdig � letra | digito
TOKEN_IDENT � letra letdig* (subr letdig+)*
Desarrollamosla partederecha:
TOKEN_IDENT � [a-zA-Z] ([a-zA-Z] | [0-9])*
(_ ([a-zA-Z] | [0-9])+)*
Generacion deanalizadorlexico– p.5
Items
Unavezdesarrolladaspartesderechasdelos tokens:
Usaremositemsconla forma �El puntoindicahastadóndesehaleído(delaentrada)
Al leer � (ó “ �” ó
�� �
) pasamosde � � a
�
Podemosver los itemscomoestadosdeunautómatafinito no-deterministacontransiciones � (AFN �)
Generacion deanalizadorlexico– p.6
Transiciones � (“cierr e”)
(
�
) � ( �
)
�
? � �
?
�
* � �
*
��� | � � � | ��� � � � � | ��� | � � � ��� ���� � � �
(
� ) � (
�
)
� ? � �
?
� * � �* , �
*
� + � �+ , �
+
� � � | ��� | � � � � ��� | � � � | ���
Al final, los itemscon delantede ()?*+| puedeneli-
minarseGeneracion deanalizadorlexico– p.7
Ejemplo de transiciones �
Partimosde:
T �a (a|0)*( (a|0)+)*
Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Obtenemos:
T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*
T �a(a|0)* ( (a|0)+)*
Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Obtenemos:
T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*
Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Cierrecompletado:
T �a (a|0)*( (a|0)+)*T �a( a|0)*( (a|0)+)*
T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*
Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Eliminamositemsinútiles:
T �a( a|0)*( (a|0)+)*
T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*
T �a (a|0)*( (a|0)+)*
Una transicióncon a nos daría T a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Eliminamositemsinútiles:
T �a( a|0)*( (a|0)+)*
T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*
T �a (a|0)*( (a|0)+)*
Una transicióncon a nos daría T �a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
Ejemplo de transiciones �
Eliminamositemsinútiles:
T �a( a|0)*( (a|0)+)*
T �a(a|0)*( (a|0)+)*T �a(a|0)*( (a|0)+)* T �a(a| 0)*( (a|0)+)*T �a(a|0)* ( (a|0)+)*
T �a (a|0)*( (a|0)+)*
Una transicióncon a nos daría T �a(a |0)*(_(a|0)+)*
Tras cierrey eliminación, se obtieneel mismo conjunto
Generacion deanalizadorlexico– p.8
ConstruccióndeAFD
Estadoinicial = cierredeitemsconel puntoalprincipio
Conjuntosdeitemssimultáneamenteválidosparalosdistintostokens
Asociamosacadaconjuntounestadodelautómatafinito determinista(AFD)
Lastransicionesdelautómatacorrespondena lasdelos items
Losestadosfinalesvienenindicadosporel puntoalfinal del ítem
Sereconoceel tokencorrespondienteadichoítem
Generacion deanalizadorlexico– p.9
Ejemplo deAFD
otroF
otroI
F �(D)* "."(D)+F �( D)*"."(D)+I �(D)+
F �(D)*"."( D)+ F �(D)*"."( D)+F �(D)*"."(D)+
D
"." "."
D
D
D
!#"!�!%$
!%&
F �( D)*"."(D)+I �( D)+
F �(D)* "."(D)+
I �( D)+
Generacion deanalizadorlexico– p.10
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
Correspondenciaestado-índice:
Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación
transic/decisión
Correspondenciaestado-índice:
' $ '� ' & ' "
Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación
' $ ' $
transic/decisión
'� ' &
Correspondenciaestado-índice:
' $ '� ' & ' "
0Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación
' $ ' $ '� '� '�
transic/decisión
'� ' & '� I
' &
Correspondenciaestado-índice:
' $ '� ' & ' "
0 3Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación
' $ ' & ' $ '� '� '�
transic/decisión
'� ' " ' & '� I
' &
Correspondenciaestado-índice:
' $ '� ' & ' "
0 3 1Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación
' $ ' & ' $ '� '� '� ' " ' " ' "
transic/decisión
'� ' " ' & '� I
' & ' " F F
Correspondenciaestado-índice:
' $ '� ' & ' "
0 3 1 6Generacion deanalizadorlexico– p.11
Tabla del AFD
0 1 2
' $ '� ' &
'� '� I
' &
' & ' "' " ' " F F
Códigosímbolo:
0=D
1=otro
2=“.”
Linearizaciónpordesplazamientodefilas, p.e.:
estado+símbolo 0 1 2 3 4 5 6 7 8
verificación 0 1 0 3 3 3 6 6 6
transic/decisión 3 6 1 3 I 1 6 F F
Correspondenciaestado-índice:
' $ '� ' & ' "
0 3 1 6Generacion deanalizadorlexico– p.11
Formato deun fichero flex
DeclaracionesenC entre%{ y %}
Declaracionesespecialescomenzadaspor %
Reglasde“no-terminales”auxiliares%%
Secuenciade
Expresionesregulares(patrones) desímbolosareconocer
Entrellaves,accionesenC asociadas,normalmenteterminadasen return código-del-símbolo
%%
Rutinasauxiliaresy/o main si programaindependiente
Generacion deanalizadorlexico– p.12
Generación
lex.yy.cmilex.l milexflex gcc
1. Editamosunficherodeespecificaciónmilex.l
2. Procesamoscon flex milex.l
3. Normalmentelo compilaremosjuntoconunanalizadorsintácticoproducidopor bison
4. Si introducimosmain() quellamea yylex() ,podremostenerunanalizadorléxico independiente:gcc -o milex lex.yy.c -lfl
(usaráficherose/sestándar)
Generacion deanalizadorlexico– p.13
Contenidodelex.yy.c
1. Declaracionesinicialescopiadas
2. Funciónyylex() conbucledereconocimientodepatrones:
Cadavezquereconoceuno,almacenael texto enyytext y ejecutael códigoasociadoSi másdeuno,dapreferenciaal texto demayorlongitudSi igual longitud,dapreferenciaal patrónindicadoenprimerlugar
3. Rutinasauxiliarescopiadas
El patrónespecial �(� ) � & reconoce �(� sólosi vaseguidode
� & (el texto de � & sevolveráa leer) Generacion deanalizadorlexico– p.14
Algunasaccionesespeciales
BEGIN estado: pasanaconsiderarselasexpresionesregularescomenzadaspor <estado>
ECHO: visualizayytext
yymore() : el texto actualseañadiráal delpróximotoken
yyless(n) : seconservanlosprimerosn caracteresenyytext y el restosevolveránaprocesar
Si nohayacción,ignorael texto y reanudala lecturaparaunnuevo patrón
Si noseencuentrapatrónalguno(error),sedejaatrás(y visualiza)el primercaráctery vuelve aintentarlo
Generacion deanalizadorlexico– p.15
Tratamiento deerroresenflex
Nadaespecialmenteprevisto,peropodemos(ydebemos):
Detectarcaracteresnopermitidosusando“ . ”
Detectarpatronesnopermitidos,ensucaso
Parapatroneserróneosfrecuentes,reparareltexto/símbolo,p.e.:comillaso comentariosincerrar
Visualizarlos correspondientesmensajesexplicativos
Generacion deanalizadorlexico– p.16
Ejemplo flex (1/3)
%{
#define ENTERO257
#define IDENTIF 258
int numlin = 1;
void error(char*);
%}
letra [a-zA-Z]
digito [0-9]
letdig {letra}|{digito}
Generacion deanalizadorlexico– p.17
Ejemplo flex (2/3)
%%
("+"|-)?{digito}+ {return ENTERO;}
{letra}{letdig}* {return IDENTIF;}
[-+*/] {return yytext[0];}
\n {numlin++; /* contin ua leyendo */}
[ \t] |
ˆ#.* {/* ignora */}
. {error("caracter raro");}
<<EOF>> {return 0; /* por defecto */}
Generacion deanalizadorlexico– p.18
Ejemplo flex (3/3)
%%
int main(int argc, char** argv) {
int s;
if(argc>1) yyin=fopen(argv[1],"r" ); /* else yyin=stdin */
do printf("%i ",s=yylex()); while(s != 0);
return 0;
}
void error(char* mens) {
printf("Error lexico en linea %i: %s\n",numlin,mens);
}
Generacion deanalizadorlexico– p.19
Conclusión
Un generadorautomáticonospermiteconcentrarnosenel diseñoléxicoy accionesasociadas
Desventajas:dependenciadela herramienta,costedeaprendizaje
flex puedeusarsecomofiltro potentedetexto
Másinformaciónenpáginaman flex y enlibro “le x& yacc”, deLevine etal. (681.3.06)
Generacion deanalizadorlexico– p.20