L E X

38
L E X L E X Generator analizatorów Generator analizatorów leksykalnych leksykalnych

description

L E X. Generator analizatorów leksykalnych. GENERATOR L E X. Zadaniem generatora LEX jest wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w języku C; Kod źródłowy generowany jest przez LEX’a w oparciu o plik zawierający wszystkie reguły przetwarzania; - PowerPoint PPT Presentation

Transcript of L E X

Page 1: L E X

L E XL E X

Generator analizatorów Generator analizatorów leksykalnychleksykalnych

Page 2: L E X

GENERATOR GENERATOR L E XL E X

Zadaniem generatora LEX jest Zadaniem generatora LEX jest wygenerowanie kodu źródłowego wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w analizatora leksykalnego (domyślnie) w języku C;języku C;

Kod źródłowy generowany jest przez Kod źródłowy generowany jest przez LEX’a w oparciu o plik zawierający LEX’a w oparciu o plik zawierający wszystkie reguły przetwarzania;wszystkie reguły przetwarzania;

Plik z regułami tworzony jest przez Plik z regułami tworzony jest przez samego użytkownika;samego użytkownika;

2

Page 3: L E X

GENERATOR GENERATOR L E XL E X

Schemat organizacji działania LEX’a:Schemat organizacji działania LEX’a:

scan.l

scan.c

scane.exe

plik.txt

WYNIK

G C C

L E X

3

Page 4: L E X

GENERATOR GENERATOR L E XL E X

flex –l scan.l flex –l scan.l (użycie generatora (użycie generatora LEX) LEX)

gcc scan.c -o scan.exe gcc scan.c -o scan.exe (kompilacja(kompilacja

C++)C++)

scan.exe < plik.txt scan.exe < plik.txt (analiza plik.txt)(analiza plik.txt)

4

Page 5: L E X

GENERATOR GENERATOR L E XL E X

Ważną cechą analizatora jest możliwość Ważną cechą analizatora jest możliwość wykorzystania go do większych aplikacji;wykorzystania go do większych aplikacji;

Każdy wygenerowany kod źródłowy Każdy wygenerowany kod źródłowy zawiera bowiem funkcję, dzięki której zawiera bowiem funkcję, dzięki której można podłączyć analizator leksykalny do można podłączyć analizator leksykalny do innych aplikacji. Funkcja o której mowa to innych aplikacji. Funkcja o której mowa to yylex()yylex();;

5

Page 6: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Każdy plik ze specyfikacją dla programu Każdy plik ze specyfikacją dla programu LEX powinien składać się z trzech sekcji;LEX powinien składać się z trzech sekcji;

Pierwsza sekcja to Pierwsza sekcja to sekcja definicjisekcja definicji;;

W sekcji definicji umieszczamy, jak sama W sekcji definicji umieszczamy, jak sama nazwa wskazuje, definicje i deklaracje nazwa wskazuje, definicje i deklaracje zmiennych, stałych, deklaracje stanów zmiennych, stałych, deklaracje stanów oraz makra procesora;oraz makra procesora;

6

Page 7: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Sekcja definicji może zawierać fragment Sekcja definicji może zawierać fragment kodu, który system przepisze kodu, który system przepisze bezpośrednio do analizatora leksykalnego;bezpośrednio do analizatora leksykalnego;

Kod ten musi być odpowiednio Kod ten musi być odpowiednio „opakowany”;„opakowany”;

Otwarcie fragmentu bezpośrednio Otwarcie fragmentu bezpośrednio przepisywanego do analizatora powinno przepisywanego do analizatora powinno być poprzedzone znacznikiem być poprzedzone znacznikiem %{%{, , natomiast jej zamknięcie natomiast jej zamknięcie %}%};;

7

Page 8: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Przykład budowy sekcji definicji:Przykład budowy sekcji definicji:

%{%{

#include<iostream.h>#include<iostream.h>

int zmienna;int zmienna;

int yylex();int yylex();

int zmienna_druga=1;int zmienna_druga=1;

%}%}8

Page 9: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Druga sekcja to Druga sekcja to sekcja przetwarzaniasekcja przetwarzania;;

W sekcji przetwarzania umieszczamy W sekcji przetwarzania umieszczamy wszelkie reguły postępowania, zgodnie z wszelkie reguły postępowania, zgodnie z którymi wygenerowany będzie analizator;którymi wygenerowany będzie analizator;

