L E X
description
Transcript of L E X
L E XL E X
Generator analizatorów Generator analizatorów leksykalnychleksykalnych
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
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
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
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
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
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
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
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
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
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
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
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
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
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;
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
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ć:
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
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
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}
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 _ ]*
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}) |
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}
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
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
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
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
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
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
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
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
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
TWORZENIE PLIKU REGUŁTWORZENIE PLIKU REGUŁ
......
SEKCJA DEFINICJI
%%
SEKCJA REGUŁ PRZETWARZANIA
%%
SEKCJA PODPROGRAMÓW
33
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
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
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
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
KONIECKONIEC
KONIEC WYKŁADU TRZECIEGOKONIEC WYKŁADU TRZECIEGO