Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Lexikální analýza Miroslav Beneš Dušan Kolář. Lexikální analýza2 Rozhraní lexikálního analyzátoru.

Podobné prezentace


Prezentace na téma: "Lexikální analýza Miroslav Beneš Dušan Kolář. Lexikální analýza2 Rozhraní lexikálního analyzátoru."— Transkript prezentace:

1 Lexikální analýza Miroslav Beneš Dušan Kolář

2 Lexikální analýza2 Rozhraní lexikálního analyzátoru

3 Lexikální analýza3 Ú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 Zobrazení protokolu o překladu

4 Lexikální analýza4 Proč řešit lexikální analýzu samostatně? Jednodušší návrh překladače Konvence pro mezery a poznámky Vyšší efektivita Specializované algoritmy Lepší přenositelnost Zvláštnosti vstupní abecedy??( = [

5 Lexikální analýza5 Základní pojmy Lexém – slovo nad abecedou Kategorie symbolů – identifikátor, číslo, relační operátor, levá závorka,... Atributy symbolu – řetězec, hodnota, kód operátoru,... Reprezentace symbolu – dvojice (kategorie, atribut)

6 Lexikální analýza6 Příklady lexikálních symbolů

7 Lexikální analýza7 Reprezentace symbolů // kategorie symbolů enum Symbol { IdSym, NumSym, RelOpSym, DotSym,... }; // kategorie operátorů enum Oper { LthOp, GthOp, LeqOp,... }; // atributy symbolů union LexAttr { char* id; int num; Oper relop;... }; // reprezentace lexikálního symbolu struct Token { Symbol sym; // kategorie LexAttr attr; // atribut };

8 Lexikální analýza8 Problémy se zdrojovým jazykem Pevný/volný formát(FORTRAN) 12 X=7 * +12*K C poznámka Zpracování mezer (FORTRAN, Basic) DO5I=1.25 / DO5I=1,25 Klíčová slova (PL/I) IF THEN THEN THEN=ELSE; ELSE ELSE=THEN

9 Lexikální analýza9 Příklad 1 INTEGER FUNCTIONA 2 PARAMETER(A=6,B=2) 3 IMPLICIT CHARACTER*(A-B)(A-B) 4 INTEGER FORMAT(10),IF(10),DO9E FORMAT(4H)=(3) FORMAT(4 )=(3) 7 DO9E1=1 8 DO9E1=1,2 9 IF(X)=1...

10 Lexikální analýza10 Příklad (pokr.) 10 IF(X)H=1 11 IF(X)300, CONTINUE 13 END C this is a comment $FILE(1) 14 END

11 Lexikální analýza11 Specifikace symbolů Popis běžným jazykem ‘identifikátor je posloupnost písmen a číslic začínající písmenem’ Regulární (lineární) gramatika I ->p X X ->p X | c X | p | c Regulární výrazy a definice p (p | c)*

12 Lexikální analýza12 Specifikace symbolů Graf přechodů konečného automatu (syntaktický graf)

13 Lexikální analýza13 Specifikace symbolů Lexikální symboly lze obvykle popsat regulárními jazyky (typ 3) Co nedokážeme popsat? Zanořené konstrukce (závorky) Opakované konstrukce {wcw|w  {a,b}*} Zadaný počet opakování nHa 1 a 2 …a n (FORTRAN)

14 Lexikální analýza14 Regulární výrazy nad  RE  označuje {  }(prázdný řetězec) Je-li a , pak a označuje {a} Je-li a,b,c,… , pak [abc…] označuje množinu {a, b, c, …} [aeiouy] [a-zA-Z] [^0-9] – všechno kromě [0-9]

15 Lexikální analýza15 Regulární výrazy Jsou-li s, t reg. výrazy označující 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)

16 Lexikální analýza16 Příklad [A-Z]([A-Z]|[0-9])*  [A-Z][A-Z0-9]* [0-9]+.[0-9]+(E[-+]?[0-9]+)? |[0-9]+E[-+]?[0-9]+

17 Lexikální analýza17 Regulární definice Pojmenované regulární výrazy d 1 ->r 1 d 2 ->r 2... d n ->r n různáreg. výrazy nad jména   {d 1, d 2,…, d i-1 }

18 Lexikální analýza18 Regulární definice letter-> [A-Za-z] digit-> [0-9] id-> letter (letter | digit)* Použití: konstruktory lex. analyzátorů

19 Lexikální analýza19 Konečné automaty (Q, , f, q 0, F) Q – konečná množina stavů  - vstupní abeceda f – přechodová funkce q 0 – počáteční stav F – množina koncových stavů f: Q x (   {e}) -> 2 Q rozšířený NKA f: Q x  -> QDKA

20 Lexikální analýza20 Konečné automaty desítkové číslo šestnáctkové číslo

21 Lexikální analýza21 Konečné automaty NKA

22 Lexikální analýza22 Konečné automaty deterministický konečný automat

23 Lexikální analýza23 Algoritmy pro transformaci Reg. gramatika ↔ konečný automat korespondence pravidel gramatiky a přechodové funkce Reg. výraz → konečný automat skládání primitivních KA, převod na DKA, minimalizace stromová reprezentace důležité pro konstruktory lex. analyzátorů

24 Lexikální analýza24 Algoritmy pro transformaci Konečný automat → reg. výraz soustava algebraických rovnic X = a X + b  X = a* b derivace reg. výrazu

25 Lexikální analýza25 Konečný automat pro lexikální analýzu Zpracování začíná vždy prvním dosud nezpracovaným znakem ze vstupu Zpracování končí, je-li automat v koncovém stavu a pro další vstupní znak již neexistuje žádný přechod (maximal match): 123 není 12 následované 3 Není-li v nekoncovém stavu přechod možný, vrací se automat do posledního dosaženého koncového stavu nebo je chyba: < <= <<

26 Lexikální analýza26 Speciální případy akce po přijetí symbolu samostatný koncový stav pro každou kategorii výpočet hodnot atributů z lexému klíčová slova koncový stav pro každé klíčové slovo – mnoho stavů obvykle jako id, pak následuje rozlišení tabulkou klíč. slov

27 Lexikální analýza27 Speciální případy komentáře uzavřená cesta procházející poč. stavem diagnostika – neukončený komentář dokumentační komentář – Javadoc zanořené komentáře znakové řetězce escape sekvence ‘\n’ ukončení řádku v řetězci je obvykle chyba Unicode

28 Lexikální analýza28 Implementace lexikálního analyzátoru Přímá Efektivita na úkor složitosti návrhu Stav je reprezentován pozicí v programu Simulace konečného automatu Vhodné spíš pro konstruktory Využití konstruktoru Snadná modifikovatelnost Především v počátečních fázích implementace

29 Lexikální analýza29 Přímá implementace char text[256]; int leng, ival; int lex(void) { int ch; START: while((ch=getchar())==‘ ‘) ; /* odstranění mezer */

30 Lexikální analýza30 Přímá implementace if( isalpha(ch) ) { leng = 0; do { text[leng++] = ch; } while( isalnum(ch=getchar()) ); text[leng] = ‘\0’; ungetc(ch,stdin); return(IDENT); }

31 Lexikální analýza31 Přímá implementace else if( isdigit(ch) ) { ival = 0; do { ival = 10*ival+(ch-’0’); } while( isdigit(ch=getchar()) ); ungetc(ch,stdin); return(NUM); }

32 Lexikální analýza32 Přímá 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 */ }

33 Lexikální analýza33 Přímá implementace getchar() čte znaky ze vstupu udržuje aktuální číslo řádku kopie zdrojového textu do protokolu správa vyrovnávacích pamětí makrogenerátor (např. C, C++) ungetc() vrací zpět jeden nebo více znaků Java: java.io.PushbackInputStream

34 Lexikální analýza34 Implementace konečného automatu Tabulka + Přechodová funkce + Interpret výhodné jako výstup konstruktoru Přímý přepis do programu

35 Lexikální analýza35 Implementace konečného automatu static int state; int next(int newstate) { state = newstate; return getchar(); } int lex(void) { int ch = next(0);

36 Lexikální analýza36 Implementace konečného automatu for(;;) switch(state) { case 0: if (ch==‘ ‘) ch = next(0); else if( isalpha(ch) ) { leng = 0; text[leng]=ch; ch = next(1); }

37 Lexikální analýza37 Implementace konečného automatu /* case 0: */ else if (isdigit(ch)) { ival = ch-’0’; ch = next(2); } else if (ch==‘{‘) ch = next(3); else return(ch); break;

38 Lexikální analýza38 Implementace konečného automatu case 1: if (isalnum(ch)) { text[++leng] = ch; ch = next(1); } else { text[++leng] = ‘\0’; unget(ch,stdin); return(IDENT); } break;

39 Lexikální analýza39 Implementace konečného automatu

40 Lexikální analýza40 Implementace konečného automatu case 3: if (ch==EOF) { error(“Missing end of comment”); return(EOF); } else if (ch==‘}‘) ch = next(0); else ch = next(3); break; }

41 Lexikální analýza41 Konstruktor LEX / FLEX %{ #include #define IDENT 256 #define NUM 257 int yyival; %}

42 Lexikální analýza42 Konstruktor LEX / FLEX space[ \t\n] ws{space}+|\{[^}]*\} letter[A-Za-z] digit[0-9] id{letter}({letter}|{digit})* number{digit}+ %

43 Lexikální analýza43 Konstruktor LEX / FLEX {ws}{/* no action, no return */} {id}return(IDENT); {number}{ yyival=atoi(yytext); return(NUM); }.return(yytext[0]);


Stáhnout ppt "Lexikální analýza Miroslav Beneš Dušan Kolář. Lexikální analýza2 Rozhraní lexikálního analyzátoru."

Podobné prezentace


Reklamy Google