mòdul 2. anàlisi lèxica. l'analitzador lèxic, el sistema d'entrada i les taules de símbols

52
Anàlisi lèxica L’analitzador lèxic, el sistema d’entrada i les taules de símbols Joan Codina i Banti P03/11008/01365

Upload: dav-miroc

Post on 19-Oct-2015

14 views

Category:

Documents


4 download

TRANSCRIPT

  • 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