Mòdul 2. Anàlisi lèxica. L'analitzador lèxic, el sistema d'entrada i les taules de símbols
Transcript of Mòdul 2. Anàlisi lèxica. L'analitzador lèxic, el sistema d'entrada i les taules de símbols
-
Anlisi lxicaLanalitzador lxic, el sistema dentrada i les taules de smbols
Joan Codina i Banti
P03/11008/01365
-
Universitat Oberta de Catalunya P03/11008/01365 Anlisi lxica
ndex
Introducci ................................................................................................ 5
Objectius ..................................................................................................... 7
1. Organitzaci general .......................................................................... 9
1.1. Funcionament de lanalitzador lxic ................................................ 13
2. Construcci danalitzadors lxics ................................................... 15
3. Especificaci dun analitzador lxic .............................................. 19
3.1. Tractament de les paraules reservades .............................................. 20
4. Tractament derrors ........................................................................... 23
5. El sistema dentrada ........................................................................... 25
5.1. Mtode de la parella de memries intermdies ................................ 27
5.2. Mtode del sentinella ....................................................................... 28
5.3. Sistema dentrada del Lex ................................................................. 29
5.3.1. El comenament de lanlisi ................................................. 29
5.3.2. El procs danlisi .................................................................. 30
5.3.3. Lectura d un nou bloc .......................................................... 30
6. La taula de smbols ............................................................................. 32
6.1. Lestructura dels registres .................................................................. 33
6.2. Operacions ........................................................................................ 34
6.3. Organitzaci de la taula de smbols .................................................. 35
6.3.1. Taules de smbols no ordenades ........................................... 36
6.3.2. Taules de smbols amb estructura darbre nic ..................... 37
6.3.3. Taules de smbols amb estructura de bosc darbres .............. 38
6.3.4. Taules de smbols de dispersi (hash) ................................... 39
6.4. Definici dun node .......................................................................... 40
Resum .......................................................................................................... 41
Activitats .................................................................................................... 43
Exercicis dautoavaluaci ...................................................................... 43
Solucionari ................................................................................................. 45
Glossari ....................................................................................................... 48
Bibliografia ................................................................................................ 51
-
Universitat Oberta de Catalunya P03/11008/01365 5 Anlisi lxica
Introducci
En aquest mdul didctic estudiarem detalladament la primera fase del procs
de compilaci: lanlisi lxica del programa font. El mdul sha dividit en tres
grans blocs:
En el primer tractem de lanalitzador lxic prpiament dit.
En el segon estudiem detalladament el sistema dentrada.
En el tercer aprofundim en lestudi de les taules de smbols.
Aix, doncs, en el primer bloc comenarem estudiant com est organitzat lana-
litzador lxic i quins sn els principals factors que shan de tenir en compte a
lhora de dissenyar-lo. Aprofundirem en el segent:
La lectura en avanada de carcters del flux dentrada, necessria per a po-
der detectar el lexema ms llarg possible. Quan aquests carcters no sn
utilitzats, s necessari retornar-los al flux dentrada. Estudiarem diferents
mtodes que prevegin aquestes restriccions.
La detecci i el tractament de les paraules reservades del llenguatge.
Les maneres en qu es pot establir la comunicaci amb les fases posteriors
del compilador, en especial amb lanalitzador sintctic.
Desprs parlarem de com sha de comportar el compilador quan detecta un error
en el programa font i de quins sn els tipus derrors ms freqents en aquesta pri-
mera fase danlisi.
En el segon bloc estudiarem el sistema dentrada del compilador: un conjunt
de rutines independents que recullen blocs de carcters del fitxer font i els ce-
deixen un a un a lanalitzador lxic. Aquesta s lnica part de les fases dan-
lisi que es comunica amb el sistema operatiu per a accedir als carcters del
fitxer font. Per tant, per a poder exportar aquestes fases danlisi a una nova
plataforma dexecuci noms shan dadaptar aquestes rutines del sistema
dentrada per a la nova plataforma.
En el darrer bloc del mdul estudiarem la taula de smbols: lestructura de da-
des utilitzada pel compilador per a guardar la informaci dels noms del pro-
grama font (variables, constants, tipus, etc.) que es detecten durant les fases
danlisi. Veurem el segent:
Quins tipus dinformaci guarda en els seus registres.
Les operacions que shi poden aplicar.
-
Universitat Oberta de Catalunya P03/11008/01365 6 Anlisi lxica
Els diferents mtodes que sutilitzen per a organitzar la taula de smbols en
els llenguatges amb estructura de blocs, en qu sha de tenir en compte
lmbit local o global dels identificadors.
Per a poder entendre b tots els matisos daquest mdul didctic, s necessari te-
nir ben assumits els continguts de lassignatura Teoria dautmats i llenguatges
formals I, en especial els mduls didctics 1 i 2, en qu es tracta, entre altres te-
mes, dels segents:
Conjunts, cadenes i llenguatges.
Les expressions regulars utilitzades per a definir els patrons dels lexemes
dels testimonis (tokens).
Els autmats finits: leina utilitzada per a reconixer automticament els le-
xemes definits amb les expressions regulars.
-
Universitat Oberta de Catalunya P03/11008/01365 7 Anlisi lxica
Objectius
En acabar lestudi daquest mdul didctic, lestudiant hauria dhaver assolit
els objectius segents:
1. Copsar lestructura, organitzaci i funcionament general de lanalitzador
lxic.
2. Saber definir els testimonis dun llenguatge utilitzant expressions regulars.
3. Conixer els diferents tipus derrors que es poden produir en aquesta fase.
4. Saber utilitzar un generador automtic danalitzadors lxics.
5. Construir les expressions regulars dun llenguatge senzill i programar-les
en un generador automtic danalitzadors lxics.
6. Conixer les diferents maneres en qu es poden detectar les paraules reser-
vades dun llenguatge.
7. Entendre els avantatges dun sistema dentrada independent.
8. Aprofundir en les organitzacions bsiques del sistema dentrada i en el seu
funcionament.
9. Saber com sutilitza la taula de smbols en les diferents fases del compilador,
i tamb conixer-ne lestructura i les operacions que shi poden fer.
10. Conixer els diferents tipus dorganitzaci de la taula de smbols per a
llenguatges ds general amb estructura de blocs.
-
Universitat Oberta de Catalunya P03/11008/01365 9 Anlisi lxica
1. Organitzaci general
Lanalitzador lxic, tamb anomenat explo-
rador o scanner, representa la primera fase de
lexecuci del compilador. s lencarregat de
llegir un a un els carcters del fitxer dentra-
da i agrupar-los formant els lexemes de les
entitats lxiques primries, anomenades tes-
timonis (tokens). s a dir, transforma els carc-
ters del programa dentrada en una seqncia
de testimonis que sn transferits a lanalitza-
dor sintctic, anomenat tamb parser o sim-
plement analitzador, la segona etapa del
procs de compilaci.
Vegem algunes situacions que es poden do-
nar en el fitxer font:
Si a lentrada tenim els carcters 12573;, lanalitzador lxic els llegir un
a un i trobar que el lexema 12573 coincideix amb el patr del testimoni
CONSTANT_ENTERA i que el lexema ; coincideix amb el patr del testi-
moni PUNT_I_COMA.
Si comparem les expressions (en qu reemplacem els carcters en blanc
pel smbol per a llegir-ho millor) a := b 7 + 4 ;,
a :=b7+4 ; veiem que lestructura de les dues expressions s equi-
valent, per que la posici dels carcters que les componen, tot i que se-
gueixen el mateix ordre, sn diferents.
Si comparem tamb a := b 7 + 4 ; i d := b 11 + 8 ;,veiem que les estructures tamb sn equivalents i que noms canvien els
valors dels nmeros i els noms de les variables.
De tot aix podem deduir que diferents distribucions de carcters donen lloc
a una mateixa estructura de programa.
Si les diferents fases del compilador haguessin de treballar sempre directament
amb els carcters, la recerca de lestructura del programa es complicaria molt. s
per aix que la primera fase del compilador, lanalitzador lxic, s lencarregada
del processament dels carcters del fitxer dentrada.
Podem dir que les tasques especfiques de lanalitzador lxic sn les segents:
Reconixer els components lxics del llenguatge.
-
Universitat Oberta de Catalunya P03/11008/01365 10 Anlisi lxica
Eliminar els espais en blanc, els carcters de tabulaci, els salts de lnia i de
pgina i altres carcters propis del dispositiu dentrada.
Eliminar els comentaris del programa font.
Reconixer els identificadors de variables, tipus, constants, etc. i guardar-
los en la taula de smbols.
Avisar dels errors lxics que detecti.
Relacionar els missatges derror del compilador amb el lloc en qu aparei-
xen en el programa font (lnia, columna, etc.).
Daltra banda, per a poder verificar eficientment lestructura del programa
font, se sol separar lanalitzador lxic de lanalitzador sintctic: lanalitzador
lxic es concentra a filtrar el fitxer dentrada, elimina els carcters innecessaris
i proporciona una seqncia equivalent de testimonis a lanalitzador sintctic,
que nicament es concentrar a comprovar lestructura del programa font.
Amb aquesta separaci de tasques, obtenim els avantatges segents:
Se simplifiquen les parts danlisi: lanalitzador sintctic no sha de preocu-
par de rebre carcters inesperats, ja que el fitxer font s filtrat per lanalit-
zador lxic.
El disseny general es fa ms clar i comprensible.
Es millora leficincia del compilador en conjunt, en poder-se aplicar tc-
niques ms eficients i depurades en cada fase. Per exemple, les rutines de
lectura del programa font es poden programar directament en llenguatge
dassemblador i incorporar-hi tcniques especials de lectura que naugmen-
tin la velocitat.
Saugmenta la portabilitat del compilador. Si es vol canviar alguna caracte-
rstica de lalfabet dentrada o de la plataforma dexecuci nhi ha prou
amb modificar la part afectada de lanalitzador lxic i deixar lanalitzador
sintctic intacte.
Lanalitzador lxic tamb ha de tenir molta cura de trobar sempre el testimoni
amb el lexema ms llarg possible quan llegeix carcters del fitxer font.
Per aconseguir-ho, sol ser necessari llegir diversos carcters en avanada per a
poder decidir si es fa referncia a un component lxic o a un altre. Per exem-
ple, si a lentrada tenim els carcters >b, quan es troba > cal llegir el carcter
segent per a determinar si es fa referncia al testimoni MES_GRAN (>) o al
testimoni MES_GRAN_O_IGUAL (>=). En el primer cas, el carcter llegit en
Se separa lanlisi lxicade la sintctica per a: Simplificar les parts. Millorar leficincia. Augmentar la portabilitat.
Accions a les quals cal prestar especial atenci
Lectura de carcters en avanada.
Retorn de carcters al flux dentrada.
Longitud til dels identifi-cadors.
-
Universitat Oberta de Catalunya P03/11008/01365 11 Anlisi lxica
avanada b sha de retornar al flux dentrada, ja que pot ser el comenament
dun nou testimoni.
En el mateix sentit, cal tenir en compte que els identificadors solen tenir una lon-
gitud til, de manera que dos identificadors noms sn diferents si es diferencien
dins la longitud til. Aix, doncs, si la longitud til s 6, Valordereferencia
i Valordeimpacte representen el mateix identificador Valord.
Tot seguit, i per a aclarir millor el funcionament de lanalitzador lxic, analit-
zem un exemple en qu intervinguin uns quants testimonis. Per exemple, da-
vant la seqncia de carcters dentrada
IF valor = 20 THEN valor := valor + 1 ;
lanalitzador lxic generaria la seqncia de testimonis segent:
1. IF
2. IDENTIFICADOR
3. IGUALTAT
4. CONSTANT_ENTERA
5. THEN
6. IDENTIFICADOR
7. ASSIGNACI8. IDENTIFICADOR
9. SUMA
10.CONSTANT_ENTERA
11.PUNT_I_COMA
Aquesta informaci s suficient per a analitzar lestructura de la sentncia,
per per a verificar-ne el significat semntic cal ms informaci. Aix, doncs,
cal associar una nova dada a cada testimoni que ens proporcioni aquesta in-
formaci. De manera simple: a ms del valor del testimoni, desem el valor del
lexema o un apuntador en una posici de la taula de smbols en qu es guarda
la informaci relacionada amb el lexema (aquest seria el cas dels identificadors
de les variables, les constants o els tipus).
Per tant, lanalitzador sintctic rep realment una parella de dades:
El component del llenguatge font identificat (testimoni): una paraula re-
servada, un identificador, un operador lgic, un operador aritmtic, etc.
Un registre amb el conjunt de valors datributs associats.
Si continuem amb lexemple anterior, en les columnes de la taula segent ve-
iem, pels carcters de lentrada, el nom del testimoni trobat i el valor numric
(inventat) amb qu es codifica, el lexema i, en cas de ser un identificador o una
Les taules de smbols guarden informaci sobre els diferents identificadors: les variables, les constants,els tipus, etc.
-
Universitat Oberta de Catalunya P03/11008/01365 12 Anlisi lxica
constant, la posici de la taula de smbols en qu es guarda. En la darrera co-
lumna tenim la parella de dades que es passa a lanalitzador sintctic:
Algunes vegades es requereix ms interacci entre lanalitzador lxic i el sintctic.
Per exemple en C, typedef int color; crea una nova paraula clau en el llen-
guatge. Per tant, si ms endavant lanalitzador lxic troba color no haur de re-
tornar IDENTIFICADOR, sin que haur de reconixer una PARAULA_CLAU.
Aix saconsegueix fent que lanalitzador sintctic introdueixi una nova entrada
en la taula de smbols compartida que indiqui que lidentificador color sha de
tractar com una paraula clau.
Lanalitzador lxic s lnica fase del compilador que ha de llegir el fitxer font. Per-
qu sigui el mxim dindependent possible de lentorn, aquesta lectura la fa un
mdul independent altament especialitzat: el sistema dentrada. Aix, doncs, si
es vol variar la plataforma dexecuci nhi haur prou amb modificar noms el sis-
tema dentrada perqu lanalitzador lxic funcioni en la nova plataforma:
Carctersde lentrada Nom del component lxic
Valor numric delcomponent lxic
Lexemadel component
lxic
Posicien la taula de smbols
Parellapassada
a lanalitzador sintctic
IF IF 10 IF 10, IF
valor IDENTIFICADOR 20 valor 17 20, 17
= IGUALTAT 33 = 33,=
20 CONSTANT_ENTERA 21 20 110 21,110
THEN THEN 11 THEN 11,THEN
valor IDENTIFICADOR 20 valor 17 20,17
:= ASSIGNACI 32 := 32,:=
valor IDENTIFICADOR 20 valor 17 20,17
+ SUMA 39 + 39,+
1 CONSTANT_ENTERA 21 1 111 21,111
; PUNT_I_COMA 55 ; 55,;
El sistema dentrada s lnica part de la fase danlisi que llegeix el fitxer font.
-
Universitat Oberta de Catalunya P03/11008/01365 13 Anlisi lxica
1.1. Funcionament de lanalitzador lxic
Com hem dit, la tasca principal de lanalitzador lxic s proporcionar parelles
testimoni-atributs a lanalitzador sintctic. En aquesta lnia, els dos analitza-
dors solen funcionar com una parella productor-consumidor.
s per aix que lanalitzador lxic sol ser creat com una funci independent que
sactiva cada cop que lanalitzador sintctic demana un nou testimoni:
Quan lanalitzador sintctic fa una petici dun nou testimoni a lanalitzador
lxic, aquest analitza la cadena dentrada carcter a carcter fins a obtenir un
nou testimoni que retorna juntament amb els seus atributs a lanalitzador sin-
tctic. Aquesta organitzaci t una srie davantatges:
En ser fases independents, lanalitzador lxic i lanalitzador sintctic po-
den tenir ms nivell despecialitzaci i poden ser modificats sense afectar
la resta del compilador.
El sistema dentrada es pot optimitzar i llegir en una sola operaci una gran
quantitat de carcters del flux dentrada. A partir daleshores, saugmenta
la velocitat daccs als carcters en accedir a dades que sn a la memria
de lordinador, ms rpida que no el disc.
Les particularitats de llegir el codi font sota diferents plataformes dexecu-
ci es confinen al sistema dentrada de lanalitzador lxic.
Com que el codi de lanalitzador lxic s molt semblant en la majoria dels
compiladors de llenguatges ds general, es pot reaprofitar canviant noms
les taules de definici del mateix llenguatge (paraules clau, operadors, etc.)
i augmentar-ne daquesta manera la portabilitat.
Lanalitzador lxic produeix testimonis que lanalitzador sintcticconsumeix.
-
Universitat Oberta de Catalunya P03/11008/01365 14 Anlisi lxica
Notes sobre els llenguatges, les expressions regulars i els autmats finits
En arribar a aquest punt, ats que lespecificaci formal dels analitzadors lxics es fa ambexpressions regulars i la seva programaci amb autmats finits, seria convenient fer unreps de lassignatura Teoria dautmats i llenguatges formals I, en especial:
Mdul didctic 1: Alfabets, mots i llenguatges, en qu sestudien els conceptes bsicsde la teoria de llenguatges formals.
Mdul didctic 2: Autmats finits i llenguatges regulars, en qu sestudien els aut-mats finits deterministes i indeterministes i les expressions regulars.
No es intenci de lassignatura avaluar-vos sobre aquesta matria ja estudiada en una al-tra assignatura, per s que s convenient per al bon aprenentatge dels compiladors queels conceptes que shi estudien estiguin ben assolits.
-
Universitat Oberta de Catalunya P03/11008/01365 15 Anlisi lxica
2. Construcci danalitzadors lxics
Per a implementar un analitzador lxic, generalment es fa servir un dels tres
mtodes segents:
1. Sescriu directament en llenguatge dassemblador: si est ben fet, sobt
una eficincia mxima, per s complicat de programar i de validar.
2. Sescriu en un llenguatge dalt nivell aprofitant-ne les funcions dentrada
i de sortida: sobt una bona eficincia, per sha de programar tot a m.
3. Sutilitza un generador automtic danalitzadors lxics com el Lex: a par-
tir de les expressions regulars que defineixen els patrons que representen els
testimonis del llenguatge i de les accions que cal fer quan es trobin aquests pa-
trons, genera automticament el codi dun analitzador lxic que reconeix aquests
testimonis. El codi generat pot ser poc eficient i de manteniment complicat, per
el desenvolupament s rpid i cmode.
Si es vol desenvolupar un nou analitzador lxic en un llenguatge dalt nivell a
m, es poden utilitzar estructures de decisi mltiple tipus case o switch. Per a
detectar els lexemes ms llargs possibles, ser necessari retornar carcters al flux
dentrada. El codi segent mostra les bases daquesta tcnica utilitzant el llen-
guatge C:
int explorador (void){ c = noucaracter (); /funci del sistema dentrada /
switch (c){ case :
case \t:case \n: break; /no fer res pels separadors /case +:
case : return (OPERADOR_SUMA);case :
case /: return (OPERADOR_MULTIPLICAR);/.... aqu vindrien la resta dels operadors i smbols de puntuaci per ordre de precedncia /default: if (esnumero(c))
{/es llegeixen carcters mentre siguin nmeros i es retorna al flux dentrada el darrercarcter llegit, es guarda el lexema llegiti es retorna amb el testimoni NOMBRE_ENTER /return(NOMBRE_ENTER);
}else if (eslletra(c))
Lex
Programa que, a partir de les expressions regulars que defineixen els testimonis dun llenguatge, genera automti-cament un autmat que les reconeix.
-
Universitat Oberta de Catalunya P03/11008/01365 16 Anlisi lxica
De totes maneres, una manera millor consisteix a dissenyar un autmat finit
que reconegui les expressions regulars dels testimonis i, segons el carcter de
lentrada i lestat actual, fer el canvi destat indicat en la taula de transicions
de lautmat finit.
Quant a la darrera tcnica, la dutilitzar un generador danalitzadors lxics, el
programa segent mostra un tros de codi utilitzat per a crear un analitzador
lxic que reconeix els testimonis del llenguatge Pascal. Podreu veure que no-
ms amb unes quantes lnies de codi nhi ha prou per a generar un programa
que reconegui els testimonis de tot el llenguatge Pascal. De moment no s ne-
cessari que comprengueu totes les lnies de codi, per ms endavant us pot ser-
vir de guia per a resoldre les activitats daquest mdul.
El codi est programat en una versi de Lex que genera codi Pascal, i s per
aix que les rutines de suport (commenteof, upper i is_keykord) i la defini-
ci de les variables globals estan escrites en Pascal.
{/es llegeixen carcters mentre siguin lletres o nmeros i es retorna al flux dentrada el darrercarcter llegit, es guarda el lexema llegit i esmira si es una paraula clau. Es retorna IDENTIFICADOR o la paraula clau/ return(testimoni);
}} / del switch /
} / de lexplorador /
(Les paraules clau (keywords) es troben examinant una taula de paraules clau en comptes dintroduir cada patr al codi font Lex. Amb aix saconsegueix un codi ms llegible i no ens hem de preocupar de si estan en majscules o minscules. Si no, shauria descriure alguna cosa com ara [Aa][Nn][Dd] per a detectar la paraula clau and. Es genera tamb un autmat ms eficient (184 estats i 375 transicions per a la versi amb patrons, davant de 40 estats i 68 transicions per a la versi amb taula de paraulesclau).
Aquest programa no funciona individualment, sin juntament amb el Yacc, que el crida cada vegada que necessita un testimoni. Quan lanalitzador lxic el troba fa un return(testimoni) i esqueda a lespera de tornar a ser cridat.)
(Primera part del programa, en qu sinclouen les rutines complementries i les definicions de patrons bsics com a constants.)procedure commenteof;
beginwriteln(Trobat EOF (final de fitxer) dins un comentari, a
la lnia , yylineno);end(commenteof);
Un exemple daquest cas s el que es mostra en la figura que illustra lapartat Especificaci dun analitzador lxic.
Podeu trobar ms informaci del Pascal Lex-Yacc en lespai de material associat de lassignatura.
-
Universitat Oberta de Catalunya P03/11008/01365 17 Anlisi lxica
function upper(str : string) : string;(Converteix str a majscules.)var i : integer;begin
for i := 1 to length(str) dostr[i] := upcase(str[i]);
upper := strend(upper);
function is_keyword(id : string; var token : integer) : boolean;(Mira si s una paraula clau de Pascal i retorna el nmero de testimoni corresponent a token.)const
id_len = 20;type
Ident = string[id_len];const
no_of_keywords = 39; (taula de paraules clau Pascal)keyword : array [1..no_of_keywords] of Ident = (
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,EXTERNAL,EXTERN,FILE,FOR,FORWARD,FUNCTION,GOTO,IF,IN,LABEL,MOD,NIL,NOT,OF,OR,OTHERWISE,PACKED,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH);
keyword_token : array [1..no_of_keywords] of integer = (_AND,_ARRAY,_BEGIN,_CASE,_CONST,_DIV,_DO,_DOWNTO,_ELSE,_END,_EXTERNAL,_EXTERNAL,_FILE,_FOR,_FORWARD,_FUNCTION,_GOTO,_IF,_IN,_LABEL,_MOD,_NIL,_NOT,_OF,_OR,_OTHERWISE,_PACKED,_PROCEDURE,_PROGRAM,_RECORD,_REPEAT,_SET,_THEN,_TO,_TYPE,_UNTIL,_VAR,_WHILE,_WITH);
var m, n, k : integer;begin
id := upper(id); (cerca binria)m := 1; n := no_of_keywords;is_keyword := falsewhile (m keyword[k] then
m := k + 1else
n := k 1end
end(is_keyword);%}
NQUOTE [^] (definici de: qualsevol cosa menys cometes)%%(Comenament de la segona part, en qu es defineixen dues variables i tots els patrons dels testimonis de la gramtica Pascal.)%{var c : char;
Els testimonis comencen amb el carcter _ per tal de diferenciar el lexema del nom del testimoni.
lexema: ANDtestimoni: _AND
-
Universitat Oberta de Catalunya P03/11008/01365 18 Anlisi lxica
kw : integer;%}
[azAZ]([azAZ09]) if is_keyword(yytext, kw) thenreturn(kw)
elsereturn(IDENTIFIER);
":=" return(ASSIGNMENT);({NQUOTE}|)+ return(CHARACTER_STRING);":" return(COLON);"," return(COMMA);[09]+ return(DIGSEQ);"." return(DOT);".." return(DOTDOT);"=" return(EQUAL);">=" return(GE);">" return(GT);"[" return(LBRAC);"
-
Universitat Oberta de Catalunya P03/11008/01365 19 Anlisi lxica
3. Especificaci dun analitzador lxic
Tot seguit definirem formalment una srie de mots referents a aquesta fase,
que, tot i que ja els hem utilitzat al llarg del mdul, conv tenir clars:
Testimoni: un testimoni s un smbol terminal de la gramtica que defi-
neix el llenguatge. Poden ser els signes de puntuaci, els operadors aritm-
tics i lgics, les paraules reservades, els identificadors, les cadenes de
carcters, etc. Cada testimoni t el seu propi nom, per exemple WHILE o
STRING.
Patr: s una expressi regular que defineix el conjunt de cadenes de carcters
que poden representar un testimoni. Per exemple, (09)+ identificar una ca-
dena formada per un o ms nmeros, una CONSTANT_ENTERA.
Lexema: s la cadena de carcters del codi font que coincideix amb el patr
dun testimoni. s a dir, quan en analitzar el codi font es troba un testimo-
ni, el conjunt de carcters que han donat lloc a aquest testimoni s el seu
lexema. Per exemple, el lexema 1463 coincideix amb el patr (09)+ que
defineix el testimoni CONSTANT_ENTERA.
Atribut: cada testimoni t una srie datributs associats que lanalitzador
lxic ha de proporcionar per les fases danlisi segents. En general, es pot
considerar que tota la informaci associada a un testimoni es guarda en
una nica estructura de dades de tipus registre que cont, entre altres da-
des, el lexema, el nmero de lnia i la columna en qu sha trobat.
Quan lanalitzador lxic troba un lexema coincident amb el patr dun testi-
moni, retorna a lanalitzador sintctic el testimoni i tot el que en sap dins el
registre datributs.
La taula segent mostra alguns exemples de testimonis, els lexemes, les ex-
pressions regulars del patr i de quin seria el codi Lex equivalent (suposem que
les majscules i les minscules sn equivalents):
Lexema: 1234Patr: (09)+Testimoni: CONSTANT_ENTERA
Testimoni Lexema Patr o expressi regular Codi Lex
IDENTIFICADOR Valor
Temperatura
j121
(a+..+z+A+..+Z+_)(a+..+z+A+..+Z+_+0+..+9) (azAZ_)(azAZ09_)
NOMBRE_ENTER 17935429
0(0+..+9)(0+..+9) (09)+
MS_GRAN_O_IGUAL >= >= >=
-
Universitat Oberta de Catalunya P03/11008/01365 20 Anlisi lxica
La programaci manual de lanalitzador lxic es fa a partir de les expressions
regulars que defineixen els testimonis, i es crea un autmat finit per a cada
una. Aquests autmats es combinen en una nica mquina reconeixedora
que, a partir dun estat inicial i els carcters de lentrada, segueix un recorregut
pels estats de la mquina. Si sarriba a un estat dacceptaci, es retorna el tes-
timoni pertinent; si no shi arriba o troba un carcter que no li permet de fer
cap canvi destat, retorna un error.
Autmat finit que reconeix smbols bsics (>, =, . /, +, , etc.), smbols compostos (>=, ,
-
Universitat Oberta de Catalunya P03/11008/01365 21 Anlisi lxica
2. Es pot crear una taula de paraules clau i quan es troba un identificador consul-
tar-la per a veure si s una paraula clau o no. s el cas de la funci is_keyword del
codi Lex anterior:
[azAZ]([azAZ09]) if is_keyword(yytext, kw) thenreturn(kw)
else
return(IDENTIFIER);
s a dir, es tracten les paraules clau com un cas particular del patr dels iden-
tificadors. Quan es detecta un identificador:
Es mira si s una paraula clau.
Si no ho s vol dir que s un identificador, i sha de mirar si ja est introdut
en la taula de smbols.
Si no s a la taula de smbols, shi ha de donar dalta i retornar un testimoni
identificador.
3. Sinicialitzen les primeres posicions de la taula de smbols amb les paraules
clau del llenguatge (ordenades alfabticament per a facilitar la recerca i laccs).
Quan es troba un identificador es consulta la taula de smbols:
Si es troba en la zona inicial reservada, s una paraula clau i sen retornar
el testimoni.
Si es troba en la part final de la taula, voldr dir que s un identificador (que
ja shavia trobat anteriorment al codi font).
Si no t una entrada en la taula de smbols, shi ha dafegir com un nou
identificador.
Exemple
Lexema Testimoni
AND _AND
Zona de paraules reservades
ARRAY _ARRAY
BEGIN _BEGIN
CASE _CASE
.....
ValorX IDENTIFICADOR
Zona didentificadorsTest_B IDENTIFICADOR
......
Aquest mtode evita haver de mirar la taula de paraules clau i la taulade smbols alhora.
-
Universitat Oberta de Catalunya P03/11008/01365 22 Anlisi lxica
Activitat
Utilitzeu un generador automtic danalitzadors lxics, com el programa Lex, per a crearun analitzador lxic que reconegui nmeros enters i cadenes de carcters separades perespais. Quan els trobi, ha de mostrar per pantalla el testimoni que ha trobat i el seu lexe-ma de la manera segent:
cadena: Benvingutscadena: alnombre: 3cadena: aniversari
-
Universitat Oberta de Catalunya P03/11008/01365 23 Anlisi lxica
4. Tractament derrors
En la majoria de les execucions dun compilador, el programa font pot conte-
nir molts tipus diferents derrors que sn detectats en moments diversos del
procs de compilaci.
Exemple
Durant l'anlisi lxica: identificadors amb carcters no permesos.Durant lanlisi sintctica: uns parntesis mal equilibrats.Durant lanlisi semntica: variables no declarades.Durant lexecuci del programa objecte: una divisi per zero.
Durant el disseny de cada fase del compilador, sempre sha de tenir en compte
com respondr el compilador quan detecti un error. Aix s especialment cert en
lanlisi sintctica, en qu es detecten la majoria dels errors que desobeeixen les
regles gramaticals que defineixen un llenguatge de programaci. Per a fer correc-
tament aquest tractament dels errors, s indispensable que el compilador:
Sigui capa de detectar errors en lentrada.
Es recuperi sense perdre gaire informaci.
Produeixi un missatge derror que permeti al programador de trobar i cor-
regir fcilment els elements incorrectes del programa, per exemple, mos-
trant el contingut de la lnia i la columna en qu sha produt i un missatge
de diagnstic suficientment explicatiu.
Exemple
Error 124 Falta declaraci Error a la lnia 85 Sha produt un error
Aquest tipus de missatges no sn gaire tils per al programador. Una sortida millor seriala segent:
ValorX := ValorY + 1 ;^
ERROR 124: lnia 85, columna 5, no sha declarat la variable ValorX
A ms dhaver-hi uns errors tpics de cada fase de la compilaci, cada llenguat-
ge tamb t els seus errors tpics.
En Pascal sha observat estadsticament el segent:
El 40% dels programes sn sintcticament o semnticament incorrectes. El 80% de les proposicions incorrectes tenen un nic error. El 10% dels errors lxics sn deguts a la falta dun END. El 13% dels errors lxics sn deguts a escriure , en comptes de ;. El 9% dels errors lxics sn deguts a escriure = en comptes de :=.
Cada fase detecta i tracta els seus propis errors
El missatge derror ha de ser aclaridor de lerror que sha detectat.
-
Universitat Oberta de Catalunya P03/11008/01365 24 Anlisi lxica
Quan en un moment del procs de compilaci es detecta un error:
Sha de mostrar un missatge derror clar i exacte, de manera que la infor-
maci que es doni al programador li permeti de trobar i corregir fcilment
els errors del programa.
Sha de recuperar de lerror i anar a un estat en qu es pugui continuar ana-
litzant el programa sense provocar efectes indesitjables (com una cascada
derrors o el fet de no detectar-ne daltres). El propsit daquesta recupera-
ci s poder continuar la recerca de nous errors, per en cap cas corregir el
codi font.
No ha de retardar excessivament el processament de programes correctes.
Errors ms caracterstics de la fase danlisi lxica
En general, els errors lxics es deuen a un descuit del programador i provo-
quen un error del tipus error de sintaxi. Quan es detecta un daquests errors,
el procs de recuperaci es pot fer aplicant diferents tcniques:
Ignorant els carcters invlids fins a formar un testimoni correcte.
Eliminant els carcters estranys.
Intentant de corregir lerror:
Inserint els carcters que puguin faltar.
Reemplaant un carcter presumptament incorrecte per un de correcte.
Commutant les posicions de dos carcters adjacents.
Sha de dir, per, que aquestes tcniques sn complicades de fer i molt perillo-
ses, ja que poden resultar equivocades per a la resta de lanlisi.
Tipus derror Explicaci i subtipus Exemple
Noms illegals didentificadors Un nom de variable que cont carcters invlids. h24@
Nmeros invlids Cont carcters invlids.
Est format incorrectament.
s massa gran i produeix desbordament.
2:13
2.12.1
99999999999
Cadenes incorrectes de carcters Cadena massa llarga, probablement per falta de les cometes de tancament.
Errors dortografia en paraules reservades
Carcters omesos.
Carcters addicionats.
Carcters incorrectes.
Carcters barrejats.
wile
whhile
whrle
wihle
Etiquetes illegals Massa llargues.
Cont carcters invlids.
Fi darxiu Es detecta un final de fitxer a la meitat dun component lxic.
-
Universitat Oberta de Catalunya P03/11008/01365 25 Anlisi lxica
5. El sistema dentrada
En aquest segon bloc del mdul didctic, aprofundirem en lestudi del sistema
dentrada de lanalitzador lxic: el conjunt de subrutines que interactuen amb el
sistema operatiu per a la lectura de dades dels dispositius externs. Aquestes rutines
solen dissenyar-se com un mdul independent que es comunica amb lanalitza-
dor lxic amb el pas de parmetres i el valor de retorn de les funcions.
El sistema dentrada i lanalitzador lxic funcionen com una parella productor-
consumidor; la mateixa manera de funcionar de lanalitzador lxic respecte a
lanalitzador sintctic.
Amb aquesta distribuci de tasques es millora el segent:
Leficincia, ja que les rutines daccs al fitxer dentrada poden estar alta-
ment especialitzades i optimitzades.
La portabilitat, ja que, de totes les fases danlisi del compilador, noms
aquestes rutines del sistema dentrada sn les que es comuniquen amb el
sistema operatiu. Per a migrar les fases danlisi dun compilador a una al-
tra plataforma dexecuci, noms shauran de modificar les rutines del sis-
tema dentrada de lanalitzador lxic.
Si analitzem com es produeix laccs als carcters del fitxer dentrada, ens ado-
narem de la importncia que el compilador tingui un sistema dentrada molt
eficient.
Vegem quin s el moviment de les dades si triem C com a llenguatge dimple-
mentaci. Quan una variable de tipus cadena dun programa C vol accedir a
un carcter dun fitxer, el carcter passa per diferents estructures de dades:
Del disc a la memria intermdia gestionada pel sistema operatiu.
A una segona memria intermdia que correspon a una estructura FILE
de C.
A la variable del programa de tipus string, encarregada de guardar el ca-
rcters llegits al fitxer.
Aix, doncs, si el compilador no utilitzs un sistema dentrada propi, cada vegada
que sacceds a un carcter shaurien de fer el tres passos anteriors. Com que al
llarg de la compilaci es llegeixen molts carcters, aquest conjunt doperacions
necessries per a accedir a un nic carcter consumirien molt de temps, en espe-
cial si es llegeix un sol carcter de disc cada cop.
El sistema dentrada produeix els carcters a mesura que lanalitzador lxic els necessita.
El problema principal de llegir un carcter cada cop s que laccs al disc s molt lent.
-
Universitat Oberta de Catalunya P03/11008/01365 26 Anlisi lxica
Com que lanalitzador lxic ha de detectar sempre el testimoni amb el lexema
ms llarg possible, un altre aspecte que cal tenir en compte, abans de poder
determinar correctament de quin testimoni es tracta, s la necessitat de llegir
carcters en avanada (lookahead).
Exemple de lectura dun carcter en avanada
Quan en el llenguatge C es llegeix el carcter =, s necessari llegir el carcter segent pera determinar si el testimoni correcte s una IGUALTAT == o una ASSIGNACI =. Si elcarcter segent no es un =, sha de detectar el testimoni ASSIGNACI i retornar el ca-rcter llegit al flux dentrada (pushback). En cas contrari, sha de detectar una IGUALTATi continuar lanlisi.
El problema de retornar carcters a lentrada s que, en general, noms shi pot
retornar un sol carcter. Per exemple, en C sutilitza la comanda ungetc() per a re-
tornar el darrer carcter llegit al flux dentrada, per aquesta funci noms fun-
ciona per a una nica devoluci. Si shan de retornar dos carcters, shan de
cercar altres mtodes.
Vegem un cas ms complex utilitzant un llenguatge que reconeix els tres tes-
timonis amb lexemes cama, llarg i camallarga. Si a lentrada hi ha la ca-
dena de carcters camallarg, lanalitzador lxic ha de retornar els testimonis
corresponents als lexemes cama i llarg. Per abans de poder decidir de
quin testimoni es tracta, desprs de trobar camallarg ser necessari llegir un
nou carcter per a intentar de cercar el testimoni ms llarg possible, camallar-
ga. Quan llegeix lespai en blanc ja est en condicions de decidir que ha tro-
bat el testimoni cama. En aquest punt, haur de retornar sis carcters al flux
dentrada llarg. Aix en C no es pot fer directament.
Per a solucionar aquests problemes de la lectura dels carcters del fitxer font,
el sistema dentrada de lanalitzador lxic ha dutilitzar una memria interm-
dia prpia, de manera que:
Llegeix un bloc de carcters de disc i el guarda en la memria intermdia.
A ms, fa servir uns apuntadors per a assenyalar la porci que ja ha estat
analitzada.
Si shan de retornar carcters al flux dentrada, mou lapuntador enrere tan-
tes posicions com carcters shagin de retornar.
Aquesta soluci augmenta molt leficincia del compilador, ja que, en comp-
tes de llegir carcter a carcter el fitxer dentrada guardat en el disc un dispo-
sitiu daccs lent, es llegeix de cop tot un bloc de carcters (aprofitant les
comandes de lectura de blocs del sistema operatiu) que es guarda en una me-
mria intermdia de la memria de lordinador un dispositiu daccs rpid.
Es treballa, per tant, amb dades emmagatzemades en memria.
Qualsevol sistema dentrada hauria de complir una srie de requisits:
Ser el mxim de rpid possible, sense fer cpies innecessries dels carcters
de lentrada.
El problema de trobar el lexema msllarg s que requereix llegir carcters en avanada i retornar carcters al flux dentrada.
Ls duna memria intermdia que somple amb un bloc de carcters consecutius millora la velocitat daccs als carcters.
-
Universitat Oberta de Catalunya P03/11008/01365 27 Anlisi lxica
Proveir de diversos carcters de lectura en avanada i de retorn a lentrada.
Suportar lexemes de longitud considerable.
Tenir disponibles el lexema actual i lanterior.
Permetre un accs eficient al disc.
Seguidament, estudiarem tres mtodes de gesti del sistema dentrada que com-
pleixen aquests requisits.
5.1. Mtode de la parella de memries intermdies
Abans dexplicar el funcionament daquest mtode, recordem de manera sen-
zilla com est organitzat laccs al disc en la majoria de sistemes operatius.
El disc est organitzat en sectors que, per imposici del maquinari, han de ser
llegits de cop, com una unitat. Si es demana al sistema operatiu (SO) de llegir
un byte, el SO llegeix tot el sector on es troba el byte i el guarda a la seva memria
intermdia (buffer). Si desprs es demana al SO daccedir a bytes adjacents, el SO
els agafa directament de la memria intermdia. Quan se li demana un byte que
correspon a un altre sector que no t guardat a la memria intermdia, el SO
guarda si s necessari el contingut de la memria al disc i desprs llegeix tot el
nou sector de disc i el posa a la memria.
Alguns sistemes operatius imposen que en cada accs al disc shagin de llegir
n sectors de cop. Aquesta unitat mnima daccs a disc s lanomenada unitat
dassignaci (allocation unit o cluster). Aquesta limitaci fa que, per a tenir una
eficincia mxima, el nombre de carcters que llegeix el sistema dentrada del
compilador sigui mltiple del nombre de bytes de la unitat dassignaci.
El mtode de la parella de memries intermdies divideix aquesta memria en
dues meitats dn bytes cadascuna (n s mltiple de la longitud de la unitat dassig-
naci: 1.024, 4.096, etc.).
Estat del sistema en un moment qualsevol de lanlisi
El sistema dentrada, per a reduir els accessos al disc i millorar leficincia, llegeix un nombre de bytes mltiple del valor de la unitat dassignaci.
-
Universitat Oberta de Catalunya P03/11008/01365 28 Anlisi lxica
Veiem que el sistema utilitza dos apuntadors per a delimitar el lexema del tes-
timoni actual: un de comenament i un de capdavanter.
Dentrada, tots dos apuntadors assenyalen el primer carcter del lexema i, a
mesura que lanalitzador lxic demana carcters, el capdavanter es mou enda-
vant fins que lanalitzador lxic troba una coincidncia amb el patr dun
testimoni. Un cop el lexema ha estat detectat i tractat, el punter comena-
ment es mou fins on s capdavanter i es continua amb lanlisi del testimoni
segent.
Cada cop que es mou el capdavanter es fa una doble comprovaci:
Es verifica si sha arribat al final de fitxer (EOF).
Es verifica si sha arribat al final duna meitat de la memria intermdia i,
en aquest cas, es llegeix laltra meitat. Funciona com una llista circular: si
se sobrepassa el bloc A, es llegeix el B i, si se sobrepassa el B, es llegeix lA.
Per tant, cada cop que es dna una ordre de lectura al sistema operatiu, es
recarrega una meitat de la memria, tal com es mostra en el codi segent:
capdavanter = capdavanter.segentsi capdavanter.contingut = EOF aleshores acabarsi capdavanter = fi_de_bloc_A aleshores llegir (bloc_B)sino, si capdavanter = fi_de_bloc_B aleshores llegir (bloc_A)
Aquest mtode t dues limitacions importants:
1) El nombre de carcters de preanlisi est limitat i, per tant, el nombre m-
xim de carcters dun lexema s n (aix no t gaire importncia quan la longi-
tud de la memria intermdia n s prou gran, com sol ser normalment).
2) s poc eficient. En avanar el capdavanter es requereix avaluar normal-
ment tres expressions lgiques que es compleixen molt poques vegades al llarg
de lanlisi: final del fitxer, final del bloc A i final del bloc B.
5.2. Mtode del sentinella
Aquest mtode funciona gaireb igual que el mtode de la parella de memries
intermdies. Millora lalgorisme afegint un byte ms a cada bloc en qu es guar-
dar un carcter sentinella (normalment el carcter EOF). Aix, doncs, cada cop
que savana el capdavanter es fa una nica comparaci amb EOF. (davant de les
tres del mtode anterior).
Si el contingut de la posici actual del capdavanter coincideix amb el valor
del sentinella (cosa que passar pocs cops al llarg de lanlisi), es fa una nova
-
Universitat Oberta de Catalunya P03/11008/01365 29 Anlisi lxica
comparaci per a saber de quina situaci es tracta, tal com es mostra en el
codi segent:
capdavanter = capdavanter.segentsi capdavanter.contingut = EOF aleshorescas de fi_de_bloc_A: llegir (bloc_B)fi_de_bloc_B: llegir (bloc_A)final de fitxer: acabar
Estat del sistema en un moment qualsevol de lanlisi, amb lestructura de sentinelles
5.3. Sistema dentrada del Lex
Aquest s el mtode utilitzat com a sistema dentrada pel generador danalit-
zadors lxics Lex. Utilitza una nica memria intermdia de longitud fixada.
Per a optimitzar laccs al disc, en cada recarrega somple un espai mltiple de
la longitud de la unitat dassignaci.
Fa servir un conjunt dapuntadors per a gestionar tot el sistema. Els explicarem
mentre analitzem les tres situacions en qu es pot trobar el sistema dentrada:
5.3.1. El comenament de lanlisi
Dentrada, quan sha llegit el primer bloc de carcters del disc i sha inicialitzat la
memria intermdia, ens trobem en la situaci que es mostra en la figura segent:
Estat inicial del sistema
Quan comena lexploraci es llegeix del disc un nombre de carcters mltiple de la lon-gitud mxima del lexema (MAXLEX) i mltiple de la longitud de la unitat dassignaci,i sactiven els apuntadors segents:
inici: assenyala el comenament fsic de la memria intermdia.
Noms es fa una comprovacien cada pas.
-
Universitat Oberta de Catalunya P03/11008/01365 30 Anlisi lxica
acabament: assenyala el final fsic de la memria intermdia.
segent: en aquest moment apunta a linici de la memria intermdia; a mesura quelexploraci avanci, segent es mour carcter a carcter per a trobar els lexemes delstestimonis.
fi: marca el final lgic de la memria intermdia. Quan es llegeix del disc, es llegeixenN la longitud mxima del lexema carcters (NMAXLEX). Dentrada, lespai al finalde la memria intermdia, entre fi i acabament, est desocupat.
perill: apunta una mica abans de lacabament lgic de la memria intermdia, de ma-nera que, quan segent supera aquest apuntador, sha de llegir de disc el segent blocde carcters. Entre perill i fi hi ha MAXLOOK carcters (el nombre mxim de carctersque es poden llegir en avanada, el que hem anomenat lookahead).
5.3.2. El procs danlisi
Quan el procs ja porta un temps funcionant, ens trobem en la situaci que es
mostra en la figura segent:
Estat normal de lanlisi
Per a gestionar el moviment amb la memria intermdia i mantenir els lexemes anteriori actual, sutilitzen quatre apuntadors:
amark: comenament del lexema anterior. smark: comenament del lexema actual. fmark: final del lexema actual. segent: apunta al carcter segent que sha danalitzar per a cercar el nou lexema. Quan
el troba, es mouen els tres apuntadors per a actualitzar-se a la nova situaci: amark es mou fins a smark. smark es mou fins a fmark. fmark es mou fins a segent.
En aquest punt, si cal, segent es continua movent endavant i cerca un lexema ms llargque lactual:
Si en troba un de ms llarg, fmark es mou fins a segent.
Si no en troba cap, segent retrocedeix fins a fmark per a deixar-ho tot a punt per a larecerca dun nou testimoni.
5.3.3. Lectura d un nou bloc
Quan segent supera el punt marcat per perill, sha de recarregar la memria in-
termdia llegint ms dades del disc. Per tal de no perdre informaci es duen a
terme les operacions segents:
Es copia en el comenament de la memria intermdia des de lapuntador
amark fins a fi, de manera que es conserven el lexema anterior i lactual.
-
Universitat Oberta de Catalunya P03/11008/01365 31 Anlisi lxica
Es posa al darrere el bloc de carcters llegit de disc i sactualitzen el apun-
tadors fi i perill.
Estat del sistema desprs de llegir un nou bloc de disc
Tot i que pugui semblar un mtode poc eficient a causa de la cpia del lexema
anterior i actual cada cop que es fa una recrrega de disc, en la prctica, com
que els lexemes solen ser curts en comparaci amb N MAXLEX:
Les recrregues no tenen lloc gaire sovint.
Quan es fa la nova lectura es mouen pocs carcters del final al comena-
ment de la memria intermdia.
Aix, doncs, amb aquest tercer mtode aconseguim el segent:
Estalviar una cpia del lexema, ja que no fa falta copiar-lo a cap variable.
Passant els apuntadors nhi ha prou per a saber quin s el lexema del testi-
moni actual.
Tornar fcilment carcters al flux dentrada. Noms shan de fer moviments
dels apuntadors segent i fmark en comptes de fer-ho amb instruccions del
sistema operatiu.
Accedir duna manera eficient al disc, ja que es llegeixen blocs que sn
mltiples de la longitud de la unitat dassignaci.
-
Universitat Oberta de Catalunya P03/11008/01365 32 Anlisi lxica
6. La taula de smbols
La taula de smbols s lestructura de dades utilitzada pel compilador per a ges-
tionar els noms (identificadors) que apareixen en el programa font: les cons-
tants, les variables, els tipus, les accions, etc.
Quan el compilador troba un identificador, guarda en aquesta taula la infor-
maci que el caracteritza: el nom, la categoria (acci, variable, constant, classe,
tipus, etc.), ladrea de memria que se li assigna, la dimensi i altra informa-
ci que depn de la categoria concreta. Quan lidentificador s referenciat en
el programa, el compilador consulta la taula de smbols i obt la informaci
que necessita. Un cop sacaba lmbit de definici de lidentificador, selimina
i desapareix de la taula de smbols.
Vegem, seguidament, com sutilitza aquesta taula en les diferents fases del pro-
cs de compilaci:
Lanalitzador lxic llegeix els carcters del codi font i detecta els lexemes
que coincideixen amb els patrons dels testimonis. Quan troba un identifi-
cador mira si est introdut en la taula de smbols i, si no ho est, li crea
una nova entrada.
Lanalitzador sintctic generalment noms treballa amb els smbols for-
mats en la fase anterior i afegeix informaci als camps datributs. Per, en
alguns casos, pot crear noves entrades en la taula, com quan es defineix un
nou tipus de dades que shauria de tractar com una paraula reservada i no
com un identificador.
El conjunt de rutines de lanlisi semntica, que verifiquen el significat
del programa font, ha daccedir a la taula per a consultar els tipus de dades
dels smbols.
El generador de codi pot:
Extreure informaci de la taula. Per exemple, llegir el tipus de dades duna va-
riable per a poder saber quant despai li ha de reservar el programa objecte.
Guardar informaci a la taula. Per exemple, ha de guardar ladrea de me-
mria en qu se situar una variable. Cada cop que la variable aparegui en
el programa objecte, lha de substituir per aquesta adrea.
Cal recordar que el compilador s qui utilitza la taula de smbols, i no el pro-
grama compilat. La taula de smbols no s present en lexecuci del programa,
excepte quan sinclou un depurador simblic en la fase dexecuci o en els cas
dels intrprets en qu la compilaci i lexecuci salternen.
Els termes acci, procedimenti subrutina sn equivalents.
-
Universitat Oberta de Catalunya P03/11008/01365 33 Anlisi lxica
Recordem, tamb, que la taula de smbols es pot inicialitzar amb les paraules
reservades del llenguatge perqu lanalitzador lxic hagi de verificar menys pa-
trons, tingui menys estats i sexecuti ms rpidament.
6.1. Lestructura dels registres
La taula de smbols est formada per registres que solen tenir una longitud fixa i
que es componen del nom del smbol i duna srie datributs com ladrea de me-
mria, el nmero de lnia en qu sha declarat, el tipus de dada, etc.
Distribuci tpica de la taula de smbols i dels seus camps
En general, els camps daquests registres poden guardar directament la informaci
per a la qual estan destinats, o b un apuntador a la posici de memria en qu
es guarda aquesta informaci, i daquesta manera reduir, en molts casos, lespai
total ocupat (aquesta s lestructura que es mostra en la figura segent).
Segons el llenguatge que cal compilar i lestructura del compilador, els camps
del registre poden variar. Estudiem els camps principals ms detalladament:
1) Nom del smbol. En aquest camp es guarden tots els lexemes dels smbols
del programa font (identificadors, constants numriques i qualsevol altre ele-
ment que el llenguatge sigui capa de gestionar). Per a guardar els lexemes es
poden utilitzar dues tcniques bsiques:
Interna. El camp de la taula de smbols es defineix com de tipus cadena
de carcters de dimensi fixa (per exemple 127 o 255). Els inconvenients
daquesta tcnica sn els segents:
La longitud mxima dels identificadors est restringida al valor fixat.
Es desaprofita molt despai, ja que els identificadors no solen ocupar tots
els carcters assignats.
Externa. El camp de la taula de smbols cont dos nous camps:
Un apuntador a la zona de memria en qu semmagatzema el lexema (Inici).
Aquesta s la tcnica que es mostra en la figura anterior.
-
Universitat Oberta de Catalunya P03/11008/01365 34 Anlisi lxica
Un nmero amb la longitud del lexema (Longitud).
2) Nmero de lnia de la declaraci del smbol o nmeros de lnia en qu apa-
reix el smbol. La informaci que es guarda en aquest camp s una informaci
auxiliar que ser dutilitat per a produir un llistat de referncies creuades que
ajudin a depurar els programes. Es pot utilitzar una llista encadenada de n-
meros de lnies; la primera posici indica on apareix la declaraci del smbol.
s un camp que omple lanalitzador lxic.
3) Tipus. En aquest camp es guarda el codi corresponent al tipus de dada re-
presentat pel smbol, o un apuntador a lestructura de dades corresponent al
tipus. Lanalitzador sintctic s lencarregat demplenar aquest camp.
4) Adrea de memria. En aquest camp semmagatzema ladrea de memria
en qu es guardar, durant lexecuci del programa, el valor corresponent al
smbol. Normalment, la dada que interessa guardar no s ladrea absoluta,
sin la referent al comenament de la memria esttica, el comenament del
registre dactivaci corresponent a la subrutina, etc.
s una dada que omple el generador de codi durant el seu procs dinicialitza-
ci i que utilitza desprs per a substituir en el codi objecte generat el nom del
smbol per la seva adrea de memria.
6.2. Operacions
La taula de smbols funciona com una estructura de base de dades en qu el
camp clau s el lexema del smbol.
Les operacions que es fan sobre aquesta estructura sn les segents:
Buscar un lexema i localitzar-ne el contingut dels atributs.
Inserir un nou registre i comprovar prviament que no nhi hagi un altre
amb el mateix nom.
-
Universitat Oberta de Catalunya P03/11008/01365 35 Anlisi lxica
Modificar la informaci continguda en un registre. En general, noms safe-
geix informaci als camps buits dels registres. La modificaci sempre requereix
una recerca prvia.
En llenguatges amb estructura de bloc sinclouen dues operacions ms:
Nou bloc: comenament dun nou bloc.
Fi de bloc: acabament de lmbit dun bloc.
En general, les operacions ms freqents sn les de consulta. Es fan per a veure si el sm-bol ja estava introdut abans de cada inserci i de cada modificaci. Durant el funciona-ment del compilador no se solen esborrar registres de les taules de smbols, excepte enels llenguatges amb estructura de blocs. En aquest tipus de llenguatge, en acabar lanlisidun bloc shan deliminar de la taula tots els smbols locals del bloc.
Com hem vist, la taula de smbols s accedida per totes les fases del compila-
dor. Si el programa s llarg, pot tenir centenars o milers dentrades. Per tant,
per a un bon rendiment del compilador s molt important que les rutines de
gesti de la taula siguin molt eficients.
6.3. Organitzaci de la taula de smbols
Una taula de smbols es pot organitzar de dues maneres bsiques:
Taules no ordenades: sn generades amb vectors o llistes. En general, sn
mtodes molt poc eficients per fcils de programar.
Taules ordenades: programades utilitzant estructures de tipus vector orde-
nat, llistes ordenades, arbres binaris, arbres balancejats (AVL), taules de dis-
persi (hash), etc.
A causa de les caracterstiques especfiques de funcionament de les taules de
smbols, els mtodes ms eficients sn els arbres balancejats i les taules de dis-
persi. Aquests tipus dorganitzacions sn un problema convencional de pro-
gramaci i no s matria del curs tornar-les a estudiar. S que estudiarem, per,
com solucionar la problemtica que safegeix quan tractem amb llenguatges
amb estructura de blocs.
Els llenguatges amb estructura de blocs estan compostos per mduls o trossos
de codi dexecuci seqencial que poden contenir submduls i crides a altres
mduls. Generalment, un smbol s accessible dins el mdul en qu est defi-
nit i en tots els mduls o submduls que cont (de nivell inferior). Si en un
submdul es defineix un smbol amb un lexema igual a un que ja sha declarat
en un mdul superior, la definici del nivell inferior predomina sobre la que
ja hi havia: sempre sassocia el lexema a la definici ms recent.
Les regles dmbit, prpies de cada llenguatge, sn el conjunt de regles se-
mntiques que determinen quina definici correspon a cada lexema en cada
moment de la compilaci.
Podeu ampliar la informaci sobre les estructures de dades que es poden utilitzar repassant lassignatura Estructura de la informaci.
-
Universitat Oberta de Catalunya P03/11008/01365 36 Anlisi lxica
Utilitzarem lexemple segent dun programa escrit en un llenguatge amb estructura deblocs per a estudiar el contingut de la taula de smbols en els punts (1) i (2) per a cadauna de les quatre organitzacions en qu aprofundirem en els punts segents. La columnade nivell indica la profunditat en qu es troba la lnia de programa i la columna de blocindica el nmero de bloc de la lnia del programa:
6.3.1. Taules de smbols no ordenades
En el cas ms senzill, les taules de smbols es construeixen amb un vector o
amb una llista. Se sol utilitzar una pila auxiliar dapuntadors dndex de
bloc per a marcar el comenament (o el final) dels smbols corresponents a un
bloc. Cada vegada que comena un nou bloc safegeix un punter a la pila dn-
dex de bloc, que assenyala el primer smbol del bloc. Quan sacaba de compilar
el bloc, seliminen tots els smbols que hi ha des del segent al marcat per
lapuntador del bloc fins al final de la taula.
En lexemple anterior hi ha sis blocs. Quan la compilaci arriba als punts (1) i (2), el con-tingut de les piles s el que es mostra en els esquemes de la figura segent:
Taules de smbols no ordenades
Programa Nivell Bloc
program u
var dos: integer;procedure tresvar quatre: char;procedure dos var quatre: integer;
procedure cincvar u, dos: real; (1)
procedure cincvar u, tres: real;procedure dosvar u, quatre: char; (2)
1
2
2
3
3
4
3
4
2
3
3
4
1
2
3
4
5
6
-
Universitat Oberta de Catalunya P03/11008/01365 37 Anlisi lxica
En aquesta organitzaci es poden fer les operacions segents:
Inserci: quan es troba la definici dun smbol, sha de verificar que no esti-
gui definit en el darrer bloc, s a dir, en el conjunt de registres que va des del
que ha apuntat lltim ndex de bloc fins al final de la llista. Si no estava intro-
dut, sinsereix en la darrera posici de la pila. En canvi, si ja estava en la taula,
ha de donar un error de tipus el smbol ja estava definit en aquest mbit.
Cerca: la recerca dun registre en la taula es fa en sentit invers al dinserci (del
darrer introdut fins al primer de la taula). Aix, doncs, quan es troba el lexema
cercat, el smbol correspondr a la definici feta en el bloc ms proper.
Nou bloc: quan comena un nou bloc, es fa una nova entrada a la pila dn-
dex de bloc que apunti al cim actual de la taula de smbols.
Final de bloc: quan sacaba un bloc, shan deliminar tots els registres que
shi ha definit, s a dir, tots els que van del segent a lapuntat per la darrera
entrada de la pila dndexs de bloc fins al final de la taula de smbols. Des-
prs, tamb selimina la darrera entrada de la pila dndexs de bloc.
6.3.2. Taules de smbols amb estructura darbre nic
Per a millorar leficincia, es pot estructurar la taula de smbols com un arbre bi-
nari (normal o balancejat) i afegir un nou camp als registres de la taula que in-
diqui el nmero del bloc al qual pertany el smbol. Per a solucionar les possibles
duplicitats de lexemes iguals en diversos blocs, sutilitza una llista encadenada
en els nodes de larbre. Seguint amb lexemple obtindrem els esquemes de la
figura segent:
Taula de smbols amb estructura darbre
Sobre aquesta organitzaci de taula de smbols es poden fer les operacions se-
gents:
Inserci: per a inserir un nou smbol, primer es fa una recerca de la posici que
li correspon. Si ja hi ha un registre amb el mateix lexema, mira que el camp de
Sha utilitzat una estructura darbrebinari en qu el fill dret s ms granque el pare, i el fill esquerra, ms
petit.
-
Universitat Oberta de Catalunya P03/11008/01365 38 Anlisi lxica
bloc no es correspongui amb el bloc actiu. Si fos aix, shauria de donar un
error de tipus el smbol ja estava definit en aquest mbit. Si tot va b, en
aquest node de larbre es crea una llista en qu el cap ser el nou registre. Si no
hi ha cap registre amb el mateix lexema, sinsereix directament en larbre.
Cerca: la recerca dun registre en la taula es fa com en qualsevol arbre bi-
nari, i no s necessari recrrer les llistes que puguin aparixer en un node,
ja que lestratgia dinserci assegura que el node de larbre binari cont la
definici ms recent del smbol.
Nou bloc: noms cal incrementar en 1 la variable amb el nmero de bloc
actiu (nivell). Quan sinsereixi un nou smbol, ja ho far en lmbit correcte.
Final de bloc: en acabar la compilaci dun bloc, shan deliminar els sm-
bols locals del bloc, i per a aix sha de:
Localitzar els registres de larbre corresponents al bloc actiu.
Esborrar-los de larbre.
Decrementar en 1 la variable amb el nmero de bloc actiu.
Aquestes operacions requereixen fora clculs i aquest s el principal inconvenient
del mtode. Especialment cert en el cas darbres balancejats, en qu leliminaci de
nodes fa que larbre deixi destar balancejat i sigui necessari reestructurar-lo.
6.3.3. Taules de smbols amb estructura de bosc darbres
Aquesta tcnica utilitza un arbre per a cada bloc del programa i, de la mateixa
manera que en el primer cas, una pila dndexs de bloc que apunten a larrel
de larbre del bloc. Els continguts en els punts (1) i (2) serien, en aquest cas, els
que es mostren en la figura segent:
Taula de smbols amb estructura de bosc darbres
Les operacions que es poden fer sobre aquesta estructura de taula de smbols
sn les segents:
Inserci: consisteix a fer una alta normal en larbre del bloc actiu.
Inconvenient
Shan de fer moltes operacionsquan hi ha un final de bloc.
-
Universitat Oberta de Catalunya P03/11008/01365 39 Anlisi lxica
Cerca: la recerca dun registre s ms complexa que en els casos anteriors.
Primer es busca el lexema en larbre del bloc actiu. Si no es troba, es busca
en larbre del bloc anterior, i aix successivament fins a localitzar-lo o fins
que shagin rastrejat tots els arbres.
Nou bloc: quan comena la compilaci dun nou bloc, es crea un nou ele-
ment en la pila dndexs de blocs i una nova estructura de tipus arbre que,
dentrada, s buida.
Final de bloc: quan sacaba la compilaci dun bloc, es destrueix tota lestruc-
tura darbre associada i selimina el darrer punter de la pila dndexs de blocs.
6.3.4. Taules de smbols de dispersi (hash)
Recordem que una taula de dispersi aplica una funci matemtica al lexema
per a determinar la posici de la taula que li correspon i, aix, poder distribuir-
los uniformement. Linconvenient de les taules de dispersi sn les collisions
que es produeixen quan dos lexemes volen ocupar la mateixa posici. Aquest
problema es pot resoldre bsicament de dues maneres:
Taules de dispersi tancades: es resolen les collisions dins la mateixa taula.
Quan sen produeix una, es recorre la taula seqencialment fins a trobar la
posici buida segent, en qu sinsereix el nou smbol.
Taules de dispersi obertes: sutilitza una llista encadenada de desborda-
ment per a resoldre les collisions. Cada registre de la taula t un nou camp
de tipus apuntador al registre. Quan es produeix una collisi, es crea una
llista encadenada amb el cap al registre de la taula.
Si utilitzem aquest segon tipus de taula de dispersi, de la mateixa manera que amb les-tructura de tipus arbre, safegeix als registres de la taula un nou camp que indica el n-mero del bloc (nivell) al qual pertany el smbol i un apuntador al registre per a formar lesllistes en cas de collisi. Els continguts de lestructura en els punts (1) i (2) serien els quees mostren en la figura segent:
Taula de smbols amb taules de dispersi
-
Universitat Oberta de Catalunya P03/11008/01365 40 Anlisi lxica
Les operacions sobre aquesta taula sn les segents:
Inserci: la inserci es fa com en qualsevol taula de dispersi. El tracta-
ment de les collisions ms indicat s ls de llistes de desbordament, enca-
ra que es pot fer servir qualsevol altre sistema amb la condici que inclogui
els smbols ms recents en les primeres posicions.
Cerca: com en qualsevol taula de dispersi, en cas de collisi de la clau que
retorna la funci de dispersi sha de buscar en la zona de desbordament,
fins a trobar el smbol o una posici buida.
Nou bloc: noms cal enregistrar el canvi del bloc actiu.
Final de bloc: en acabar la compilaci dun bloc, shan de localitzar tots els
registres corresponents al bloc actiu i esborrar-los de la taula. Per a fer-ho,
cal recrrer gaireb tota la taula i, en el cas duna taula de dispersi tancada,
leliminaci de registres quan hi ha collisions no s precisament una tasca
senzilla. Al final, tamb cal enregistrar el canvi del bloc actiu.
6.4. Definici dun node
Segons el tipus didentificador (constant, variable, tipus, acci, funci, etc.), la
informaci que sha de guardar en el registre varia. Per aix, en comptes de te-
nir una nica taula de smbols amb un nic tipus de registre, se sol tenir una
taula de smbols per cada tipus didentificador.
La taula segent mostra alguns dels camps que fa servir Pascal en les diferents
taules de smbols que es poden utilitzar per als diferents tipus didentificadors:
Tipus de smbol Subtipus Camps
Constant TipusValor
Tipus
Conjunt Apuntador al tipus conjunt
Escalar subrang Lmit inferiorLmit superiorApuntador del tipus
Escalar Llista de possibles valors
Array Llista de dimensions, i per cada una: Apuntador al tipus Lmit inferior Lmit superior
Registre Llista de camps, i per cada un: Nom Apuntador al tipus Desplaament per laccs
Variable Forma daccs Apuntador al tipus
Acci Adrea de lacci Llista de parmetres, i per cada un: Tipus Pas per valor o per referncia
-
Universitat Oberta de Catalunya P03/11008/01365 41 Anlisi lxica
Resum
En aquest mdul didctic hem estudiat la primera fase del procs de compilaci:
lanalitzador lxic o explorador. Hem vist que aquesta part del compilador s
lencarregada de llegir els carcters del programa font i convertir cadenes seqen-
cials de carcters en unitats lxiques amb un significat mnim que anomenem
testimonis. El lexema de cada un daquests testimonis ha de coincidir amb el seu
patr, definit amb una expressi regular. Els testimonis sn utilitzats en la fase se-
gent del procs de compilaci, en lanalitzador sintctic, per a verificar lestruc-
tura del programa segons les especificacions de la gramtica lliure de context que
defineix el llenguatge.
Desprs sha recordat que, per a entendre millor el funcionament de lanalit-
zador lxic, cal que estudieu el material didctic de lassignatura Teoria daut-
mats i llenguatges formals I, en especial els mduls 1 i 2, que tracten de les
expressions regulars utilitzades per a definir els patrons dels testimonis dun
llenguatge i dels autmats finits, una eina fcil dimplementar a partir de les
expressions regulars i amb la qual la localitzaci dels testimonis se simplifica
molt.
Com en totes les fases del procs de compilaci, durant lanlisi lxica es po-
den detectar errors en el programa font. Hem estudiat quins eren els ms fre-
qents i quines tcniques es poden aplicar per a recuperar-se quan es produeix
aquesta situaci dexcepci.
En un segon bloc, hem estudiat diferents tcniques per a implementar el siste-
ma dentrada de lanalitzador lxic. Aquest s un mdul independent, compost
per un conjunt de rutines altament especialitzades per a millorar leficincia
del compilador. En ser lnica part de les fases danlisi que es comunica amb
el sistema operatiu, la migraci a altres plataformes dexecuci se simplifica
molt: noms sha de modificar el sistema dentrada per a exportar aquesta part
del compilador.
En el darrer bloc, hem aprofundit en lestudi de la taula de smbols, una estruc-
tura comuna a totes les fases de la compilaci. Hem vist quins camps cont
cada registre de la taula i quines operacions shi poden fer. Finalment, hem
vist diferents tipus dorganitzacions que es poden aplicar a la taula de smbols
per a preveure lmbit local dels identificadors en els llenguatges de blocs, com
per exemple C o Pascal.
-
Universitat Oberta de Catalunya P03/11008/01365 43 Anlisi lxica
Activitats
1. Utilitzeu un generador danalitzadors lxics com el Lex per a generar un analitzador lxicque demani el nom dun fitxer i lanalitzi. Ha de comptar quantes vegades es repeteix la pa-raula per. No ha de diferenciar les majscules de les minscules, s a dir, ha de comptar tantper com PeR. Sha dacumular el compte a una variable global i mostrar-la en acabar el pro-grama.
2. Llegiu un text dun fitxer i genereu-ne un de sortida en qu les lletres desprs dun puntestiguin en majscula.
3. Escriviu un programa que transformi xifres en lletres, per exemple, 110 cent deu.
4. Construu una calculadora que faci sumes i restes de nmeros enters (sense decimals, peramb signe). Les dades sintroduiran per teclat.
5. Construu una calculadora que faci sumes, restes, multiplicacions i divisions de nmerosenters i de nmeros reals (amb decimals i exponents: 10.1, 26, 7.6e+6, 7e2).
6. Construu una calculadora que, a ms de lanterior, pugui utilitzar variables amb nomdun nic carcter, per exemple la a, la f o la v. Utilitzeu un vector per a guardar el con-tingut de les variables. En acabar el programa, feu un llistat amb el valor de les que estiguinplenes.
7. Feu servir la mateixa calculadora, per ara les variables poden tenir qualsevol nom de tipusidentificador (lletra seguida de lletres i/o nmeros). Utilitzeu una taula de smbols desorde-nada codificada amb un vector de longitud mxima 40. Quan es detecta un identificador,sha de mirar si est introdut i si no donar-lo dalta. Si se supera el mxim (40) ha de donarun error.
8. Codifiqueu les expressions regulars que permetin de llegir adreces de correu electrnic.Shaur de demanar el nom dun fitxer que contingui una llista dadreces i verificar si totessn correctes. Ha de mostrar les incorrectes per pantalla a mesura que es troben i al final hade donar un missatge amb el resultat de lanlisi. Per exemple:
lnia 25, adrea incorrecta. Falta @: a74.vilma.es:
50 adreces analitzades. 1 incorrecta
Exercicis dautoavaluaci
1. Expliqueu com es comuniquen normalment lanalitzador sintctic i lanalitzador lxic iquins avantatges t aquesta forma de connexi.
2. Expliqueu els motius que fan necessari que lanalitzador lxic faci una lectura en avanadai hagi de retornar carcters al flux de dades. Poseu-ne un exemple. Qui sencarrega de feraquestes tasques i com es comunica amb lanalitzador lxic? Quins avantatges t fer-ho aix?
3. Expliqueu els tres mtodes que es poden utilitzar per a detectar les paraules clau dun llen-guatge, i indiqueu els avantatges i els inconvenients de cada mtode.
4. Contesteu breument les preguntes segents sobre la taula de smbols: Per a qu serveixen i quin tipus d informaci guarden? Com i on es construeixen? Quin o quins mduls del compilador les utilitzen?
5. A partir de l'estructura de programa segent dun llenguatge de blocs, mostreu el contin-gut de la taula de smbols en el punt (1) i (2) per a cada un dels quatre mtodes que shan visten aquest mdul didctic:
program uvar dos, tres: integer;procedure cinc
var u, dos: real;procedure sis
var dos, tres: char;procedure quatre
var u, dos: real; (1)procedure quatre
var u, dos: char; (2)
-
Universitat Oberta de Catalunya P03/11008/01365 44 Anlisi lxica
6. Indiqueu els requisits que ha de complir qualsevol sistema dentrada.
7. Expliqueu com se soluciona generalment el problema del lookahead i del pushback en elssistemes dentrada. Expliqueu el funcionament del mtode del sentinella.
-
Universitat Oberta de Catalunya P03/11008/01365 45 Anlisi lxica
Solucionari
1. Per a poder comprovar eficientment lestructura del programa font, se sol separar lanalitza-dor lxic de lanalitzador sintctic: lanalitzador lxic es concentra a filtrar el fitxer dentrada,eliminar els carcters innecessaris i proporcionar una seqncia equivalent de testimonis alanalitzador sintctic, que nicament es concentrar a verificar lestructura del programa font.
Amb aquesta separaci de tasques, obtenim els avantatges segents:
Se simplifiquen les parts danlisi: lanalitzador sintctic no sha de preocupar de rebre ca-rcters inesperats, ja que el fitxer font s filtrat per lanalitzador lxic.
El disseny general es fa ms clar i comprensible. Es millora leficincia del compilador en conjunt, perqu es poden aplicar tcniques ms
eficients i depurades en cada fase. Per exemple, les rutines de lectura del programa font espoden programar directament en llenguatge dassemblador i incorporar-hi tcniques es-pecials de lectura que naugmentin la velocitat.
Saugmenta la portabilitat del compilador. Si es vol canviar alguna caracterstica de lalfa-bet dentrada o de la plataforma dexecuci, nhi ha prou amb modificar la part afectadade lanalitzador lxic i deixar lanalitzador sintctic intacte.
2. Com que lanalitzador lxic ha de tenir cura de trobar sempre el testimoni amb el lexema msllarg possible, s necessari llegir diversos carcters en avanada per a poder decidir si es fa refern-cia a un component lxic o a un altre. Per exemple, si a lentrada tenim els carcters >b quan estroba > caldr llegir el carcter segent per a determinar si es fa referncia al testimoniMES_GRAN (>) o al testimoni MES_GRAN_O_IGUAL (>=). En el primer cas, el carcter llegit enavanada b shaur de retornar al flux dentrada, ja que pot ser el comenament dun nou tes-timoni. Un cas ms complex seria el dun llenguatge que reconeix tres testimonis, per exemple,amb els lexemes cama, llarg i camallarga. Si a lentrada hi ha la cadena de carcters cama-llarg, lanalitzador lxic ha de retornar els testimonis corresponents als lexemes cama i llarg.Per, abans de poder decidir de quin testimoni es tracta, desprs de trobar camallarg ser ne-cessari llegir un nou carcter per a intentar de cercar el testimoni ms llarg possible, el camallar-ga. Quan llegeix lespai en blanc ja est en condicions de decidir que ha trobat el testimonicama. En aquest punt, haur de retornar sis carcters al flux dentrada llarg. Aix en C no espot fer directament.
Lencarregat de fer aquestes tasques s el sistema dentrada de lanalitzador lxic: un conjuntde funcions independents que interactuen amb el sistema operatiu per a llegir dades dels dis-positius externs. El sistema dentrada i lanalitzador lxic funcionen com una parella produc-tor-consumidor, en qu el sistema dentrada produeix els carcters a mesura que lanalitzadorlxic els necessita. Es comuniquen amb el pas de parmetres a les funcions i dels valors deretorn daquestes funcions.
Amb aquesta distribuci de tasques es millora el segent:
Leficincia, ja que les rutines daccs al fitxer dentrada poden estar altament especialit-zades i optimitzades.
La portabilitat, ja que de totes les fases danlisi del compilador, noms aquestes rutinesdel sistema dentrada sn les que es comuniquen amb el sistema operatiu. Per a migrar lesfases danlisi dun compilador a una altra plataforma dexecuci, noms shauran de mo-dificar les rutines del sistema dentrada de lanalitzador lxic.
3. Per a detectar les paraules clau dun llenguatge, es poden utilitzar bsicament tres mtodes:
a) Es pot definir cada paraula clau amb una expressi regular. Per exemple, podrem definirla paraula clau for com a [f+F][o+O][r+R]. Per aix t alguns inconvenients:
Sallarga molt el codi. Es fa ms difcil de llegir. Lautmat generat t molts ms estats. Lexecuci s ms lenta.
b) Una millora consisteix a crear una taula de paraules clau i tractar-les com un cas particulardel patr dels identificadors. Quan es troba un identificador, es consulta la taula per a veuresi s una paraula clau o no. Es podria programar amb:
[azAZ]([azAZ09]) if is_keyword(yytext, kw) thenreturn(kw)
elsereturn(IDENTIFIER);
Amb aquest mtode es fa el segent:
Es redueix el codi. Es millora la llegibilitat.
-
Universitat Oberta de Catalunya P03/11008/01365 46 Anlisi lxica
Lautmat reconeixedor t menys estats. Lexecuci s ms rpida. Quan es troba un identificador, shan de consultar dues estructures de dades.
c) Un darrer mtode que t els avantatges de lanterior, per que evita haver de mirar duestaules, consisteix a inicialitzar les primeres posicions de la taula de smbols amb les paraulesclau del llenguatge (en ordre alfabtic, per a facilitar la recerca i laccs). Quan es detecta ellexema dun identificador, es consulta en la taula de smbols per a determinar si s una pa-raula clau o un identificador.
4. La taula de smbols serveix bsicament per a guardar informaci dels identificadors durantel procs de compilaci. De fet, s una estructura de dades que reuneix informaci en les fasesdanlisi i la utilitza en les fases de sntesi en el procs de generaci del codi objecte.
Guarda informaci que varia segons el tipus didentificador (en una nica taula) o utilitzantuna taula per a cada tipus (tipus, variable, registre, constant, vector, etc.). Per exemple, per ales variables, guarda la forma daccs, ladrea i el tipus; per a les accions, guarda ladrea i,per a cada parmetre, el tipus i la forma de pas (per valor o referncia). En els llenguatges ori-entats a bloc tamb ha guardar lmbit del smbol.
La seva construcci, la creaci dels registres, es fa durant lanlisi lxica. Quan es troba unidentificador, la cadena de carcters que el forma, el lexema, es guarda en una entrada de lataula. Tamb se sol guardar el nmero de lnia en qu sha trobat per primer cop o una llistaamb tots el nmeros de lnia per a poder fer desprs un llistat de referncies creuades.
Lutilitzen totes les fases del compilador:
Lanlisi lxica crea entrades i omple alguns camps: lexema i nmero de lnia, bsicament. Lanlisi sintctica hi posa el tipus de dada i altres camps, depenent del tipus didentificador. Lanlisi semntica consulta el tipus de dada i, si escau, omple alguns camps. La generaci de codi posa ladrea de memria i desprs la consulta per a substituir totes
les aparicions del smbol per ladrea.
5. Les figures segents mostren el contingut de les taules en els punts 1 i 2 per als quatre m-todes estudiats:
Programa Nivell Bloc
program uvar dos, tres: integer;procedure cinc
var u, dos: real;procedure sis
var dos, tres: char;procedure quatre
var u, dos: real; (1)procedure quatre
var u, dos: char; (2)
1223233423
1
2
3
4
5
-
Universitat Oberta de Catalunya P03/11008/01365 47 Anlisi lxica
-
Universitat Oberta de Catalunya P03/11008/01365 48 Anlisi lxica
6. Qualsevol sistema dentrada ha de complir una srie de requisits:
Ser com ms rpid millor, sense fer cpies innecessries dels carcters de lentrada. Proveir de diversos carcters de lectura en avanada i de retorn a lentrada. Suportar lexemes de longitud considerable. Tenir disponibles el lexema actual i lanterior. Permetre un accs eficient al disc.
7. Per a solucionar els problemes de lookahead i de pushback, el sistema dentrada de lanalit-zador lxic sol utilitzar una memria intermdia prpia, de manera que:
Llegeix un bloc de carcters de disc i el guarda en la memria intermdia. A ms, fa serviruns apuntadors per a assenyalar la porci que ja ha estat analitzada.
Si shan de retornar carcters al flux dentrada, mou lapuntador enrere tantes posicionscom carcters shagin de retornar.
Aquesta soluci augmenta molt leficincia del compilador, ja que, en comptes de llegir ca-rcter a carcter el fitxer dentrada guardat en el disc un dispositiu daccs lent, es llegeixde cop tot un bloc de carcters que es guarda en una memria intermdia de la memria delordinador un dispositiu daccs rpid.
El mtode del sentinella divideix la memria intermdia en dues meitats de N+1 bytes cadas-cuna (N s mltiple de la longitud de la unitat dassignaci: 1.024, 4.096, etc.). En el byteextra es guardar un carcter sentinella (normalment el carcter EOF). La figura mostra les-tat del sistema en un moment de lanlisi qualsevol:
El sistema utilitza dos apuntadors per a delimitar el lexema del testimoni actual: un de co-menament i un de capdavanter.
Dentrada, tots dos apuntadors assenyalen el primer carcter del lexema i, a mesura que lanalit-zador lxic demana carcters, capdavanter es mou endavant fins que lanalitzador lxic troba unacoincidncia amb el patr dun testimoni. Un cop el lexema ha estat detectat i tractat, el puntercomenament es mou fins on hi ha capdavanter i continua lanlisi del testimoni segent.
Cada cop que es mou capdavanter es comprova si el seu contingut es correspon amb el carc-ter sentinella (EOF). Si s aix, mira si sha arribat al final del fitxer o b al final duna meitatde la memria intermdia i, en aquest cas, es llegeix laltra meitat. Funciona com una llistacircular: si se sobrepassa el bloc A, es llegeix el B i, si se sobrepassa el B, es llegeix lA. Per tant,cada cop que es dna una ordre de lectura al sistema operatiu, es recarrega una meitat de lamemria intermdia. s el que mostra el tros de codi segent:
capdavanter = capdavanter.segentsi capdavanter.contingut = EOF aleshores
cas de fi_de_bloc_A: llegir (bloc_B)fi_de_bloc_B: llegir (bloc_A)final de fitxer: acabar
Glossari
alfabet m Conjunt de smbols utilitzats per a escriure les sentncies dun llenguatge.
anlisi lxica f El primer pas en el processament dun llenguatge. La cadena de carctersque formen el programa font es llegeixen un a un i sagrupen en lexemes (testimonis), i cer-quen les paraules claus, els identificadors, els literals, etc. Un cop identificats, els lexemes, enforma de testimonis, es passen a lanalitzador sintctic.
-
Universitat Oberta de Catalunya P03/11008/01365 49 Anlisi lxica
anlisi semntica f Tercer pas en el processament dun llenguatge. Sol estar integrada en lan-lisi sintctica. A partir de larbre sintctic augmentat, comprova la part sensible al context i gene-ra el codi intermedi que sutilitzar per a generar el codi objecte o ser executat per un intrpret. Vegeu semntica.
anlisi sintctica f El segon pas en el processament dun llenguatge. Comprova lestruc-tura sintctica duna sentncia o duna cadena de smbols dun llenguatge. Normalment prencom a entrada la seqncia de testimonis sortida de lanalitzador lxic, i produeix com a sor-tida un arbre sintctic.
analitzador m Vegeu analitzador sintctic.
analitzador lxic m Algorisme o programa que fa lanlisi lxica.en scanner
analitzador sintctic m Algorisme o programa que fa lanlisi sintctica.en parser
arbre sintctic m Estructura de dades que representa lestructura dalgun element que haestat analitzat sintcticament. Sol ser utilitzat com a representaci interna de lestructuradun programa mentre es genera o soptimitza el codi objecte.
atribut m Valors que sassocien a un smbol. Se solen guardar en un camp duna estructurade dades tipus registre.
autmat m Mquina, robot o sistema formal dissenyat per a seguir una seqncia dinstruc-cions precisa. Est format per un conjunt destats, transicions entre estats i les regles per a ferles transicions. Vegeu mquina destats finits.
buffer Vegeu memria intermdia.
explorador m Vegeu analitzador lxic.
expressi regular f Llenguatge per a especificar patrons que concorden amb una seqnciade carcters.
keyword Vegeu paraula clau.
lectura de carcters en avanada f Entrada llegida per un explorador o analitzador sin-tctic que encara no ha estat reconeguda com un patr o regla. s necessria per a poder de-terminar el testimoni amb lexema ms llarg. en lookahead
Lex m Programa generador danalitzadors lxics.
lexema m Unitat lxica mnima dun llenguatge. Lanlisi lxica converteix els carcters delcodi font dentrada del compilador en una seqncia de lexemes que concorden amb els pa-trons dels testimonis.
literal m Valor constant. Sescriu en temps de compilaci i en temps dexecuci, noms espot llegir, per no modificar. Al contrari, els valors guardats en variables i als quals saccedeixpel nom simblic poden ser modificats en temps dexecuci. Els literals sn daccs molt r-pid i sutilitzen quan no es vol que siguin modificats, per exemple, el nom dun fitxer de con-figuraci o el valor 3.14159.
longitud til f Longitud mxima que