Reguły postępowania to inaczej przepisy Reguły postępowania to inaczej przepisy na to co analizator ma zrobić gdy na to co analizator ma zrobić gdy napotyka na określony „problem” (symbol);napotyka na określony „problem” (symbol);

9

Page 10: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Budowa reguły przetwarzania opiera się Budowa reguły przetwarzania opiera się na dwóch zasadniczych częściach: na dwóch zasadniczych częściach: wzorcawzorca i i operacjioperacji;;Jej budowa wygląda więc:Jej budowa wygląda więc:

wzorzecwzorzec operacjaoperacja

Wzorzec jest zapisywany jako wyrażenie Wzorzec jest zapisywany jako wyrażenie regularne;regularne;Operacja jest blokiem instrukcji języka C;Operacja jest blokiem instrukcji języka C;

10

Page 11: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Przykład budowy reguły przetwarzania:Przykład budowy reguły przetwarzania:

(a+b)*a(a+b)(a+b)*a(a+b)22 cout<<‘’W cout<<‘’W s słłowie A owie A trzecitrzeci

symbol od kosymbol od końńcaca

jest równy a’’;jest równy a’’;

11

Page 12: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

Podamy teraz kilka symboli używanych Podamy teraz kilka symboli używanych do zapisu wyrażeń regularnych do zapisu wyrażeń regularnych występujących we wzorcach reguł występujących we wzorcach reguł przetwarzania:przetwarzania:

1.1. Symbole linii:Symbole linii:^…^…-- początek linii;początek linii;……$ - koniec linii;$ - koniec linii;

12

Page 13: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

2.2. Symbole operacji logicznych:Symbole operacji logicznych:

ab - konkatenacja;ab - konkatenacja;

a|b - alternatywa;a|b - alternatywa;

a* - domknięcie zwrotne (domknięcie);a* - domknięcie zwrotne (domknięcie);

a+ - domknięcie dodatnie (domknięcie po a+ - domknięcie dodatnie (domknięcie po odjęciu słowa pustego);odjęciu słowa pustego);

a? – opcjonalność (symbol „a” nie występuje a? – opcjonalność (symbol „a” nie występuje lub występuje jeden raz); lub występuje jeden raz);

13

Page 14: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

3.3. Powtarzanie symbolu:Powtarzanie symbolu:

a{n} – powtórzenie symbolu „a” n – razy;a{n} – powtórzenie symbolu „a” n – razy;

a{n,m} – zakres powtarzania symbolu (czyli a{n,m} – zakres powtarzania symbolu (czyli a ann,…,a,…,amm););

() – określają stopień ważności (c(a|d)|(e+) () – określają stopień ważności (c(a|d)|(e+) ););

14

Page 15: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

4.4. Klasy znaków:Klasy znaków:

[a-z] - oznacza dowolny znak z zakresu od [a-z] - oznacza dowolny znak z zakresu od małej litery „a” do małej litery „z”;małej litery „a” do małej litery „z”;

[^a-z] – oznacza dowolny znak spoza klasy [^a-z] – oznacza dowolny znak spoza klasy [a-z] (jak gdyby „negacja” zakresu);[a-z] (jak gdyby „negacja” zakresu);

[a-zXY] – oznacza dowolny znak z zakresu [a-zXY] – oznacza dowolny znak z zakresu [a-z] lub wielką literę X lub Y;[a-z] lub wielką literę X lub Y;

[0-9] – oznacza dowolną cyfrę od 0 do 9;[0-9] – oznacza dowolną cyfrę od 0 do 9;

Page 16: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

4.4. Klasy znaków (c.d.):Klasy znaków (c.d.):

. - oznacza dowolny znak nie będący . - oznacza dowolny znak nie będący znakiem końca linii;znakiem końca linii;

\... – poprzedza sekwencje specjalne \... – poprzedza sekwencje specjalne (podobnie jak w C) np.:(podobnie jak w C) np.:

\n – oznacza znak końca linii; \n – oznacza znak końca linii;

\t – oznacza znak tabulatora;\t – oznacza znak tabulatora;

16

Page 17: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁPrzykład budowy reguły przetwarzania:Przykład budowy reguły przetwarzania:

(a+b)*a(a+b)(a+b)*a(a+b)22 cout<<‘’W cout<<‘’W s słłowie A trzeciowie A trzeci

symbol od kosymbol od końńcaca

