Lexikální analýza

Embed Size (px)

DESCRIPTION

Lexikální analýza. Miroslav Beneš Dušan Kolář. Rozhraní lexikálního analyzátoru. Úkoly. Čtení zdrojového textu Sestavování symbolů Odstranění mezer a poznámek Normalizace symbolů (velká/malá písmena, spec. znaky, ...) Interpretace direktiv překladače Uchovávání informací pro hlášení chyb - PowerPoint PPT Presentation

Text of Lexikální analýza

  • Lexikln analzaMiroslav BeneDuan Kol

    Lexikln analza

  • Rozhran lexiklnho analyztoru

    Lexikln analza

  • kolyten zdrojovho textuSestavovn symbolOdstrann mezer a poznmekNormalizace symbol (velk/mal psmena, spec. znaky, ...)Interpretace direktiv pekladaeUchovvn informac pro hlen chybZobrazen protokolu o pekladu

    Lexikln analza

  • Pro eit lexikln analzu samostatn?Jednodu nvrh pekladaeKonvence pro mezery a poznmkyVy efektivitaSpecializovan algoritmyLep penositelnostZvltnosti vstupn abecedy??( = [

    Lexikln analza

  • Zkladn pojmyLexm slovo nad abecedouKategorie symbol identifiktor, slo, relan opertor, lev zvorka, ...Atributy symbolu etzec, hodnota, kd opertoru, ...Reprezentace symbolu dvojice (kategorie, atribut)

    Lexikln analza

  • Pklady lexiklnch symbol

    Lexikln analza

    Symbol

    Lexm

    Vzor

    const

    const

    const

    relation

  • Reprezentace symbol// kategorie symbolenum Symbol { IdSym, NumSym, RelOpSym, DotSym, ... };

    // kategorie opertorenum Oper { LthOp, GthOp, LeqOp, ... };

    // atributy symbolunion LexAttr { char* id; int num; Oper relop; ...};

    // reprezentace lexiklnho symbolustruct Token { Symbol sym; // kategorie LexAttr attr; // atribut};

    Lexikln analza

  • Problmy se zdrojovm jazykemPevn/voln formt(FORTRAN) 12 X=7 * +12*KC poznmkaZpracovn mezer (FORTRAN, Basic)DO5I=1.25 / DO5I=1,25Klov slova (PL/I)IF THEN THEN THEN=ELSE; ELSE ELSE=THEN

    Lexikln analza

  • Pklad1 INTEGER FUNCTIONA2 PARAMETER(A=6,B=2)3 IMPLICIT CHARACTER*(A-B)(A-B)4 INTEGER FORMAT(10),IF(10),DO9E15100 FORMAT(4H)=(3)6200 FORMAT(4 )=(3)7 DO9E1=18 DO9E1=1,29 IF(X)=1...

    Lexikln analza

  • Pklad (pokr.)10 IF(X)H=111 IF(X)300,20012300 CONTINUE13 ENDC this is a comment $FILE(1)14 END

    Lexikln analza

  • Specifikace symbolPopis bnm jazykemidentifiktor je posloupnost psmen a slic zanajc psmenemRegulrn (linern) gramatika I ->p X X ->p X | c X | p | cRegulrn vrazy a definice p (p | c)*

    Lexikln analza

  • Specifikace symbolGraf pechod konenho automatu(syntaktick graf)

    Lexikln analza

  • Specifikace symbolLexikln symboly lze obvykle popsat regulrnmi jazyky (typ 3)

    Co nedokeme popsat?Zanoen konstrukce (zvorky)Opakovan konstrukce {wcw|w{a,b}*}Zadan poet opakovnnHa1a2an(FORTRAN)

    Lexikln analza

  • Regulrn vrazy nad RE oznauje {}(przdn etzec)Je-li a, pak a oznauje {a}Je-li a,b,c,, pak [abc] oznauje mnoinu {a, b, c, }[aeiouy][a-zA-Z][^0-9] vechno krom [0-9]

    Lexikln analza

  • Regulrn vrazyJsou-li s, t reg. vrazy oznaujc jazyky L(s) a L(t), pak (s) | (t)L(s) L(t)(s) (t)L(s) L(t)(s)*(L(s))*(s)+(L(s))+ = L(s) (L(s))*(s)?L(s) {}(s)L(s)

    Lexikln analza

  • Pklad [A-Z]([A-Z]|[0-9])* [A-Z][A-Z0-9]* [0-9]+.[0-9]+(E[-+]?[0-9]+)? |[0-9]+E[-+]?[0-9]+

    Lexikln analza

  • Regulrn definicePojmenovan regulrn vrazyd1->r1d2->r2...dn->rnrznreg. vrazy nad jmna {d1, d2,, di-1}

    Lexikln analza

  • Regulrn definiceletter-> [A-Za-z]digit-> [0-9]id-> letter (letter | digit)*Pouit: konstruktory lex. analyztor

    Lexikln analza

  • Konen automaty(Q, , f, q0, F)Q konen mnoina stav - vstupn abecedaf pechodov funkceq0 poten stavF mnoina koncovch stavf: Q x ( {e}) -> 2Q rozen NKAf: Q x -> QDKA

    Lexikln analza

  • Konen automatydestkov sloestnctkov slo

    Lexikln analza

  • Konen automatyNKA

    Lexikln analza

  • Konen automatydeterministick konen automat

    Lexikln analza

  • Algoritmy pro transformaciReg. gramatika konen automatkorespondence pravidel gramatiky a pechodov funkceReg. vraz konen automatskldn primitivnch KA, pevod na DKA, minimalizacestromov reprezentacedleit pro konstruktory lex. analyztor

    Lexikln analza

  • Algoritmy pro transformaciKonen automat reg. vrazsoustava algebraickch rovnicX = a X + b X = a* bderivace reg. vrazu

    Lexikln analza

  • Konen automatpro lexikln analzuZpracovn zan vdy prvnm dosud nezpracovanm znakem ze vstupuZpracovn kon, je-li automat v koncovm stavu a pro dal vstupn znak ji neexistuje dn pechod (maximal match): 123 nen 12 nsledovan 3Nen-li v nekoncovm stavu pechod mon, vrac se automat do poslednho dosaenho koncovho stavu nebo je chyba: <
  • Speciln ppadyakce po pijet symbolusamostatn koncov stav pro kadou kategoriivpoet hodnot atribut z lexmuklov slovakoncov stav pro kad klov slovo mnoho stavobvykle jako id, pak nsleduje rozlien tabulkou kl. slov

    Lexikln analza

  • Speciln ppadykomente uzaven cesta prochzejc po. stavem diagnostika neukonen koment dokumentan koment Javadoc zanoen komenteznakov etzce escape sekvence \n ukonen dku v etzci je obvykle chyba Unicode

    Lexikln analza

  • Implementace lexiklnho analyztoruPm Efektivita na kor sloitosti nvrhu Stav je reprezentovn pozic v programu

    Simulace konenho automatu Vhodn sp pro konstruktory

    Vyuit konstruktoru Snadn modifikovatelnost Pedevm v potench fzch implementace

    Lexikln analza

  • Pm implementacechar text[256];int leng, ival;

    int lex(void) { int ch;

    START: while((ch=getchar())== ) ; /* odstrann mezer */

    Lexikln analza

  • Pm implementace if( isalpha(ch) ) { leng = 0; do { text[leng++] = ch; } while( isalnum(ch=getchar()) ); text[leng] = \0; ungetc(ch,stdin); return(IDENT); }

    Lexikln analza

  • Pm implementace else if( isdigit(ch) ) { ival = 0; do { ival = 10*ival+(ch-0); } while( isdigit(ch=getchar()) ); ungetc(ch,stdin); return(NUM); }

    Lexikln analza

  • Pm implementace else if (ch=={) { while( (ch=getchar())!=} && ch!=EOF); if( ch==EOF ) { error(Missing end of comment); return(EOF); } goto START; } else return(ch); /* ostatn znaky */}

    Lexikln analza

  • Pm implementacegetchar()te znaky ze vstupuudruje aktuln slo dkukopie zdrojovho textu do protokolusprva vyrovnvacch pamtmakrogenertor (nap. C, C++)ungetc()vrac zpt jeden nebo vce znakJava: java.io.PushbackInputStream

    Lexikln analza

  • Implementace konenho automatuTabulka + Pechodov funkce + Interpretvhodn jako vstup konstruktoru

    Pm pepis do programu

    Lexikln analza

  • Implementace konenho automatustatic int state;

    int next(int newstate) { state = newstate; return getchar();}

    int lex(void) { int ch = next(0);

    Lexikln analza

  • Implementace konenho automatu for(;;) switch(state) { case 0: if (ch== ) ch = next(0); else if( isalpha(ch) ) { leng = 0; text[leng]=ch; ch = next(1); }

    Lexikln analza

  • Implementace konenho automatu /* case 0: */ else if (isdigit(ch)) { ival = ch-0; ch = next(2); } else if (ch=={) ch = next(3); else return(ch); break;

    Lexikln analza

  • Implementace konenho automatu case 1: if (isalnum(ch)) { text[++leng] = ch; ch = next(1); } else { text[++leng] = \0; unget(ch,stdin); return(IDENT); } break;

    Lexikln analza

  • Implementace konenho automatu

    Lexikln analza

  • Implementace konenho automatu case 3: if (ch==EOF) { error(Missing end of comment); return(EOF); } else if (ch==}) ch = next(0); else ch = next(3); break; }}

    Lexikln analza

  • Konstruktor LEX / FLEX%{#include #define IDENT 256#define NUM 257int yyival;%}

    Lexikln analza

  • Konstruktor LEX / FLEXspace[ \t\n]ws{space}+|\{[^}]*\}letter[A-Za-z]digit[0-9]id{letter}({letter}|{digit})*number{digit}+%%

    Lexikln analza

  • Konstruktor LEX / FLEX{ws}{/* no action, no return */}{id}return(IDENT);{number}{ yyival=atoi(yytext); return(NUM); }.return(yytext[0]);

    Lexikln analza

    M. Bene, D. Kol: Lexikln analza