jest równy a’’;jest równy a’’;

17

(a(a||b)*a(ab)*a(a||b)b){2}{2} cout<<‘’W cout<<‘’W s słłowie A trzeci owie A trzeci symbol od symbol od kokońńcaca jest jest równy a’’;równy a’’;

Powinniśmy wpisać:Powinniśmy wpisać:

Page 18: L E X

WYRAŻENIA REGULARNEWYRAŻENIA REGULARNE

Inne ważne zasady tworzenia wzorców:Inne ważne zasady tworzenia wzorców:

Wzorce zawierające spacje ujmuje się w Wzorce zawierające spacje ujmuje się w cudzysłów;cudzysłów;

Komentarz wpisuje się między Komentarz wpisuje się między znaczniki /* a */;znaczniki /* a */;

Niedopasowane znaki są przepisywane Niedopasowane znaki są przepisywane na wyjście;na wyjście;

18

Page 19: L E X

PrzykładPrzykład

Wyrażenie regularne akceptujące adres strony Wyrażenie regularne akceptujące adres strony internetowej:internetowej:

[Ww]{3} \. [A-Za-z0-9._-]+ \. [A-Za-z]{3} \. [Pp] [Ll][Ww]{3} \. [A-Za-z0-9._-]+ \. [A-Za-z]{3} \. [Pp] [Ll]

19

Page 20: L E X

PrzykładPrzykład

Wyrażenie regularne akceptujące słowa Wyrażenie regularne akceptujące słowa kluczowe w Adzie begin i end:kluczowe w Adzie begin i end:

[[Bb][Ee][Gg][Ii][Nn] | [Ee][Nn][Dd]Bb][Ee][Gg][Ii][Nn] | [Ee][Nn][Dd]20

[[A-Za-z]{3,5}A-Za-z]{3,5}

[[A-Za-z]{5} | [A-Za-z]{3}A-Za-z]{5} | [A-Za-z]{3}

Page 21: L E X

PrzykładPrzykład

Wyrażenie regularne akceptujące wszelkie Wyrażenie regularne akceptujące wszelkie identyfikatory (zmienne, stałe ) w C:identyfikatory (zmienne, stałe ) w C:

21

[[A-Za-z _ ] [A-Za-z0-9 _ ]*A-Za-z _ ] [A-Za-z0-9 _ ]*

Page 22: L E X

PrzykładPrzykład

Wyrażenie regularne akceptujące datę:Wyrażenie regularne akceptujące datę:

(([[0-9]{2} (\- | \.) [0-9]{2} (\- | \.) [0-9]{4}) | 0-9]{2} (\- | \.) [0-9]{2} (\- | \.) [0-9]{4}) | (([[0-9]{4} (\- | \.) [0-9]{2} (\- | \.) [0-9]{2})0-9]{4} (\- | \.) [0-9]{2} (\- | \.) [0-9]{2}) 22

(([[0-9]{2} \- [0-9]{2} \- [0-9]{4}) | 0-9]{2} \- [0-9]{2} \- [0-9]{4}) |

(([[0-9]{4} \. [0-9]{2} \. [0-9]{2})0-9]{4} \. [0-9]{2} \. [0-9]{2})

(([[0-9]{2} \. [0-9]{2} \. [0-9]{4}) |0-9]{2} \. [0-9]{2} \. [0-9]{4}) |

(([[0-9]{4} \- [0-9]{2} \- [0-9]{2}) | 0-9]{4} \- [0-9]{2} \- [0-9]{2}) |

Page 23: L E X

PrzykładPrzykład

Wyrażenie regularne akceptujące wszelkie Wyrażenie regularne akceptujące wszelkie adresy poczty e-mail:adresy poczty e-mail:

23

[[A-Za-z0-9 . _ -]+@[A-Za-z0-9 . _ ]+\.[A-Za-z]{2,4}A-Za-z0-9 . _ -]+@[A-Za-z0-9 . _ ]+\.[A-Za-z]{2,4}

Page 24: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Trzecią sekcją składową pliku ze Trzecią sekcją składową pliku ze specyfikacją dla programu LEX jest specyfikacją dla programu LEX jest sekcja sekcja podprogramówpodprogramów;;

W skład sekcji podprogramów mogą, jak W skład sekcji podprogramów mogą, jak sama nazwa wskazuje, wchodzić definicje sama nazwa wskazuje, wchodzić definicje funkcje, które będą następnie funkcje, które będą następnie wykorzystywane przez analizator wykorzystywane przez analizator leksykalny;leksykalny;

24

Page 25: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Deklaracja funkcji wchodzących w skład Deklaracja funkcji wchodzących w skład tej sekcji poddana jest regułą tworzenia tej sekcji poddana jest regułą tworzenia funkcji w języku C;funkcji w języku C;

Funkcja Funkcja yywrap()yywrap() –– jest to funkcja o jest to funkcja o specjalnym znaczeniu. Gdy wywołujemy specjalnym znaczeniu. Gdy wywołujemy (uprzednio wygenerowany) analizator (uprzednio wygenerowany) analizator leksykalny, funkcja yywrap() jest leksykalny, funkcja yywrap() jest wykonywana zawsze po przetworzeniu wykonywana zawsze po przetworzeniu danych wejściowych;danych wejściowych;

25

Page 26: L E X

PrzykładPrzykład

Przykład funkcji znajdującej się w sekcji Przykład funkcji znajdującej się w sekcji podprogramów:podprogramów:

int main()int main(){{return yylex();return yylex();}}

Wymaga ona oczywiście wcześniejszej Wymaga ona oczywiście wcześniejszej deklaracji yylex’a w postaci zwrotu:deklaracji yylex’a w postaci zwrotu:

int yylex();int yylex();

26

Page 27: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Przy tworzeniu pliku reguł przetwarzania Przy tworzeniu pliku reguł przetwarzania można korzystać z zmiennych globalnych;można korzystać z zmiennych globalnych;

Deklaracja tego typu zmiennych znajduje Deklaracja tego typu zmiennych znajduje się w pierwszej sekcji (sekcji definicji) się w pierwszej sekcji (sekcji definicji) pliku;pliku;

Zmienne globalne, mogą być oczywiście Zmienne globalne, mogą być oczywiście wykorzystywane w każdej następnej wykorzystywane w każdej następnej sekcji, np. inkrementowane, zmieniane, sekcji, np. inkrementowane, zmieniane, czy odczytywane;czy odczytywane;

27

Page 28: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Oprócz zmiennych globalnych można także Oprócz zmiennych globalnych można także korzystać ze zmiennych wbudowanych;korzystać ze zmiennych wbudowanych;

Mamy dwie szczególnie ważne zmienne Mamy dwie szczególnie ważne zmienne wbudowane wbudowane yyleng yyleng ii yytext yytext;;

Zmienna yyleng jest typu int i okresla długość Zmienna yyleng jest typu int i okresla długość dopasowania;dopasowania;

Zmienna yytext jest znakiem (char) a dokładniej Zmienna yytext jest znakiem (char) a dokładniej ciągiem znaków, wskazuje na leskem (odnajduje ciągiem znaków, wskazuje na leskem (odnajduje w strumieniu danych wejściowych, zapis który w strumieniu danych wejściowych, zapis który pasował do wzorca);pasował do wzorca);

28

Page 29: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Pożyteczną rolę odgrywają także Pożyteczną rolę odgrywają także definicje definicje regularneregularne;;

Tworzenie definicji regularnej to inaczej Tworzenie definicji regularnej to inaczej przypisanie wyrażeniu regularnemu przypisanie wyrażeniu regularnemu pewnego identyfikatora;pewnego identyfikatora;

Identyfikator ten może być wykorzystany Identyfikator ten może być wykorzystany później w polu wzorca;później w polu wzorca;

Definicja regularna jest tworzona w sekcji Definicja regularna jest tworzona w sekcji definicji;definicji;

29

Page 30: L E X

Przykład Przykład

Definicje regularną umieszczamy co Definicje regularną umieszczamy co prawda w sekcji definicji, jednakże po prawda w sekcji definicji, jednakże po bloku bezpośrednio przepisywanym do bloku bezpośrednio przepisywanym do analizatora;analizatora;

Zobaczmy następujący przykład, który Zobaczmy następujący przykład, który pokazuje sposób korzystania z pokazuje sposób korzystania z zadeklarowanego identyfikatora;zadeklarowanego identyfikatora;

30

Page 31: L E X

PrzykładPrzykład

%{%{

#include<iostream.h>#include<iostream.h>

int yylex();int yylex();

%}%}

identyfikator [Ii] [Ff]identyfikator [Ii] [Ff]

%%%%

{identyfikator} {cout<<‘’ Wczytano leksem IF’’;}{identyfikator} {cout<<‘’ Wczytano leksem IF’’;}

%%%%31

Page 32: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

Wszystkie trzy omówione sekcje składowe Wszystkie trzy omówione sekcje składowe pliku ze specyfikacją dla programu LEX pliku ze specyfikacją dla programu LEX oddzielane są podwójnym znakiem oddzielane są podwójnym znakiem procenta - procenta - %%%%;;

Schemat pliku ze specyfikacją reguł dla Schemat pliku ze specyfikacją reguł dla programu LEX możemy więc programu LEX możemy więc zademonstrować w tabeli:zademonstrować w tabeli:

32

Page 33: L E X

TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ

......

SEKCJA DEFINICJI

%%

SEKCJA REGUŁ PRZETWARZANIA

%%

SEKCJA PODPROGRAMÓW

33

Page 34: L E X

NIEJEDNOZNACZNOŚĆNIEJEDNOZNACZNOŚĆ

Gdy przeanalizowaliśmy już zasadę Gdy przeanalizowaliśmy już zasadę działania generatora LEX, możemy działania generatora LEX, możemy przyjrzeć się istotnemu problemowi przyjrzeć się istotnemu problemowi niejednoznaczności przy działaniu LEX;niejednoznaczności przy działaniu LEX;Przykład:Przykład:

m* {cout<<‘’*’’;} m* {cout<<‘’*’’;} mmm {cout<<‘’+’’;}mmm {cout<<‘’+’’;}

Dostarczamy strumień danych postaci: Dostarczamy strumień danych postaci: mmmmmmmmmm;mmmmmmmmmmmmm;mmm

34

Page 35: L E X

NIEJEDNOZNACZNOŚĆNIEJEDNOZNACZNOŚĆZASADA NAJDŁUŻSZEGO ZASADA NAJDŁUŻSZEGO DOPASOWANIADOPASOWANIA – określa, iż jeśli mamy – określa, iż jeśli mamy dwie lub więcej reguł dla których wzorce dwie lub więcej reguł dla których wzorce są spełnione, to wybierana jest ta reguła są spełnione, to wybierana jest ta reguła dla której dopasowanie wzorca jest dla której dopasowanie wzorca jest najdłuższe;najdłuższe;

ZASADA WCZEŚNIEJSZEGO ZASADA WCZEŚNIEJSZEGO DOPASOWANIA DOPASOWANIA – mówi iż, gdy – mówi iż, gdy dopasowania maja identyczną długość, dopasowania maja identyczną długość, wybrana jest reguła, która została wybrana jest reguła, która została umieszczona pierwsza w pliku umieszczona pierwsza w pliku specyfikacji;specyfikacji; 35

Page 36: L E X

NIEJEDNOZNACZNOŚĆNIEJEDNOZNACZNOŚĆ

Stosując zatem zasadę pierwszą w Stosując zatem zasadę pierwszą w przykładzie, dane wyjściowe będą przykładzie, dane wyjściowe będą wyglądały:wyglądały:

*;+*;+

Gdybyśmy zaś mieli dane wejściowe Gdybyśmy zaś mieli dane wejściowe postaci postaci

mmmmmm

to stosując drugą zasadę dostaniemy na to stosując drugą zasadę dostaniemy na wyjściuwyjściu

++ 36

Page 37: L E X

RETRAKCJARETRAKCJA

Pojęcie Pojęcie retrakcjiretrakcji wiąże się ze sposobem wiąże się ze sposobem działania analizatora;działania analizatora;Analizator przetwarza wiele wzorców Analizator przetwarza wiele wzorców równolegle w poszukiwaniu najlepszego równolegle w poszukiwaniu najlepszego (tzn. najdłuższego) . Porzuca on z czasem (tzn. najdłuższego) . Porzuca on z czasem wzorce mniej „obiecujące” koncentrując wzorce mniej „obiecujące” koncentrując się na wzorcach, które mogą dać dłuższe się na wzorcach, które mogą dać dłuższe dopasowania;dopasowania;W sytuacji niepowodzenia wraca do W sytuacji niepowodzenia wraca do porzuconych wzorcówporzuconych wzorców;...;...

37

Page 38: L E X

KONIECKONIEC

KONIEC WYKŁADU TRZECIEGOKONIEC WYKŁADU TRZECIEGO